使用.NET中的CyberSource API取消/退款交易
我正在使用支付网关的CyberSource API。我经历了所有可用的单证去与下面的代码上来:使用.NET中的CyberSource API取消/退款交易
首先,我使用URL https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.60.wsdl
-
添加服务引用的CyberSource然后,我添加以下代码用于制作交易,然后取消它。但不知何故,取消似乎并不奏效。我不知道我在做什么错误,因为网上只有很少的文档可用。
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 = "[email protected]"; 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.ReasonCode = 102,这意味着一个错误。理想情况下,它应该是100. 102表示“请求中的一个或多个字段包含无效数据。”。
帮助我非常感激......
一旦你贴作者 用户帐户将会送他/她的钱您可以张贴信贷量。 为此,您需要指定request.ccCreditService并将其运行字段设置为true。 同样的事情可以在他们的商务中心用户界面中完成。
但是,这与取消实际授权/结算交易无关。
试试这个。这个对我有用。
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);
如果您已经使用来自初始授权的requestId,则不需要请求令牌。 所以,你可以安全地删除行:
request.ccAuthReversalService.authRequestToken = order.RequestToken;
而且,purchaseTotals.currency是没有必要的,通过你的requestId的CyberSource将获得这些信息给你。 保存的另一条线:
request.purchaseTotals.currency = "USD";
request.ecDebitService = new ECDebitService();
request.ecDebitService.run = "true";
request.ecCreditService = new ECCreditService();
equest.ecCreditService.run = "true";
您可以使用此信用卡和借记服务,如果最终用户希望借记一定量例如:$ 100.00他可以进入 - $ 100.00,然后如果总量小于零您可以将信用服务设置为真,反之亦然。
试试这个,如果你需要更多的帮助随时联系我的邮件ID。
嗨哈里,我想用CyberSource也。我添加了Web引用,并使用相同的源代码,但找不到“TransactionProcessorClient”。你需要引用一些东西来获得这个命名空间吗? – 2011-06-30 10:17:39
为了防止有人在将来检查此事件(例如我):您应该能够通过登录到Merchant Board中或通过验证Reply对象(应该有一个指示无效字段的字段)来查找必要的信息。 – 2015-12-28 07:56:05