J'essaie de capturer une transaction PayPal qui a été autorisée à l'aide du bouton PayPal. J'essaie d'utiliser l'API CyberSource Simple Order pour ce faire. Je possède les 3 seules informations qui semblent revenir du bouton PayPal: payerID, paymentID et paymentToken. J'ai essayé plusieurs façons de transmettre cela à l'API Simple Order, mais je reçois toujours un code 102 avec le message DECLINE dans la réponse. Le système de journalisation de Cybersource indique que c'est parce que The following request field(s) is either invalid or missing: request_token.

Dois-je effectuer toute la transaction - autoriser et capturer - via une cybersource? Ou comment puis-je utiliser le bouton généré par paypal et autoriser une transaction, puis la capturer via CyberSource?

Voici mon extrait de code pour la requête CyberSource SOAPI:

RequestMessage request = new RequestMessage
{
    merchantID = WebConfigurationManager.AppSettings["cybs.merchantID"]
    , payPalDoCaptureService = new PayPalDoCaptureService {
            run = "true"
            , invoiceNumber = orders
            , paypalAuthorizationId = authId
            , paypalAuthorizationRequestToken = requestToken
            , completeType = "Complete" }
    , clientApplication = "MyClient Application"
    , clientApplicationVersion = "2.0"
    , clientApplicationUser = userName
    , clientEnvironment = WebConfigurationManager.AppSettings["Tier"]
    , merchantReferenceCode = orders
    , customerID = OrderConstants.CustomerNumber
    , merchantDefinedData = new MerchantDefinedData { field1 = "Customer #: " + OrderConstants.CustomerNumber, field2 = orders }
    , purchaseTotals = new PurchaseTotals { currency = "usd", grandTotalAmount = total, taxAmount = taxtotal }
    , item = items.ToArray()
};

ReplyMessage reply = new ReplyMessage();
try
{
    reply = SoapClient.RunTransaction(request);
}
catch (Exception ex)
{
    reply.decision = "SYSTEM ERROR";
    reply.additionalData = string.Format("Error processing request. Exception message: {0}", ex.Message);
}
10
Matt 17 août 2017 à 19:22

2 réponses

Meilleure réponse

J'ai fini par résoudre ce problème. Ma question de savoir si je devais utiliser CyberSource de bout en bout était le bon chemin. Finalement, j'ai compris - après avoir discuté pendant des jours avec le support CyberSource - que je devais utiliser leur "Set Service" dans une méthode WebApi pour générer le "token" PayPal et le donner au bouton PayPal via ajax dans le javascript qui génère le bouton . J'ai également dû approfondir leur documentation et celle de PayPal et comprendre comment faire fonctionner cela car ce n'était pas très clair au départ. Quoi qu'il en soit, une fois que j'ai effectué le service Set, j'ai rassemblé les informations dans la réponse de CyberSource, ainsi que le jeton PayPal, et je les ai envoyées à un appel de service Get Details (également CyberSource). Enfin, ces informations sont transmises à un appel de service combiné Do Sale et Do Capture et les fonds sont capturés. Le bouton permettait uniquement à un utilisateur de se connecter à son compte PayPal et de vérifier qu'il souhaitait poursuivre la transaction.

La documentation de CyberSource manque un peu de clarté à ce sujet, et ils renvoient à un ensemble obsolète de documentation PayPal, ce qui ne facilite rien.

1
Matt 29 août 2017 à 20:31

Avez-vous essayé de configurer votre demande de cette manière? Ne faites pas attention aux valeurs que j'ai utilisées, mais je regarde l'exemple dans la documentation (Exemple 21 Demande de payPalDoCaptureService). Vous devrez ctrl + f pour le trouver.

RequestMessage request = new RequestMessage
{
    payPalDoCaptureService_run=true
    , merchantID = WebConfigurationManager.AppSettings["cybs.merchantID"]
    , merchantReferenceCode = HTNsubscription9647
    , purchaseTotals = new PurchaseTotals { currency = "usd", grandTotalAmount = total, taxAmount = taxtotal }
    , payPalDoCaptureService = new PayPalDoCaptureService 
      {
         run = "true"
        , invoiceNumber = orders
        , paypalAuthorizationId = authId
        , paypalAuthorizationRequestID = authReqId
        , paypalAuthorizationRequestToken = requestToken
        , completeType = "Complete" 
      }
}
1
DoloMike 29 août 2017 à 16:40