1

PayPal IPN&PDTを実装しています。サンドボックスでの頭痛と時間の後、IPNは正常に機能し、PDTは正しい$_GETデータを返します。実装は次のとおりです。

  • フォームのユーザーIDをPayPalに渡す
  • ユーザーが製品を購入し、指定されたユーザーIDのデータベースを更新するIPNをトリガーします
  • PDTは、ユーザーがサイトに戻ったときにトランザクションIDを返します
  • リターンページに「お待ちください」と表示され、繰り返します-Ajax-トランザクションステータスを確認します
  • ユーザーは成功/失敗ページにリダイレクトされます

PDT用のPayPal対応のPHPコードを使用してPOSTを返す場合を除いて、すべてが正常に機能します。ページがハングします。ユーザーが私のサイトに戻ることはありません。失敗ステータスは表示されません。何も表示されません。面白いことに、不明なエラーが発生すると、テストドメインが短期間応答しなくなります。

コード(PHP):https ://www.paypal.com/us/cgi-bin/webscr?cmd=p/xcl/rec/pdt-code-outside

POSTをコメントアウトすると、すべて正常に機能します。コードがwhile{}ループに入ると、問題を特定することができます。残念ながら、私はPayPalコードの代わりを最初から書くのに十分な経験がないので、何が間違っているのかについてのアイデアを本当にいただければ幸いです。

POSTバックはssl://www.sandbox.paypal.comに移動し、サンドボックステストアカウントを介してすべて作成されたボタンコードと認証トークンを使用しています。

前もって感謝します。

アップデート:

問題を次の行に絞り込みました。$line = fgets($fp, 1024);

それは単にハングし、理由はわかりません。

4

1 に答える 1

1

解決済み:

cURLに切り替えると、すべての問題が解決します。誰かがこれをやって来て、私と同じように必死になっている場合のコードは次のとおりです。

// Prepare data
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = '<-- your token (sandbox or live) -->';
$req .= '&tx='.$tx_token.'&at='.$auth_token;
// Post back to PayPal to validate
$c = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); // SANDBOX
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $req);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$contents = curl_exec($c);
$response_code = curl_getinfo($c, CURLINFO_HTTP_CODE);
curl_close($c);
if(!$contents || $response_code != 200) {
   // HTTP error or bad response, do something
} else {
   // Check PayPal verification (FAIL or SUCCESS)
   $status = substr($contents, 0, 4);
   if($status == 'FAIL') {
      // Do fail stuff
   } elseif($status == 'SUCC') {
      // Do success stuff
   }
}

技術的には、substr()は「SUCCESS」ではなく「SUCC」をチェックします。ただし、可能な値は「SUCCESS」または「FAIL」のみであるため、問題ではありません。

この同じコードはIPNでも機能しますが、明らかな小さな変更が加えられています。

于 2010-05-17T18:39:27.420 に答える