0

Webサイトでのクレジットカード決済に3Dセキュア認証を追加したい。e コマース プラグインである Sitefinity 8 と、支払い処理業者として SagePay を使用しています。

カスタム決済プロバイダーを作成し、ユーザーを 3D セキュア ページに正常にリダイレクトできます。SagePay 統合キットを使用して (つまり、e コマース プラグインから外部で)、SagePay への 2 番目の認証呼び出しを実行できます。しかし、内部の電子商取引クラスが機能しているため、支払いを完了する方法を見つけるのに苦労しています。

問題は、3D セキュア認証が必要な場合、オーダー プロセッサが支払いを拒否したと見なすことですが、組み込みの機能を使用せずにオーダーを正しく処理する方法がないようです。internale コマース ライブラリを調べたところ、修飾子と具体的な実装のために、これらのクラスを拡張または変更する方法はないようです。

認証が完了したら、どうすれば注文を処理できますか? 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
}
4

1 に答える 1

0

2 番目の認証呼び出しをオフサイト支払いとして扱い、IOffsitePaymentProcessorProviderインターフェースを支払いプロバイダー クラスに追加することで、3D セキュア認証を追加することができました。

public class CustomSagePayProvider : SagePayProvider, IOffsitePaymentProcessorProvider
{
    // Triggered after payments that have been 3D Secure authenticated
    public IPaymentResponse HandleOffsiteNotification(int orderNumber, HttpRequest request, PaymentMethod paymentMethod)
    {
        var paymentResponse = new PaymentResponse() { IsOffsitePayment = true };

        var sagePay = new SagePayIntegration();
        var result = sagePay.GetDirectPaymentResult(request.Params.ToString());

        if (result.ThreeDSecureStatus == ThreeDSecureStatus.OK)
        {
            paymentResponse.IsSuccess = true;
            paymentResponse.GatewayTransactionID = result.TxAuthNo.ToString();
        }

        return paymentResponse;
    }

    public IPaymentResponse HandleOffsiteReturn(int orderNumber, HttpRequest request, PaymentMethod paymentMethod)
    {
        throw new NotImplementedException();
    }

termUrl最初に認証を要求するときに、SagePay に投稿された値のクエリ文字列パラメーターとして通知 URL を渡します(URL は/Ecommerce/offsite-payment-notification/、組み込みのオフサイド支払い通知ハンドラーを使用する必要があります)。

var notificationUrl = request.Url.GetLeftPart(UriPartial.Authority) + "/Ecommerce/offsite-payment-notification/";

ユーザーが認証を完了した後の SagePay からのコールバックでは、SagePay 統合キットを使用して認証の結果を処理します。

var sagePay = new SagePayIntegration();  
IThreeDAuthRequest request = new DataObject();
request.Md = md;
request.PaRes = 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);

return sagePay.GetDirectPaymentResult(sagePay.ResponseQueryString);

最後にHandleOffsiteNotification、 url に投稿してイベントをトリガーしwww.mysite.com/Ecommerce/offsite-payment-notification/ます。これにより、注文が完了したとマークされ、在庫レベルが更新され、ユーザーのバスケットがクリーンアップされます。この例では簡単にするために、SagePay 統合キット オブジェクトを使用してクエリ文字列を作成し、URL に投稿しています。

var sagePay = new SagePayIntegration();   
var ordersManager = OrdersManager.GetManager();

var query = sagePay.ConvertSagePayMessageToNameValueCollection(ProtocolMessage.DIRECT_PAYMENT_RESULT, typeof(IDirectPaymentResult), result, ProtocolVersion.V_223);

// Required Sitefinity fields to trigger HandleOffsiteNotification in IOffsitePaymentProcessorProvider
query.Add("invoice", orderNumber.ToString());
query.Add("provider", ordersManager.Provider.Name);

var queryString = sagePay.BuildQueryString(query);

// Post 3d secure details to this site simulate an offsite payment processor response
sagePay.ProcessWebRequestToSagePay(notificationUrl, queryString);
于 2016-01-18T10:32:55.743 に答える