2011-05-26 6 views
2

J'utilise l'API CyberSource pour la passerelle de paiement. Je suis passé par toutes les documentations disponibles et est venu avec le code suivant:Annulation/remboursement d'une transaction à l'aide de l'API CyberSource dans .NET

  1. D'abord, j'ajouté la référence de service à CyberSource utilisant url https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.60.wsdl

  2. Puis j'ai ajouté le code suivant pour faire une transaction, puis l'annuler. Mais de toute façon, l'annulation ne semble pas fonctionner. Je ne suis pas sûr de ce que je fais mal car il y a très peu de documentation disponible sur le net.

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

Dans restitution à la demande de la méthode, je veux dire en fait la réponse en Request.ReasonCode = 102 ce qui signifie une erreur. Idéalement, il devrait être 100. 102 signifie "Un ou plusieurs champs dans la requête contiennent des données invalides.".

aide est très apprécié ...

+0

Salut Hari, J'essaie d'utiliser CyberSource aussi. J'ai ajouté la référence Web, et en utilisant le même code source, mais le 'TransactionProcessorClient' n'a pas pu être trouvé. Avez-vous besoin de référencer quelque chose pour obtenir cet espace de noms? –

+0

Juste au cas où quelqu'un vérifie cela à l'avenir (comme moi): vous devriez être capable de trouver les informations nécessaires en vous connectant au Merchant Board, ou en vérifiant l'objet Reply (devrait avoir un champ qui indique les champs invalides). –

Répondre

0

Une fois que vous avez publié auteur Vous pouvez publier un montant de crédit aux utilisateurs qui compte lui envoyer/elle que l'argent. Pour ce faire, vous devez spécifier request.ccCreditService et définir son champ à true. La même chose peut être faite dans leur interface utilisateur du centre d'affaires. Toutefois, cela n'a rien à voir avec l'annulation de la transaction d'autorisation/de règlement réelle.

3

Essayez ceci. Ça marche pour moi.

  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); 
1

Le jeton de demande n'est pas nécessaire si vous utilisez déjà le requestId provenant de l'autorisation initiale. Ainsi, vous pouvez supprimer en toute sécurité la ligne:

request.ccAuthReversalService.authRequestToken = order.RequestToken; 

En outre, purchaseTotals.currency n'est pas nécessaire, par votre requestId CyberSource obtenir cette information pour vous. Une autre ligne enregistrée:

request.purchaseTotals.currency = "USD"; 
0
request.ecDebitService = new ECDebitService(); 
request.ecDebitService.run = "true"; 

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

Vous pouvez utiliser ce service de crédit et de débit, si l'utilisateur final souhaite de débit une certaine quantité Par exemple: 100,00 $, il peut entrer - 100,00 $ et si le montant total est inférieur à zéro vous pouvez définir le service de crédit comme vrai et vice versa. Essayez ceci et si vous avez besoin de plus d'aide, n'hésitez pas à me contacter sur le mail id.

Questions connexes