2013-08-08 3 views
0

Я реализую функциональность Paypal Express Checkout в проекте asp.net, для которого требуется авторизация, а затем аннулирование или получение разрешенной суммы. Я использую их API версии = 104.0.paypal недействительный идентификатор транзакции

Насколько я понимаю весь процесс, я делаю все правильно:

  • Я называю метод SetExpressCheckout с ActionType установлен в положение «Разрешить» в Детали компенсации

    SetExpressCheckoutRequestDetailsType reqDetails = new SetExpressCheckoutRequestDetailsType(); 
    reqDetails.ReturnURL = "http://some.url"; 
    reqDetails.CancelURL = "http://some.url"; 
    reqDetails.NoShipping = "1"; 
    reqDetails.OrderDescription = "You're about to buy items for " + payment.Amount.ToString("F"); 
    reqDetails.cpplogoimage = "http://some.ulr/image.jpb"; 
    reqDetails.PaymentDetails = new PaymentDetailsType[1]; 
    reqDetails.PaymentDetails[0] = new PaymentDetailsType(); 
    reqDetails.PaymentDetails[0].PaymentDetailsItem = new PaymentDetailsItemType[cart.LineItems.Count]; 
    int i = 0; 
    foreach (LineItemModel li in cart.LineItems) 
    { 
        PaymentDetailsItemType item = new PaymentDetailsItemType(); 
        item.Amount = new BasicAmountType(); 
        item.Amount.Value = li.TotalIncludingShipping.ToString("F"); 
        item.Amount.currencyID = CurrencyCodeType.AUD; 
        item.Name = li.ProductItem.DisplayName; 
        item.Number = li.ProductItem.SKU; 
        item.Quantity = li.Quantity.ToString(); 
        item.Description = ""; 
        reqDetails.PaymentDetails[0].PaymentDetailsItem.SetValue(item, i); 
        i++; 
    } 
    reqDetails.OrderTotal = new BasicAmountType() 
    { 
        currencyID = CurrencyCodeType.AUD, 
        Value = payment.Amount.ToString("F") 
    }; 
    reqDetails.PaymentDetails[0].PaymentAction = PaymentActionCodeType.Authorization; 
    reqDetails.PaymentDetails[0].PaymentActionSpecified = true; 
    SetExpressCheckoutReq req = new SetExpressCheckoutReq() 
    { 
        SetExpressCheckoutRequest = new SetExpressCheckoutRequestType() 
        { 
         Version = "104.0", 
         SetExpressCheckoutRequestDetails = reqDetails 
        } 
    }; 
    
  • это идет хорошо и в конце Paypal в уведомлении для моего теста. Личный кабинет. Я вижу сообщение о том, что сумма денег была авторизованной.
  • Затем я вызываю DoExpressCheckout. Вот код запроса

    DoExpressCheckoutPaymentReq payReq = new DoExpressCheckoutPaymentReq() 
    { 
        DoExpressCheckoutPaymentRequest = new DoExpressCheckoutPaymentRequestType() 
        { 
         Version = ConfigurationManager.AppSettings["PaypalAPIVersion"], 
         DoExpressCheckoutPaymentRequestDetails = new DoExpressCheckoutPaymentRequestDetailsType() 
         { 
          Token = token, 
          PayerID = payerID, 
          PaymentDetails = new PaymentDetailsType[1] 
         } 
        } 
    };   
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentAction = PaymentActionCodeType.Authorization; 
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentActionSpecified = true; 
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentDetails[0] = new PaymentDetailsType(); 
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentDetails[0].PaymentAction = PaymentActionCodeType.Authorization; 
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentDetails[0].PaymentActionSpecified = true; 
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentDetails[0].OrderTotal = new BasicAmountType(); 
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentDetails[0].OrderTotal.currencyID = CurrencyCodeType.AUD; 
    payReq.DoExpressCheckoutPaymentRequest.DoExpressCheckoutPaymentRequestDetails.PaymentDetails[0].OrderTotal.Value = total.ToString("F"); 
    
  • Этот запрос также возвращает «Успех». Я сохраняю ответ DoExpressCheckoutPaymentResponseDetails.PaymentInfo [0] .TransactionID для будущего использования

  • Но когда я запускаю DoAuthorize с идентификатором транзакции из предыдущего ответа, я получаю сообщение «Failure». Вот код запроса:

    DoAuthorizationReq authReq = new DoAuthorizationReq() 
    { 
        DoAuthorizationRequest = new DoAuthorizationRequestType() 
        { 
         Version = "104.0", 
         TransactionID = doCheckoutTransactionId 
        } 
    }; 
    authReq.DoAuthorizationRequest.Amount = new BasicAmountType(); 
    authReq.DoAuthorizationRequest.Amount.currencyID = CurrencyCodeType.AUD; 
    authReq.DoAuthorizationRequest.Amount.Value = total.ToString("F"); 
    

Отклик говорит «Failure» и ошибка массив содержит 1 элемент с ErrorCode = 10609 и сообщение «Invalid Transaction ID»

У вас есть какая-либо мысль, почему это это происходит?

Большое спасибо!

ответ

0

Чтобы получить средства после авторизации, вам необходимо запустить DoCapture, а не DoAuthorization.

+0

Но для запуска DoCapture мне нужен идентификатор транзакции авторизации, который я могу получить, только выполнив DoAuthorization, который не работает для меня. –

+0

Но на самом деле все нормально! Большое спасибо! –

+0

DoAuthorization - это просто прямой способ сделать это, и на самом деле они больше не рекомендуют использовать его. Вместо этого вы запускаете Express Checkout или Payments Pro в качестве авторизации, а затем выполняете это с помощью Docapture. Рад, что вы его работали. –

Смежные вопросы