Forterカートリッジには、以下のレスポンスを含むPayPal APIレスポンスを保存するための組み込み機能があります:
取引の詳細
キャプチャ
無効
承認
エクスプレスチェックアウト
データは、Order Payment Instrumentオブジェクトというカスタム属性にJSON文字列として保存されます。各レスポンスは専用のカスタム属性に保存されます。これらのカスタム属性の推奨タイプはテキストです。なぜなら、場合によってはレスポンスが4K文字を超えることがあるからです。PayPalレスポンスを保存するためには、必要なデータが存在する場所にスクリプトノードを追加する必要があります。
例えば、PayPalの取引の詳細は、PaypPal-GetTransactionDetailsへの呼び出しの直後に保存され、int_forter:pipelets/forter/ForterCallStoreResponse.dsスクリプトに渡されることがあります。
スクリプト内では、Dictionary Input, “paypal_transaction_details_response”は実際には、PaypalTransactionDetailsからのカスタム属性レスポンスです。
このデータポイントは、現在の取引に関する情報を含むオブジェクトです、PaymentInstrumentはあなたの現在の支払い手段です。
PayPal決済処理がフックを介して呼び出されるシナリオ(コントローラーに基づいて構築されたストアフロント専用)で、Forterビジネスマネージャー内のカスタマイズされたエラーメッセージを処理するには、次のスクリプトを更新してください:
int_paypal/cartridge/scripts/payment/processor/PAYPAL_EXPRESS.js
これは、pdictにエラーが存在するかどうかを確認する必要があります。たとえば、以下のifステートメントは、このタイプのエラーをチェックします:
if (!empty(pdict.ForterResponse.PlaceOrderError)){}:
Forterビジネスマネージャー拡張機能で設定されたエラーメッセージを処理するには、`handlePayments(order)`関数内の`authorizationResult`変数にエラーが存在するかどうかを確認するために`COPlaceOrder.js`を調整してください。
if (authorizationResult.not_supported || authorizationResult.error) {
if (!empty(authorizationResult.forterErrorCode)) {
return {
error : true,
forterErrorCode : authorizationResult.forterErrorCode
};
} else {
return {error : true};
}
}
次に、以下の行を start() 関数内に追加します
- start()関数内
return {
error: true,
PlaceOrderError: new Status(Status.ERROR, handlePaymentsResult.forterErrorCode ? handlePaymentsResult.forterErrorCode.code : 'confirm.error.technical')
};
PayPalプロセッサーの応答に合わせたカートリッジコントローラーの調整
「ForterOrder.ds」ファイルは、あなたの支払いプロセッサーからの応答を使用するように編集する必要があります。
このスクリプトは、Forter検証のためのリクエストオブジェクトを生成するために使用されます。以下の例では、支払い手段自体にあるカスタム属性に「authorize.net」からの応答を保存し、このスクリプトで使用します。
もしあなたの実装が支払い手段に応答を保存しない場合、支払い処理業者からの応答オブジェクトを validateOrder 関数( ForterValidate.js コントローラー内にある)に入力として渡すことができ、これは ForterOrder.ds ファイルにパラメータとして送信され、リクエストオブジェクトを生成します。
以下のスクリプト例(2.4 と 2.5) には、送信する必要があるオプションおよび必須の値を示すためのコメント付きコードがあります。
/**
* ForterOrder クラスはリクエストの DTO オブジェクトです。
*
* このスクリプトを含めるには、次のようにします:
* var ForterOrder = require("int_forter/cartridge/scripts/lib/forter/dto/ForterOrder.ds");
*/
function ForterOrder(args) {
var log = new ForterLogger("ForterOrder.ds"),
order = args.Order,
site = dw.system.Site.getCurrent(),
paymentInstruments = order.getPaymentInstruments(),
payment = null,
authResponse = null,
shipment = null;
for each (var paymentInstrument in paymentInstruments) {
if (paymentInstrument.paymentMethod == 'CREDIT_CARD') { //TODO: 既存の支払い手段に調整
payment = paymentInstrument;
authResponse = new XML(paymentInstrument.custom.authorize_net_authorization);
} else if (paymentInstrument.paymentMethod == 'PayPal' || paymentInstrument.paymentMethod == 'BML') { //TODO: 既存の支払い手段に調整
payment = paymentInstrument;
authResponse = paymentInstrument.custom.paypal_transaction_details_response;
}
}
function ForterPayPal(authResponse, countryCode) {
this.payerId = authResponse.payerId; //"FD000A45P";
this.payerEmail = authResponse.paypalEmail;
this.payerStatus = "VERIFIED"; //"VERIFIED";
this.payerAddressStatus = "CONFIRMED";//"CONFIRMED";
this.paymentMethod = "Paypal";
this.paymentStatus = authResponse.paypalPaymentStatus.toUpperCase(); //"PENDING"
this.payerAccountCountry = countryCode; //"US";
this.protectionEligibility = "ELIGIBLE"; //"ELIGIBLE";
this.correlationId = authResponse.paypalCorrelationId; //"fdshkj2390sdf";
this.paymentId = "";
this.authorizationId = authResponse.transactionId; //"2WC75407LV7300439";
this.fullPaypalResponsePayload = authResponse;
this.paymentGatewayData = {};
this.paymentGatewayData.gatewayName = "Paypal"; //TODO: 使用する決済ゲートウェイに応じて調整する必要があります
this.paymentGatewayData.gatewayTransactionId = authResponse.transactionId;
}