#.net #payment-gateway
#.net #платежный шлюз
Вопрос:
Я использую CyberSource API для платежного шлюза. Я просмотрел всю доступную документацию и пришел к следующему коду:
-
Сначала я добавил ссылку на службу CyberSource, используя URLhttps://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.60.wsdl
-
Затем я добавил следующий код для совершения транзакции, а затем ее отмены. Но почему-то отмена, похоже, не работает. Я не уверен, что я делаю неправильно, поскольку в сети доступно очень мало документации.
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 и наоборот.
Попробуйте это, и если вам понадобится дополнительная помощь, не стесняйтесь обращаться ко мне по идентификатору почты.