Отмена / возврат транзакции с использованием CyberSource API в .NET

#.net #payment-gateway

#.net #платежный шлюз

Вопрос:

Я использую CyberSource API для платежного шлюза. Я просмотрел всю доступную документацию и пришел к следующему коду:

  1. Сначала я добавил ссылку на службу CyberSource, используя URLhttps://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.60.wsdl

  2. Затем я добавил следующий код для совершения транзакции, а затем ее отмены. Но почему-то отмена, похоже, не работает. Я не уверен, что я делаю неправильно, поскольку в сети доступно очень мало документации.

     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using PaymentGatewayConsole.CyberSourceTest;
    
    namespace PaymentGatewayConsole
    {
        class Program
        {
                    private const String MERCHANT_ID = "removed";
                    private const String TRANSACTION_KEY = "removed";
                    private static string REQUEST_TOKEN = string.Empty;
                    private static string REQUEST_ID = string.Empty;
    
            static void Main(string[] args)
            {
                MakePayment(); 
    
                RequestRefund();
            }
    
    private static void MakePayment()
    {
        RequestMessage request = new RequestMessage();
        request.merchantID = MERCHANT_ID;
        // replace request.merchantReferenceCode with reference number for the current transaction.
        request.merchantReferenceCode = "123";
        request.clientLibrary = ".NET WCF";
        request.clientLibraryVersion = Environment.Version.ToString();
        request.clientEnvironment = Environment.OSVersion.Platform   Environment.OSVersion.Version.ToString();
    
        request.ccAuthService = new CCAuthService();
        request.ccAuthService.run = "true";
    
        BillTo billTo = new BillTo();
        billTo.firstName = "John";
        billTo.lastName = "Doe";
        billTo.street1 = "1295 Charleston Road";
        billTo.city = "Mountain View";
        billTo.state = "CA";
        billTo.postalCode = "94043";
        billTo.country = "US";
        billTo.email = "null@cybersource.com";
        billTo.ipAddress = "10.7.111.111";
        request.billTo = billTo;
    
        Card card = new Card();
        card.accountNumber = "4111111111111111";
        card.expirationMonth = "12";
        card.expirationYear = "2020";
        card.cardType = "Visa";
        request.card = card;
    
        PurchaseTotals purchaseTotals = new PurchaseTotals();
        purchaseTotals.currency = "USD";
        request.purchaseTotals = purchaseTotals;
    
        request.item = new Item[1];
        Item item = new Item();
        item.id = "0";
        item.unitPrice = "49.00";
        request.item[0] = item;
    
        try
        {
            TransactionProcessorClient proc = new TransactionProcessorClient();
    
            proc.ChannelFactory.Credentials.UserName.UserName = request.merchantID;
            proc.ChannelFactory.Credentials.UserName.Password = TRANSACTION_KEY;
    
            ReplyMessage reply = proc.runTransaction(request);
    
            REQUEST_ID = reply.requestID;
            REQUEST_TOKEN = reply.requestToken;
    
            Console.WriteLine("decision = "   reply.decision);
            Console.WriteLine("reasonCode = "   reply.reasonCode);
            Console.WriteLine("requestID = "   reply.requestID);
            Console.WriteLine("requestToken = "   reply.requestToken);
            Console.WriteLine("ccAuthReply.reasonCode = "   reply.ccAuthReply.reasonCode);
        }
        catch (TimeoutException e)
        {
            Console.WriteLine("TimeoutException: "   e.Message   "n"   e.StackTrace);
        }
        catch (FaultException e)
        {
            Console.WriteLine("FaultException: "   e.Message   "n"   e.StackTrace);
        }
        catch (CommunicationException e)
        {
            Console.WriteLine("CommunicationException: "   e.Message   "n"   e.StackTrace);
        }
        Console.ReadLine();
    }
    
    /// <summary>
    /// Method for requesting refund 
    /// </summary>
    private static void RequestRefund()
    {
        RequestMessage request = new RequestMessage();
        request.merchantID = MERCHANT_ID;
        request.merchantReferenceCode = "123";
        request.clientLibrary = ".NET WCF";
        request.clientLibraryVersion = Environment.Version.ToString();
        request.clientEnvironment = Environment.OSVersion.Platform   Environment.OSVersion.Version.ToString();
    
        request.ccAuthService = new CCAuthService();
        request.ccAuthService.run = "true";
    
        //request.ccAuthReversalService = new CCAuthReversalService();
        //request.ccAuthReversalService.run = "true";
        //request.ccAuthReversalService.authRequestID = REQUEST_ID;
        //request.orderRequestToken = REQUEST_TOKEN;
        //request.purchaseTotals = new PurchaseTotals();
        //request.purchaseTotals.currency = "USD";
        //request.purchaseTotals.grandTotalAmount = "10";
    
        VoidService reqVoid = new VoidService();
        reqVoid.voidRequestID = REQUEST_ID;
        reqVoid.voidRequestToken = REQUEST_TOKEN;
        reqVoid.run = "true";
        request.voidService = reqVoid;
    
        try
        {
            TransactionProcessorClient proc = new TransactionProcessorClient();
            proc.ChannelFactory.Credentials.UserName.UserName = request.merchantID;
            proc.ChannelFactory.Credentials.UserName.Password = TRANSACTION_KEY;
    
            ReplyMessage reply = proc.runTransaction(request);
    
            Console.WriteLine("decision = "   reply.decision);
            Console.WriteLine("reasonCode = "   reply.reasonCode);
            Console.WriteLine("requestID = "   reply.requestID);
            Console.WriteLine("requestToken = "   reply.requestToken);
    
        }
        catch (TimeoutException e)
        {
            Console.WriteLine("TimeoutException: "   e.Message   "n"   e.StackTrace);
        }
        catch (FaultException e)
        {
            Console.WriteLine("FaultException: "   e.Message   "n"   e.StackTrace);
        }
        catch (CommunicationException e)
        {
            Console.WriteLine("CommunicationException: "   e.Message   "n"   e.StackTrace);
    
        }
        Console.ReadLine();
            }
        }
    }
      

