PayPal サブスクリプションの支払い IPN 処理についてアドバイスが必要です。PayPal コード サンプルに基づいて IPN ハンドラー/リスナーを作成しました。リスナーは、cmd=_notify-validate を前に付けて IPN メッセージを PayPal にコピーします。問題なくサブスクリプションをセットアップできます。つまり、ユーザーが詳細を入力すると、これが注文情報とともに PayPal に渡され、そこでアカウントにログインしてサブスクリプションに同意します。PayPal からの応答が成功すると、注文が確認され、データベースが更新されます。私が抱えている問題は、定期的な支払い通知です。PayPal サンドボックスを介して毎日サブスクリプションが発生するように設定しました。PayPal が顧客の支払い保留を通知するたびに、顧客は PayPal アカウントにログインして支払いを受け入れます。これにより、別の IPN で支払いが完了したことが確認されます。検証要求が先行する IPN メッセージをポストバックし、PayPal サンドボックスから null 応答を受信しています。PayPal のドキュメントにあるように、「VERIFIED」または「INVALID」を受け取ることを期待していますか? しかし、返されたメッセージに対する PayPal の応答は「」または null? IPN 検証コードは次のようになり、「<a href="https://www.sandbox.paypal.com/cgi-bin/webscr" rel="nofollow">https://www.sandbox.paypal.com を使用します。 /cgi-bin/webscr」を URL として:
$url_parsed=parse_url($this->paypal_url);
// generate the post string from the _POST vars and load the _POST vars into an array
$post_string = "cmd=_notify-validate"; // start IPN response with validate command
foreach ($_POST as $field=>$value) {
$post_string .= '&';
$this->ipn_data["$field"] = $value;
$post_string .= $field.'='.urlencode(stripslashes($value));
}
// open the connection to PayPal
$fp = fsockopen($url_parsed[host],443,$err_num,$err_str,30);
if(!$fp) {
// could not open the connection. If logging is on, log the error message
$this->last_error = "fsockopen error no. $errnum: $errstr";
$this->log_ipn_results(false);
return false;
} else {
// Post the data back to PayPal
fputs($fp, "POST $url_parsed[path] HTTPS/1.1\r\n");
fputs($fp, "Host: $url_parsed[host]\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($post_string)."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $post_string . "\r\n\r\n");
// loop through the response from the server and append to variable
while(!feof($fp)) {
$this->ipn_response .= fgets($fp, 1024);
}
fclose($fp); // close connection
/* PayPal sends a single word back, which is VERIFIED if the message originated with PayPal
or INVALID if there is any discrepancy with what was originally sent */
if (strcmp ("INVALID", $this->ipn_response) != 0) {
// The above is a work around to address null response! For now!
// Valid IPN transaction.
$this->log_ipn_results(true);
return true;
} else {
// Invalid IPN transaction. Check the log for details.
$this->last_error = 'IPN Validation Failed.';
$this->log_ipn_results(false);
return false;
}
私はタイムアウトをテストし、プロセスが 30 秒の制限時間内に十分に収まっていると信じており、$post_string の構造が最初に cmd を使用して元のメッセージを複製することを確認しました。私が考えることができる唯一の他の問題は、IPN変数の返信投稿がSSL証明書で保護されたページから送信されることですか? いずれにせよ、何かが欠けていない限り、PayPal サンドボックスが実際に応答しているとは思わないので、結果は null ですか? サンドボックスを介してこれをテストするために、複数の毎日のサブスクリプション支払い期間に依存しているため、アドバイスやガイダンスがあれば大歓迎です.