2

私は Micha の PayPal IPN スクリプトを使用していますが、ほとんどの場合うまく機能しました: https://github.com/Quixotix/PHP-PayPal-IPN

Web サイトで [今すぐ支払う] をクリックすると、正しい情報でペイパルにリダイレクトされ、支払いを行うことができますが、戻ってきても何も起こりません。つまり、ユーザーがアップグレードされません。IPN の外部でコードのスクリプトをテストしましたが、完璧に動作するので、IPN スクリプトがセッションを失っているように見えますか?

ここに私のボタンコードがあります:

<form name="_xclick" action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick">
    <input type="hidden" name="business" value="EMAIL_TO">
    <input type="hidden" name="currency_code" value="GBP">
    <input type="hidden" name="item_name" value="Text Light">
    <input type="hidden" name="amount" value="0.01">
    <input type="hidden" name="return" value="http://domain.co.uk/editors">
    <input type="hidden" name="notify_url" value="http://domain.co.uk/account/upgrade">
    <input type="submit" value="Pay now" class="btn btn-preview" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form>

したがって、通知 URL (IPN コード) は /account/upgrade です。私が知る限り、これはアップグレード タスクを実行する場所ですか? だからここに私の(取り除かれた)コードがあります

if ($verified) {

    $errmsg = '';

    // some error checking

    if (!empty($errmsg)) {

        // manually investigate errors from the fraud checking

    } else {

        // upgrade user
        $package = serialize($_SESSION['package']);
        $this->db->update('users',array('id' => $_SESSION['user']['id']),array('payment_plan' => $package));

    }

} else {

    // not verified, investigate problems
}

上記のように、'// upgrade user' の下のコードは外部では問題なく動作しますが、paypal から戻ると、明らかにセッションを保持していません。エラーをスローしているのではなく、何もしていません。

どこで間違ったのですか?セッション情報が PayPal から確実に返されるようにする方法を教えてください。

ありがとう

4

2 に答える 2

3

あなたの質問には簡単な答えがあります: IPN はユーザーとして行われません。

答えをさらに詳しく説明すると、IPN のしくみは次のとおりです。あなたが支払いを行い、訪問者があなたのサイトに戻り、PayPalがあなたの IPN URL に ping を送信します。重要な点は太字です。要求はユーザーからではなく PayPal から送信されるため、ユーザーのセッションは継承されません。

この理由は非常に単純です。IPN URL は非公開にする必要があるためです。そうしないと、あらゆる種類のばかげたごまかしを行うことができます (仮想トランザクションの作成を含む)。このため、ユーザーはこのアドレスを見ることはありません。(もう 1 つの理由は、すべてのブラウザーがリダイレクトに従うわけではないことです。IPN は常に 100% 情報を提供するように設計されています)。

これを行いたい場合は、ユーザーが誰であるかを示すパラメータを IPN リクエストに渡す必要があります。ユーザー ID を渡すのは非常に悪い考えです。変更可能なパラメータとしてです。代わりに、ユーザーに関する情報を含む何らかのトランザクション ID を生成し、これを渡します。IPN 呼び出しでは、この変数をカスタム パラメーターとして取得します。これにより、DB からデータを取得し、ユーザーが誰であるかを把握して、必要なことを行うことができます。

これが役に立ったことを願っています。

于 2012-11-28T11:26:21.947 に答える