0

ウェブサイトで PayPal アダプティブ ペイメント (並行) を使用していますが、同じ送信者から 2 つの異なるブラウザー タブで 2 つの支払いを行うと奇妙な問題が発生しました。同様の質問が以前に尋ねられましたが、誰もそこに答えませんでした。

問題を再現するシナリオ

  1. ユーザーは Web サイトの最初のブラウザー タブを開き、最初の売り手への支払いプロセスを開始します。
  2. ログインボタンのあるPayPalのライトボックスが表示されます。
  3. ユーザーは Web サイトの 2 番目のブラウザー タブを開き、2番目の販売者への支払いプロセスを開始します。
  4. 再び、ログインボタンのある PyaPal のライトボックスが表示されます。
  5. ユーザーは最初のブラウザー タブに戻り、PayPal にログインします。
  6. 最初のブラウザー タブで PayPal にログインすると、ユーザーは2 番目の売り手への支払いの詳細を確認します。
  7. 2 番目のブラウザ タブで PayPal にログインすると、ユーザーは2 番目の販売者への支払いの詳細を確認できます。

PayPal アダプティブ ペイメントは、1 つの送信者からの 1 つのトランザクションのみをサポートしているようです。

使い方

ウェブサイトは Ruby on Rails で動作し、PayPal での支払いにはpaypal_adaptive gemを使用しています。支払いの流れは非常に簡単です。

  1. ユーザーが Web サイトの [購入] ボタンをクリックします。クライアントは、Ruby on Rails の支払いコントローラーによって処理される AJAX 要求を行います。
  2. コントローラーで、アプリはpaypal_adaptive gem を使用して PayPal API にPay リクエストを行い、PayKey を受け取ります (以下のコードを参照)。
  3. サーバーは PayKey でクライアントに応答し、クライアントはそれを PayPal フォームで使用して、PayPal のライトボックスを介して支払いプロセスを開始します (以下のコードを参照)。

それでおしまい。その後、私は何も制御しません (支払いプロセスは PayPal の外部 Web ページを経由します)。

その他の注意事項

  1. 上記のテスト シナリオでは、Pay リクエストのデータがサーバー側で異なると確信しています。
  2. PayPal のライトボックス以外に、PayPal のさまざまなダイアログ オプションを試しました: ミニブラウザとポップアップ。これらのオプションはこのバグには影響せず、まだ再現可能です。

クライアントコード

<script src="https://www.paypalobjects.com/js/external/dg.js" type="text/javascript"></script>

<form action="https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay" class="paypal-hidden-form" target="PPDGFrame">
  <button id="paypal-submit"></button>
  <input id="type" type="hidden" name="expType" value="light">
  <!-- Insert PayKey here and click on the form's submit button using jQuery after server's response. -->
  <input id="paypal-key" type="hidden" name="paykey" value="">
</form>

<!-- Paypal -->
<script type="text/javascript" charset="utf-8">
    var dgFlow = new PAYPAL.apps.DGFlow({ trigger: "paypal-submit", expType: "light" });
    function MyEmbeddedFlow(embeddedFlow) {
        this.embeddedPPObj = embeddedFlow;
        this.paymentSuccess = function(paymentStatus) {
            this.embeddedPPObj.closeFlow();
            // More UI code here...
        };
        this.paymentCanceled = function() {
            this.embeddedPPObj.closeFlow();
            // More UI code here...
        };
    }
    var myEmbeddedPaymentFlow = new MyEmbeddedFlow(dgFlow);
</script>

サーバーコード

# Make a Pay request to PayPal API.
paypal_payment_thread = Thread.new do
  # Some preparation code goes here...

  pay_request = PaypalAdaptive::Request.new
  process_guid = SecureRandom.uuid

  # Construct Pay API request data.
  data = {
    :returnUrl => "#{PAYPAL_RETURN_URL}?process_guid=#{process_guid}",
    :cancelUrl => "#{PAYPAL_CANCEL_URL}?process_guid=#{process_guid}",
    :requestEnvelope => {
      :errorLanguage => "en_US"
    },
    :currencyCode => "USD",
    :receiverList => {
      :receiver => [{
        # seller_paypal value is different for two payments.
        # But in fact we do the last payment for both payments.
        :email => seller_paypal,
        :amount => ORDER_SELLER_AMOUNT,
        :paymentType => "DIGITALGOODS"
      }, {
        :email => PAYPAL_MARKETPLACE_EMAIL,
        :amount => ORDER_MARKETPLACE_AMOUNT,
        :paymentType => "DIGITALGOODS"
      }]
    },
    :actionType => "PAY",
    :ipnNotificationUrl => PAYPAL_NOTIFY_URL,
    :reverseAllParallelPaymentsOnError => "true",
    :trackingId => process_guid
  }

  # Make a Pay API request.
  pay_response = pay_request.pay(data)

  if pay_response.success?
    # Everything is ok. Update database here...
  else
    raise Exceptions::PaypalPaymentError
  end
end

実際にどのように機能するかを明確にするために、重要でないコードをいくつか削除しました。

助けてくれてありがとう!

4

1 に答える 1

1

設計通りのようです。PayPal の従業員の 1 人のWeb サイトで同じテストを試しましたが、再現可能です。

PayPal のサポートは、Lightbox を使用する際の問題について回答してくれました。ただし、投稿で説明したように、Mini-Browser と Popup オプションを試しましたが、効果はありませんでした。

また、PayPal のサポートは、これは仕様によるものであると回答し、テクニカル サポートに連絡するようアドバイスしてくれました。多分それは他の誰かに役立つでしょう。

こんにちはマイケル、ありがとう、はい、私もそれを再現できました。ただし、PayPal は 2 つの支払いフローを同時に処理するように設計されていないことを理解することが重要です。さらに詳しく知りたい場合は、テクニカル サポート ( https://ppmts.custhelp.com/ ) に連絡してください。デバッグ用の他のツールがあり、技術的な問題をよりよく理解できる場合があります。

最後に、HTML5 ローカル ストレージの特別なフラグとPayPal ウィンドウを検出するオブジェクトdgFlow.isOpen()メソッドを使用して、同時支払いをブロックしました。ウィンドウを閉じると、のイベントをPAYPAL.apps.DGFlow使用してこのフラグをリセットします。onunloadonbeforeunloadwindow

この質問を閉じます。ありがとう。

于 2013-10-30T15:58:14.767 に答える