2016-01-12 2 views
0

Я хочу добавить трехмерную безопасную аутентификацию для платежей по кредитным картам, сделанным через веб-сайт. Я использую Sitefinity 8, подключаемый модуль электронной коммерции и SagePay в качестве процессора платежей.Внедрение 3D-Secure с Sitefinity Электронная торговля

Я создал пользовательский поставщик платежей и могу успешно перенаправить пользователей на защищенную страницу 3D. Я могу выполнить второй вызов аутентификации в SagePay, используя набор интеграции SagePay (то есть внешне из плагина электронной коммерции). Тем не менее, я изо всех сил пытаюсь найти способ завершить оплату из-за того, как функционируют внутренние классы электронной коммерции.

Сложность в том, что обработчик заказа обрабатывает платеж как отклоненный, если требуется трехмерная аутентификация, но, похоже, нет способа правильно обрабатывать заказ, не используя встроенную функциональность. Из моих проверок библиотек электронной коммерции, похоже, нет способа расширить или изменить эти классы из-за модификаторов internal и конкретных реализаций.

Как я могу обработать заказ после завершения аутентификации? Кто-нибудь успешно реализовал 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; 
    } 
} 

И это безопасный способ оплаты 3D с использованием набора интеграции .NET SagePay

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 
} 

ответ

0

я был в состоянии добавить 3D безопасную аутентификацию путем обработки 2-й вызова аутентификации в качестве оплаты за пределы площадки и добавив IOffsitePaymentProcessorProvider интерфейс для моего платежа класса провайдера

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(); 
    } 

Я прохожу URL уведомления в качестве параметра строки запроса в termUrl значение, отправленное в SagePay при первом запросе аутентификации (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); 
+0

Привет, Олли, у вас есть полный образец кода для этого? Я ищу сделать то же самое и просто задаюсь вопросом, в каком порядке это сделать. Спасибо, Том – Tom

+0

@Tom Извините, у меня больше нет доступа к проекту. Существует некоторая ограниченная информация о пользовательских провайдерах здесь http://docs.sitefinity.com/for-developers-create-payment-processor-providers, и я попытался включить ключевые части в свой ответ выше. Можете быть в состоянии дать вам несколько указателей, если вы застряли! –