2014-10-28 65 views
3

下面的一切都是在貝寶沙箱:IPN驗證返回無效的,因爲貝寶是後到IPN監聽器發送不正確的字符集

我有一個PayPal訂閱/定期付款設置,其中採用IPN偵聽器作爲最後一步在我的網站數據庫中創建或更新用戶的訂閱。但是,當我從PayPal收到POST數據並將其發回驗證時,我收到的唯一回復是「INVALID」。

我知道我的代碼正確地將POST數據發送回PayPal,因爲我通過硬編碼POST數據字符串(如所看到的「IPN Message」值)來爲我的監聽器模擬正確的POST時得到「VERIFIED」響應在PayPal的IPN歷史頁面上。

所以我的代碼將POST數據發送回PayPal進行最終驗證,我的IPN偵聽器正在接收事務的POST變量。我的IPN監聽器創建的POST數據字符串與PayPal發送的POST數據字符串以及PayPal希望接收的POST數據字符串的區別僅有一點不同。

貝寶指出,IPN偵聽器必須發回它具有相同的價值觀,才能收到貝寶發送它在POST數據和編碼。

我認爲這個問題是一個編碼的問題,因爲在貝寶POST對於我的聽衆,「charset」的值爲「windows-1252」,應該是「UTF-8」。但是,「form_charset」具有正確的「UTF-8」值。

我已在我的賣家PayPal配置文件的兩個輸入字段上將編碼設置爲UTF-8,並在名稱爲「charset」和值爲「UTF-8」的初始PayPal表單/按鈕中具有隱藏輸入。請告訴我是否有另一種方法來設置我錯過的編碼。

PayPal聲稱要發送的POST數據字符串的一部分包含「& notify_version = 3.8」,後面跟着更多變量。當我手動插入這個字符串來測試我的代碼時,「& not」在打印到頁面時被轉換爲「¬」,根據我的理解,這意味着使用的字符編碼是「windows-1252」,因爲「¬」處於windows-1252字符集,但「¬」不在UTF-8字符集中,所以如果正在使用UTF-8,則「&不是」將不會像這樣轉換。

如何讓PayPal實際將數據發送到使用UTF-8字符編碼的IPN偵聽器?請記住,這是經常性付款,因此某些方面可能會有所不同。

我不認爲這個問題是在我的最後,因爲我已經嘗試了不同的方法,對發佈的數據進行編碼/解碼的不同方式,外部庫,cUrl /套接字,不同版本的SSL,不同的頭文件,重新啓動服務器,重新購買等 因此,貝寶發送給我錯誤的POST數據或我正在形成錯誤的帖子字符串。後者是可能的,但我已經嘗試了每種可以找到的用於形成後綴字符串的方法,但都沒有成功。

我一直在這個問題上工作幾天無濟於事,所以任何幫助或指針將非常感激。

PS: 幾個音符,可能會或可能不相關:

  • 此訂閱系統中創建的,幾個月前,只停在過去幾週一些莫明其妙點工作。在那個時候AFAIK沒有改變相關的代碼。

  • 第一天我開始調試這個問題,沙箱的賣家帳戶有完全不正確的數據,當它應該是商業帳戶時,它被列爲個人帳戶,這意味着沒有IPN設置可用。第二天,同一個帳戶莫名其妙地工作,並顯示爲一個商業帳戶,因爲它應該在首位。我沒有意識到我的任何行動導致這種變化。也許PayPal發送錯誤的字符編碼是一個類似的問題? cron作業上的一些緩存系統?我只是在猜測這一點,我真的不知道。

  • 關於我的最後一點,登錄到賣家沙箱帳戶已經非常不可靠。有時我會在會話超時後嘗試重新登錄,並收到一個錯誤代碼,這在註冊新帳戶的情況下才有意義。其他時間登錄不起作用,結果是在會話超時後我嘗試登錄的一小部分時間,我必須清除我的Cookie以便重新登錄才能正常工作。

+0

你嘗試改變這裏的編碼格式在沙箱https://www.sandbox.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-language-encoding – Eshan 2014-10-29 02:32:14

+0

@Eshan是的,它不修理它。 – 2014-10-29 02:37:50

+0

當您訪問上述鏈接時,您是否點擊了「更多選項」鏈接,因爲它可以讓您選擇設置IPN的編碼嗎? – Eshan 2014-10-29 02:41:09

回答

1

該解決方案最終被同時使用一個IPN監聽器和PDT,只要確保這兩個腳本檢查,以確認該交易尚未收到,這樣交易就不會收到超過一次。

因此,只需跟蹤數據庫中的貝寶事務,並在IPN偵聽器和PDT腳本中檢查該數據庫。

+0

感謝您的回覆。我最終編碼請求到PayPal UTF-8。在Sandbox模式下,我總是收到(獲取)Windows-1252,導致請求失敗。我確實將PayPal Sandbox儀表板中的設置更改爲UTF-8 - 同樣的問題。從沙箱切換到生產模式解決了這個問題(當然在PayPal生產儀表板中有正確的UTF-8編譯設置)。在我看來,就像PayPal Sandbox沒有保存編碼設置的錯誤。這一個浪費了幾個小時。 – Sha 2015-01-15 07:03:55

2

這是一個tldr;

根據Miles的經驗,似乎PayPal Sandbox中存在一個錯誤,意味着charset設置不起作用。

我發現這個bug已經解決了。

要更改字符集在您的PayPal設置

  • 登錄到您的商家帳戶
  • 點擊個人資料
  • 在銷售首單擊語言編碼
  • 按「更多選項」按鈕

First Page - Language Encoding

  • 選擇您網站的編碼和留在使用相同的設置按鈕是

Second Page - More encoding options

  • 保存設置。