1

これは、複数のショップが製品を販売できるようにするサイトを設計しているものです。すべての売り手は、私のサイトに仮想ストアを持っています。購入操作にpaypalを使用しています。私は顧客がペイパル アカウントを持たずにクレジット カードを使用できるようにすることを検討しました。また、アダプティブ ペイメント フローを使用して「ゲストとして購入」フローを許可しようとしています。クレジット カード データの処理や、サイトを PCI 準拠として設計する必要があることを心配したくないので、paypal のデフォルト フロー (残りの API ではありません) を使用しようとしています。

したがって、このシナリオでは、私が使用しているものは次のとおりです。

ライトボックスを使用して埋め込み支払いフローを呼び出す Web ページの設定

  • この支払いフローでは支払いキーを生成する必要があるため、次のリンクにあるコードを使用しています。

https://github.com/paypal/rest-api-sdk-dotnet/tree/master/Samples/RestApiSample

-私のMVCには、注文を生成するページがあり、ヘルパーメソッドを呼び出してペイキーを取得します。最も関連性の高いものは次のとおりです。

public static string GetPayKey(DummyPurchase purchase)
    {
        ReceiverList receiverList = new ReceiverList();
        receiverList.receiver = new List<Receiver>();
        //(Required) Amount to be paid to the receiver
        string[] amt = new string[1] { purchase.TotalPrice.ToString() };
        // Receiver's email address. This address can be unregistered with paypal.com.
        // If so, a receiver cannot claim the payment until a PayPal account is linked
        // to the email address. The PayRequest must pass either an email address or a phone number. 
        // Maximum length: 127 characters 
        string[] receiverEmail = new string[1] { purchase.StoreId.ToString() };
        string cancelUrl = ConfigurationHelper<string>.GetKeyValue(Constants.PAYPAL_CANCEL_URL);
        string returnUrl = ConfigurationHelper<string>.GetKeyValue(Constants.PAYPAL_RETURN_URL);
        string currency = ConfigurationHelper<string>.GetKeyValue(Constants.PAYPAL_CURRENCY_CODE);

        //Generate Receivers list
        for (int i = 0; i < amt.Length; i++)
        {
            Receiver rec = new Receiver(Convert.ToDecimal(amt[i]));
            if (receiverEmail[i] != string.Empty)
            {
                rec.email = receiverEmail[i];
            }

            receiverList.receiver.Add(rec);
        }

        PayRequest request = new PayRequest(new RequestEnvelope("en_US"), "PAY",
                            cancelUrl, currency,
                            receiverList, returnUrl);




        //call the service
        AdaptivePaymentsService service = null;
        PayResponse response = null;
        try
        {
            // (https://github.com/paypal/sdk-core-dotnet/wiki/SDK-Configuration-Parameters)
            Dictionary<string, string> configurationMap = GetAcctAndConfig();

            // Creating service wrapper object to make an API call and loading
            // configuration map for your credentials and endpoint
            service = new AdaptivePaymentsService(configurationMap);

            response = service.Pay(request);
        }
        catch (Exception ex)
        {
            Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex));
            return "";
        }

        Dictionary<string, string> responseValues = new Dictionary<string, string>();
        string redirectUrl = null;
        if (!(response.responseEnvelope.ack == AckCode.FAILURE) &&
            !(response.responseEnvelope.ack == AckCode.FAILUREWITHWARNING))
        {

            return response.payKey;
        }
        return "";
    }

-このキーを取得した後、このビューのモデルとして Paykey 文字列を持ち、API ガイドが指定するフォームを持つ別のビューから html を取得します。

@model string
<h2>ConfirmCheckout</h2>
<script src="https://www.paypalobjects.com/js/external/dg.js">
</script>
<form action="https://www.paypal.com/webapps/adaptivepayment/flow/pay"
target="PPDGFrame">
<input id="type" type="hidden" name="expType" value="light">
<input id="paykey" type="hidden" name="paykey" value="@Model">
<input type="submit" id="submitBtn" value="Pay with PayPal">
</form>

-ビューがレンダリングされた後、JavaScript コードを呼び出してフローを開始します。

var dgFlow = new PAYPAL.apps.DGFlow({ trigger: 'submitBtn' });

-フローは完全に機能し、このフォームに有効な支払いキーが表示されます。しかし、このボタン (paykey を使用したフォームの送信ボタン) をクリックすると、2 つの異なるエラーが発生します。これは最も頻繁なものです:

この取引はすでに承認されています。詳細については、PayPal アカウントの概要にアクセスしてください。

-しかし、「支払いセッションの有効期限が切れました」というエラーが表示されることがあります。

2 つの質問があります。

  • 誰かがこれらのエラーを修正する方法を知っていますか?
  • アダプティブペイメントのゲスト支払いフローでは、フローを開始するためにPayKeyが必要になるため、クラシックAPIを使用しています(セキュリティとPCIコンプライアンスの問題を回避するため)。同じ PayKey を取得できる Paypal REST API のメソッドが見つかりませんでした。これらのキーを取得する方法はありますか?

どうもありがとう

4

2 に答える 2

0

Payリクエストで事前承認キーを送信しているようです。その場合、PayPal へのリダイレクトは必要ありません。それが要点です...事前承認キーを介して既に承認を得ているため、事前承認キーを含​​む支払い要求を送信すると、支払いはすぐに行われます (事前承認プロファイルがまだ有効である限り)。

そのため、リダイレクトを行っているときは、何が起こったかを正確に伝えています...トランザクションはすでに処理されています. 繰り返しますが、リダイレクトは必要ありません。

要点は、アプリケーション内の事前承認プロファイルを使用して、リダイレクトまたはさらなる承認が必要なときにいつでも支払いをトリガーできることです。事前承認キーを取得したら、任意の方法で支払いをトリガーできます。たとえば、使用ごとに誰かに請求し、Web サイトにログインしたときに支払いをトリガーしたいが、毎回支払いを承認する必要はないようにしたい場合があります。支払いは、事前承認キーが含まれている Pay API を介してバックグラウンドで発生する可能性がありますが、ユーザーはまったく中断されません。

それが役立つことを願っています。

于 2013-10-31T08:44:04.367 に答える