Webサイトでのクレジットカード決済に3Dセキュア認証を追加したい。e コマース プラグインである Sitefinity 8 と、支払い処理業者として SagePay を使用しています。
カスタム決済プロバイダーを作成し、ユーザーを 3D セキュア ページに正常にリダイレクトできます。SagePay 統合キットを使用して (つまり、e コマース プラグインから外部で)、SagePay への 2 番目の認証呼び出しを実行できます。しかし、内部の電子商取引クラスが機能しているため、支払いを完了する方法を見つけるのに苦労しています。
問題は、3D セキュア認証が必要な場合、オーダー プロセッサが支払いを拒否したと見なすことですが、組み込みの機能を使用せずにオーダーを正しく処理する方法がないようです。internal
e コマース ライブラリを調べたところ、修飾子と具体的な実装のために、これらのクラスを拡張または変更する方法はないようです。
認証が完了したら、どうすれば注文を処理できますか? e コマースで 3D セキュアの実装に成功した人はいますか? またはそれが可能かどうか知っていますか?
これは、現時点での私のカスタム支払いプロバイダーです。
public class CustomSagePayProvider : SagePayProvider
{
// Rest of code...
protected override IPaymentResponse ParseReponse(string uniqueTransactionCode, string responseXml)
{
var paymentResponse = base.ParseReponse(uniqueTransactionCode, responseXml);
if (Requires3DSecure(paymentResponse))
{
var responseFields = GetResponseAsDictionary(responseXml);
Set3DSecureFields(responseFields, paymentResponse);
}
return paymentResponse;
}
private bool Requires3DSecure(IPaymentResponse paymentResponse)
{
return paymentResponse.GatewayCSCResponse == "OK";
}
private void Set3DSecureFields(Dictionary<string, string> responseFields, IPaymentResponse paymentResponse)
{
var postValues = new NameValueCollection();
postValues.Add("MD", responseFields.ContainsKey("MD") ? responseFields["MD"] : string.Empty);
postValues.Add("PAReq", responseFields.ContainsKey("PAReq") ? responseFields["PAReq"] : string.Empty);
paymentResponse.GatewayRedirectUrlPostValues = postValues;
paymentResponse.GatewayRedirectUrl = responseFields.ContainsKey("ACSURL") ? responseFields["ACSURL"] : string.Empty;
}
}
これは、.NET SagePay 統合キットを使用した 3D セキュア決済プロセスです。
using SagePay.IntegrationKit;
using SagePay.IntegrationKit.Messages;
// Rest of code
var sagePay = new SagePayIntegration();
IThreeDAuthRequest request = new DataObject();
request.Md = Request.Form["MD"];
request.PaRes = Request.Form["PaRes"];
sagePay.RequestQueryString = sagePay.BuildQueryString(request, ProtocolMessage.THREE_D_AUTH_REQUEST, ProtocolVersion.V_223);
sagePay.ResponseQueryString = sagePay.ProcessWebRequestToSagePay("https://test.sagepay.com/gateway/service/direct3dcallback.vsp", sagePay.RequestQueryString);
var result = sagePay.GetDirectPaymentResult(sagePay.ResponseQueryString);
if (result.Status == ResponseStatus.OK)
{
// Process order
}