これは、複数のショップが製品を販売できるようにするサイトを設計しているものです。すべての売り手は、私のサイトに仮想ストアを持っています。購入操作にpaypalを使用しています。私は顧客がペイパル アカウントを持たずにクレジット カードを使用できるようにすることを検討しました。また、アダプティブ ペイメント フローを使用して「ゲストとして購入」フローを許可しようとしています。クレジット カード データの処理や、サイトを PCI 準拠として設計する必要があることを心配したくないので、paypal のデフォルト フロー (残りの API ではありません) を使用しようとしています。
したがって、このシナリオでは、私が使用しているものは次のとおりです。
- このサイトからhttps://developer.paypal.com/webapps/developer/docs/classic/adaptive-payments/integration-guide/APIntro/セクションで指定された支払いフローを実装しようとしています
ライトボックスを使用して埋め込み支払いフローを呼び出す 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 のメソッドが見つかりませんでした。これらのキーを取得する方法はありますか?
どうもありがとう