PayPal SFRA
PayPal SFRA 概要
Forter SFRA カートリッジには、PayPal API のレスポンスを保存するための組み込み機能が含まれています。これらのレスポンスには、次のものが含まれます:
- PayPal トランザクションの詳細
- キャプチャレスポンス
- 無効レスポンス
- 承認レスポンス
- エクスプレスチェックアウトレスポンス
PayPal データは、paymentInstrument オブジェクトのカスタム属性に JSON 文字列として保存され、各レスポンスは専用のカスタム属性に保存されます。
Fort は、レスポンスが最大 4,000 文字を含む可能性があるため、これらの属性を text タイプとして保存することを推奨します。
PayPal レスポンスを支払いインストゥルメントにマッピングする
SalesForce Commerce Cloud SFRA/MFRA ガイドラインに従い、PayPal データは支払いインストゥルメントに保存され、カートリッジ内の既存のコードはそれに応じて上書きされるべきです。ストアフロントアプリケーションが同じコントローラーまたはテンプレートを拡張または置き換えた場合、影響を受けるすべてのコード変更はストアフロントアプリケーションのトップレベルカートリッジに追加する必要があります。
1. PayPal 支払いオブジェクトを指定する
クレジットカードと同様に、PayPalメソッドは ForterOrder(args) 関数の中で指定された支払い手段であるべきです。ForterOrder.ds ファイル。
例:
function ForterOrder(args) {
var log = new ForterLogger("ForterOrder.ds"),
order = args.Order,
site = dw.system.Site.getCurrent(),
paymentInstruments = order.getPaymentInstruments(),
a = null,
authResponse = null,
shipment = null;
for each (var paymentInstrument in paymentInstruments) {
if (paymentInstrument.paymentMethod == 'CREDIT_CARD') {
a = paymentInstrument;
authResponse = args.CreditCardAuthResponse;
} else if (paymentInstrument.paymentMethod == 'PayPal' || paymentInstrument.paymentMethod == 'BML') {
a = paymentInstrument;
authResponse = {}; // not necessary as this info can be retreived from a instrument
} else if (paymentInstrument.paymentMethod == 'GIFT_CERTIFICATE') { // optional if this is an accepted a method in your store
a = paymentInstrument;
authResponse = args.GCRedemptionTransaction;
}
}2. PayPal認証レスポンスを専用の関数にマッピングする
PayPalやギフトカードなどは、ForterOrder.dsに関連する機能にマッピングされ、検証APIリファレンスにリストされている必要なフィールドを含める必要があります。以下の例では、PayPalのデータポイントは文字列化され、専用のPayPal (order, a)関数にマッピングされています。
function ForterPayPal(order, a ) {
//var transactionDetails = {};
this.payerId = a .custom.paypalPayerID
this.payerEmail = order.customerEmail; //required
this.payerStatus = "";
this.payerAddressStatus = ""; //"CONFIRMED"
this.paymentMethod = order.custom.paypalPaymentMethod; // ex. instant transfer
this.paymentStatus = a .custom.paypalPaymentStatus.toUpperCase(); //"PENDING"
this.payerAccountCountry = "US"; // do not hardcode if accepted from multiple countries
this.protectionEligibility = a .custom.paypalProtectionEligibility.toUpperCase(); //"ELIGIBLE";
this.correlationId = a .custom.paypalCorrelationId.correlationid; // ex. "fdshkj2390sdf";
this.paymentId = "";
this.authorizationId = a .custom.paypalAuthID; // ex. "2WC75407LV7300439";
this.fullPaypalResponsePayload = {};
}PayPalエクスプレス
PayPalとの統合時には、Papal Cartridgeの設定を変更することをお勧めします(サイト設定 -> 顧客サイト設定グループ)。これにより、Forterのカートリッジが関連する支払い情報を受け取ることができ、Forterの決定に基づいてPayPalトランザクションがキャプチャされるかキャンセルされるかを自動化することができます。
** ご注意ください: Forterのカートリッジは NOT 以下の例における請求契約のチェックアウトフローを処理しません。
ステップ 1: Forterを呼び出す前に認証する
Forterを呼び出す前に、Express Checkoutを認証を含むように更新します。これは、Payment Actionの設定を「Authorization」に設定するか、Run Authorization in case of OrderをYesに設定することで行えます。

ステップ 2: 請求情報設定を確認する
Paypalカートリッジが顧客の請求情報をSalesforce Commerce Cloudに送信するように設定されていることを確認してください。この設定には、PaypalサポートによってあなたのPaypalアカウントに外部の権限が追加される必要がある場合があります。

Forterビジネスマネージャー拡張機能で設定されたカスタマイズされたエラーメッセージを処理するために、特にPayPal決済プロセッサがフックを介して呼び出される場合(あなたのメインサイトがコントローラーまたはSFRAで構築されている場合)、int_paypal/cartridge/scripts/payment/processor/PAYPAL_EXPRESS.jsはpdictにエラーが存在するかどうかを確認する必要があります。例えば、if文の中で:
if(!empty(pdict.ForterResponse.PlaceOrderError)){
return {error: true, fortererrorCode : pdict.ForterResponse.PlaceOrderERror};
} else if (
(!empty(pdict.ForterResponse.JsonResponseOutput.actionEnum) && pdict.ForterResponse.JsonResponseOutput.actionEnum == 'DECLINED')
&&
(!empty(pdict.forterResponse.JsonResponseOutput.processorAction) && pdict.forterResponse.JsonResponseOutput.processorAction != 'skipCapture')
) {
return {error: true};
}
):ステップ 3: カスタムエラーメッセージの処理
Forterビジネスマネージャー拡張機能で設定されたカスタマイズされたエラーメッセージを処理するために、COPlaceOrder.jsファイルを調整して、authorizationResultにエラーが存在するかどうかを確認する必要があります。
内のhandlePayments(order)関数
// within the handlePayments(order) function
if (authorizationResult.not_supported || authorizationResult.error) {
if (!empty(authorizationResult.forterErrorCode)) {
return {
error : true,
forterErrorCode : authorizationResult.forterErrorCode
};
} else {
return {error : true};
}
}内のStart()関数
// inside the start() function
return {
error: true,
PlaceOrderError: new Status(Status.ERROR, handlePaymentsResult.forterErrorCode ? handlePaymentsResult.forterErrorCode.code : 'confirm.error.technical')
};
``