Внедрение 3D Secure с Sitefinity Ecommerce
Я хочу добавить безопасную 3D-аутентификацию для платежей по кредитным картам, осуществляемых через веб-сайт. Я использую Sitefinity 8, плагин электронной коммерции и SagePay в качестве обработчика платежей.
Я создал собственного провайдера платежей и могу успешно перенаправлять пользователей на безопасную 3D-страницу. Я могу выполнить второй аутентификационный вызов SagePay с помощью комплекта интеграции SagePay (т.е. извне из плагина электронной коммерции). Однако я изо всех сил пытаюсь найти способ завершить платеж за счет функционирования внутренних классов электронной коммерции.
Сложность состоит в том, что обработчик заказов обрабатывает платеж как отклоненный, если требуется безопасная 3D-аутентификация, но, похоже, нет способа правильно обработать заказ без использования встроенных функций. Из моих проверок библиотек электронной коммерции, кажется, нет никакого способа расширить или изменить эти классы из-за 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
}
1 ответ
Мне удалось добавить безопасную 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);