В методе request refund я фактически получаю ответ в виде запроса.Код причины = 102, что означает ошибку. В идеале это должно быть 100. 102 означает «Одно или несколько полей в запросе содержат недопустимые данные»..

Помощь высоко ценится…

Комментарии:

1. Привет, Хари, я тоже пытаюсь использовать CyberSource. Я добавил веб-ссылку, используя тот же исходный код, но TransactionProcessorClient не удалось найти. Вам нужно ссылаться на что-нибудь, чтобы получить это пространство имен?

2. На всякий случай, если кто-то будет проверять это в будущем (например, я): вы должны быть в состоянии найти необходимую информацию, войдя в Merchant Board или подтвердив объект Reply (должно быть поле, в котором указаны недопустимые поля).

Ответ №1:

Попробуйте это. У меня это работает.

             RequestMessage request = new RequestMessage();
            request.ccAuthReversalService = new CCAuthReversalService();
            request.ccAuthReversalService.run = "true";
            request.ccAuthReversalService.authRequestID = order.Transactionno;
            request.ccAuthReversalService.authRequestToken = order.RequestToken;
            request.purchaseTotals = new PurchaseTotals();
            request.purchaseTotals.currency = "USD";
            request.purchaseTotals.grandTotalAmount = (order.Total).ToString("0.00");
            request.merchantID = MerchantId;
            request.merchantReferenceCode = order.OrderNumber;
            TransactionProcessorClient proc = new TransactionProcessorClient();
            proc.ChannelFactory.Credentials.UserName.UserName = request.merchantID;
            proc.ChannelFactory.Credentials.UserName.Password = Key;
            ReplyMessage reply = proc.runTransaction(request);
  

Ответ №2:

Токен запроса не требуется, если вы уже используете идентификатор запроса, исходящий из первоначальной авторизации. Таким образом, вы можете безопасно удалить строку:

 request.ccAuthReversalService.authRequestToken = order.RequestToken;
  

Кроме того, приобретать Totals.currency не обязательно, через ваш RequestID CyberSource получит эту информацию для вас.
Сохранена еще одна строка:

 request.purchaseTotals.currency = "USD";
  

Ответ №3:

После публикации автора Вы можете внести сумму кредита на учетную запись пользователя, которая отправит ему / ей эти деньги. Для этого вам нужно указать request.ccCreditService и установить для его поля run значение true. То же самое можно сделать в их пользовательском интерфейсе Business Center.

Однако это не имеет ничего общего с отменой фактической транзакции авторизации / расчета.

Ответ №4:

 request.ecDebitService = new ECDebitService();
request.ecDebitService.run = "true";

request.ecCreditService = new ECCreditService();
equest.ecCreditService.run = "true";
  

Вы можете использовать этот кредитно-дебетовый сервис, если конечный пользователь хочет списать некоторую сумму, например: 100,00 долларов, он может ввести — 100,00 долларов, а затем, если общая сумма меньше нуля, вы можете установить кредитный сервис как true и наоборот.

Попробуйте это, и если вам понадобится дополнительная помощь, не стесняйтесь обращаться ко мне по идентификатору почты.