2013-08-08 3 views
0

나는 승인을 요구하고 승인 된 금액을 취소하거나 캡처해야하는 asp.net 프로젝트에서 Paypal Express Checkout 기능을 구현합니다. 버전 = 104.0의 API를 사용하고 있습니다.페이팔 유효하지 않은 거래 id

가 제대로

나는 전체 과정을 이해 지금까지, 내가 뭐하는 거지 모든 :

  • 내가 지불 세부 사항에서 "권한 부여"로 설정 ActionType과 SetExpressCheckout 방법 전화가

    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 향후 사용을 위해 저장합니다.

  • 그러나 이전 응답에서 트랜잭션 ID로 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"); 
    

응답은 "실패"및 오류 배열이있는 ErrorCode = 10609 및 메시지 "잘못된 트랜잭션 ID"

당신이 어떤 생각 이유가 있나요 1 개 항목을 포함 말한다 : 여기에 요청 코드입니다 이 일어나고있다?

고맙습니다.

답변

0

승인 후 자금을 확보하려면 DoAuthorization이 아닌 DoCapture를 실행해야합니다.

+0

DoCapture를 실행하려면 DoAuthorization을 실행해야만 작동하는 인증 트랜잭션 ID가 필요합니다. –

+0

하지만 실제로 잘 작동했습니다! 대단히 감사합니다! –

+0

DoAuthorization은이를 수행하는 직접적인 방법이며 실제로는 더 이상 사용하지 않는 것이 좋습니다. 대신, Express Checkout 또는 Payments Pro를 권한으로 실행 한 다음 Docapture를 사용하십시오. 다행 이군. –

관련 문제