2016-08-02 14 views
6

Tôi đang cố gắng để có được chi tiết giao dịch từ API SOAP của PayPal nhưng tôi đang gặp lỗi từ PayPal. Nó trả về lỗi:Lấy chi tiết giao dịch từ PayPal SOAP API (hy vọng các trường tùy chỉnh)

The transaction id is not valid 

Tôi biết đó là ID giao dịch hợp lệ vì tôi có thể nhận chi tiết giao dịch bằng API NVP PayPal nhưng có thể tôi đã yêu cầu SOAP có định dạng không chính xác. Tôi đã làm theo các ví dụ về API SOAP của PayPal mà tôi có thể tìm thấy trên web để xây dựng XML SOAP nhưng chúng rất mỏng. Tôi đang sử dụng chương trình PAW của mac để gửi yêu cầu SOAP tới API của PayPal nhưng vấn đề này nên được tái sử dụng bằng ứng dụng khách HTTP.

Tôi đã cố gắng sử dụng REST API của PayPal nhưng there's no method to get transaction details (ví dụ: tên, email, số tiền đã thanh toán, trường tùy chỉnh). Tôi cũng đã cố gắng sử dụng NVP (Name-Value-Pair) API và tôi lấy lại chi tiết giao dịch nhưng nó không cung cấp cho tôi tất cả các trường tùy chỉnh được lưu trữ cho một giao dịch. Khi tôi đăng nhập vào PayPal, và xem một giao dịch, tôi có thể thấy tất cả các trường tùy chỉnh cho giao dịch đó, vì vậy tôi biết chúng đang được lưu trữ.

API SOAP là hy vọng cuối cùng của tôi.

Dưới đây là các yêu cầu SOAP phong bì Tôi đang sử dụng:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:ebay:api:PayPalAPI" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" xmlns:cc="urn:ebay:apis:CoreComponentTypes" xmlns:ed="urn:ebay:apis:EnhancedDataTypes"> 
     <soapenv:Header> 
      <ns:RequesterCredentials> 
       <ebl:Credentials> 
        <ebl:Username>soap_api_username_here</ebl:Username> 
        <ebl:Password>soap_api_password_here</ebl:Password> 
        <ebl:Signature>soap_api_signature_here</ebl:Signature> 
       </ebl:Credentials> 
      </ns:RequesterCredentials> 
     </soapenv:Header> 
     <soapenv:Body> 
      <ns:GetTransactionDetailsReq> 
       <ns:GetTransactionDetailsRequest> 
        <ebl:Version>93.0</ebl:Version> 
        <ebl:TransactionID>8FX18476NR449891W</ebl:TransactionID> 
       </ns:GetTransactionDetailsRequest> 
      </ns:GetTransactionDetailsReq> 
     </soapenv:Body> 
</soapenv:Envelope> 

Dưới đây là câu trả lời tôi nhận được từ PayPal SOAP API:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cc="urn:ebay:apis:CoreComponentTypes" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:ed="urn:ebay:apis:EnhancedDataTypes" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" xmlns:ns="urn:ebay:api:PayPalAPI"> 
     <SOAP-ENV:Header> 
     <Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext" xsi:type="wsse:SecurityType"/> 
     <RequesterCredentials xmlns="urn:ebay:api:PayPalAPI" xsi:type="ebl:CustomSecurityHeaderType"> 
      <Credentials xmlns="urn:ebay:apis:eBLBaseComponents" xsi:type="ebl:UserIdPasswordType"> 
      <Username xsi:type="xs:string"/> 
      <Password xsi:type="xs:string"/> 
      <Signature xsi:type="xs:string"/> 
      <Subject xsi:type="xs:string"/> 
      </Credentials> 
     </RequesterCredentials> 
     </SOAP-ENV:Header> 
     <SOAP-ENV:Body id="_0"> 
     <GetTransactionDetailsResponse xmlns="urn:ebay:api:PayPalAPI"> 
      <Timestamp xmlns="urn:ebay:apis:eBLBaseComponents">2016-08-02T16:43:02Z</Timestamp> 
      <Ack xmlns="urn:ebay:apis:eBLBaseComponents">Failure</Ack> 
      <CorrelationID xmlns="urn:ebay:apis:eBLBaseComponents">a464c181339f4</CorrelationID> 
      <Errors xmlns="urn:ebay:apis:eBLBaseComponents" xsi:type="ebl:ErrorType"> 
      <ShortMessage xsi:type="xs:string">Transaction refused because of an invalid argument. See additional error messages for details.</ShortMessage> 
      <LongMessage xsi:type="xs:string">The transaction id is not valid</LongMessage> 
      <ErrorCode xsi:type="xs:token">10004</ErrorCode> 
      <SeverityCode xmlns="urn:ebay:apis:eBLBaseComponents">Error</SeverityCode> 
      </Errors> 
      <Version xmlns="urn:ebay:apis:eBLBaseComponents">93.0</Version> 
      <Build xmlns="urn:ebay:apis:eBLBaseComponents">000000</Build> 
      <PaymentTransactionDetails xmlns="urn:ebay:apis:eBLBaseComponents" xsi:type="ebl:PaymentTransactionType"> 
      <ReceiverInfo xsi:type="ebl:ReceiverInfoType"/> 
      <PayerInfo xsi:type="ebl:PayerInfoType"> 
       <PayerStatus xsi:type="ebl:PayPalUserStatusCodeType">verified</PayerStatus> 
       <PayerName xsi:type="ebl:PersonNameType"/> 
       <Address xsi:type="ebl:AddressType"> 
       <AddressOwner xsi:type="ebl:AddressOwnerCodeType">PayPal</AddressOwner> 
       <AddressStatus xsi:type="ebl:AddressStatusCodeType">None</AddressStatus> 
       </Address> 
      </PayerInfo> 
      <PaymentInfo xsi:type="ebl:PaymentInfoType"> 
       <TransactionType xsi:type="ebl:PaymentTransactionCodeType">none</TransactionType> 
       <PaymentType xsi:type="ebl:PaymentCodeType">none</PaymentType> 
       <PaymentStatus xsi:type="ebl:PaymentStatusCodeType">None</PaymentStatus> 
       <PendingReason xsi:type="ebl:PendingStatusCodeType">none</PendingReason> 
       <ReasonCode xsi:type="ebl:ReversalReasonCodeType">none</ReasonCode> 
      </PaymentInfo> 
      <PaymentItemInfo xsi:type="ebl:PaymentItemInfoType"> 
       <Subscription xsi:type="ebl:SubscriptionInfoType"/> 
       <Auction xsi:type="ebl:AuctionInfoType"/> 
      </PaymentItemInfo> 
      </PaymentTransactionDetails> 
     </GetTransactionDetailsResponse> 
     </SOAP-ENV:Body> 
    </SOAP-ENV:Envelope> 

Tôi không chắc chắn những gì tôi đang làm sai nhưng có thể ai đó có nhiều kinh nghiệm có thể phát hiện ra lỗi dễ dàng hơn tôi có thể. Tôi đã trả lời câu hỏi của người dùng khác về API REST của PayPal và nhận chi tiết giao dịch từ đó nhưng theo như tôi biết, không có cách nào để làm điều đó Get customer details after transaction. Nếu bạn đã tìm thấy một cách để thực hiện điều này với REST API, hãy cho tôi biết nguyên nhân tôi sẽ sử dụng REST nhiều hơn SOAP.

Cảm ơn.

+0

Ngôn ngữ phía máy chủ của bạn mà bạn đang sử dụng để gửi là gì? Tôi đang sử dụng asp.net, nhưng khá chắc chắn nó không sử dụng XML. – JustJohn

+0

@JustJohn Tôi đã lên kế hoạch sử dụng PHP để thực hiện cuộc gọi đến API SOAP của PayPal nhưng nếu tôi không thể làm việc với Paw hoặc Postman, tôi nghi ngờ cuộc gọi PHP sẽ hoạt động và sẽ gây nhầm lẫn hơn cho tôi. Nếu bạn đang sử dụng API SOAP của PayPal, thì chương trình ASP.net của bạn đang biên dịch một cuộc gọi XML để gửi tới API SOAP của PayPal. –

Trả lời

1

Các thông báo lỗi là một cá trích đỏ. PayPal không thể tìm thấy bất kỳ TransactionId nào, báo cáo TransactionId trống là không hợp lệ.

Phần tử TransactionId thuộc về không gian tên urn:ebay:api:PayPalAPI. XML của bạn gắn nó vào không gian tên urn:ebay:apis:eBLBaseComponents. Tất cả những gì bạn cần làm là thay đổi ebl:TransactionId thành ns:TransactionId.

<?xml version="1.0" encoding="UTF-8"?> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:ebay:api:PayPalAPI" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" xmlns:cc="urn:ebay:apis:CoreComponentTypes" xmlns:ed="urn:ebay:apis:EnhancedDataTypes"> 
    <soapenv:Header> 
     <ns:RequesterCredentials> 
      <ebl:Credentials> 
       <ebl:Username>soap_api_username_here</ebl:Username> 
       <ebl:Password>soap_api_password_here</ebl:Password> 
       <ebl:Signature>soap_api_signature_here</ebl:Signature> 
      </ebl:Credentials> 
     </ns:RequesterCredentials> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ns:GetTransactionDetailsReq> 
      <ns:GetTransactionDetailsRequest> 
       <ebl:Version>204.0</ebl:Version> 
       <ns:TransactionID>8FX18476NR449891W</ns:TransactionID> 
      </ns:GetTransactionDetailsRequest> 
     </ns:GetTransactionDetailsReq> 
</soapenv:Body> 

Kiểm tra example at the PayPal KB này.

+0

hoạt động. Có vẻ như API SOAP của PayPal sẽ vẫn chỉ lấy hai trong số bảy tùy chọn có thể lưu trữ. Đây là một vấn đề đã biết với NVP và API SOAP http://stackoverflow.com/questions/16764186/gettransactiondetails-doesnt-report-part-of-the-order-options –

0

Tôi có thể đặt nhận xét này là nhận xét nhưng nó khá đầy goobly gook. Tại các chi phí là cách tắt tôi có thể có một số trợ giúp có thể. Vì vậy, mã vb.net của tôi sẽ gửi một biểu mẫu đến paypal bao gồm "notify_url".

  ' determining the URL to work with depending on whether sandbox or a real PayPal account should be used 
      If strRealOrSand = "Sand" Then 
       URL = "https://www.sandbox.paypal.com/cgi-bin/webscr" 
       business = "[email protected]" ' AppSettings("BusinessEmail") (sandbox account business email) 
      ElseIf strRealOrSand = "Real" Then 
       URL = "https://www.paypal.com/cgi-bin/webscr" 
       business = "[email protected]" ' AppSettings("BusinessEmail") (real pay pal account account business email) 
      End If 

notify_url = "http://www.xxxxx.com/accounts/done.aspx" 



    <form id="payForm" method="post" action="<%Response.Write (URL)%>" > 
     <input type="hidden" name="cmd" value="<%Response.Write (cmd)%>" /> 
     <input type="hidden" name="business" value="<%Response.Write (business)%>" /> 
     <input type="hidden" name="item_name" value="<%Response.Write (item_name)%>" /> 
     <input type="hidden" name="amount" value="<%Response.Write (amount)%>" /> 
     <input type="hidden" name="no_shipping" value="<%Response.Write (no_shipping)%>" /> 
     <input type="hidden" name="return" value="<%Response.Write (return_url)%>" /> 
     <input type="hidden" name="rm" value="<%Response.Write (rm)%>" /> 
     <input type="hidden" name="notify_url" value="<%Response.Write (notify_url)%>" /> 
     <input type="hidden" name="cancel_return" value="<%Response.Write (cancel_url)%>" /> 
     <input type="hidden" name="currency_code" value="<%Response.Write (currency_code)%>" /> 
     <input type="hidden" name="custom" value="<%Response.Write (row_id)%>" /> 
    </form> 

    <script type="text/javascript"> 
     document.forms["payForm"].submit(); 
    </script> 

</body> 

Sau đó, trong "notify_url" tải trang của tôi nó bị gì PayPal gửi lại sau khi giao dịch hoàn tất. Bạn sẽ nhận thấy có rất nhiều email gỡ lỗi được gửi lại cho tôi. Đây là việc của tôi.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Dim vReceived As String = "" 
     Dim vFormValues As String = "" 
     Dim vResponder As String = "" 
     Dim strE As String = "" 
     Dim intAccountID As Integer = 0 
     Dim intCreditsPurchased As Integer = 0 

     Dim vWebRequest As System.Net.HttpWebRequest 
     Dim vSSend As Boolean = False 
     'vWebRequest = CType(System.Net.WebRequest.Create("https://www.sandbox.paypal.com/cgi-bin/webscr"), System.Net.HttpWebRequest) 
     vWebRequest = CType(System.Net.WebRequest.Create("https://www.paypal.com/cgi-bin/webscr"), System.Net.HttpWebRequest) 



     vWebRequest.Method = "POST" 
     vWebRequest.ServicePoint.Expect100Continue = False 
     vWebRequest.ContentType = "application/x-www-form-urlencoded" 



     Try 
      vFormValues = Encoding.ASCII.GetString(Request.BinaryRead(Request.ContentLength)) 
      vReceived = "cmd=_notify-validate&" & vFormValues 
     Catch ex As Exception 
      sSend_Mail_From_done_aspx("Requested Form.ToString", ex.ToString) 
     End Try 

     vWebRequest.ContentLength = vReceived.Length 
     Dim vStreamOut As System.IO.StreamWriter = New System.IO.StreamWriter(vWebRequest.GetRequestStream(), Encoding.ASCII) 
     vStreamOut.Write(vReceived) 
     vStreamOut.Close() 
     Dim vStreamIn As New System.IO.StreamReader(vWebRequest.GetResponse().GetResponseStream()) 
     vResponder = vStreamIn.ReadToEnd() 
     vStreamIn.Close() 



     Dim vFieldName As String 
     Dim vFieldValue As String = "" 
     Dim vFields As New Collection 

     For Each vFieldName In Request.Form 
      'strE = strE & Request.Form.Item(vFieldName) & " " 
      strE &= vFieldName & ": " & Request.Form.Item(vFieldName) & vbCrLf 
      'vFieldValue = Request.Form.Item(vFieldName) 
      'vFields.Add(Decode(vFieldValue), Decode(vFieldName).ToLower) 
     Next 

     sSend_Mail_From_done_aspx("BEFORE VERIFIED CHECK, WHAT vResponder CONTAINS", strE) 


     Dim transactionID As String = "" 
     Dim dblAmount As Double 
     Dim intRowID As Integer 
     Dim dblPayPalFee As Double 

     Dim strMemo As String = "" 
     Dim strPayerEmail As String = "" 
     Dim strPaymentDate As String = "" 

     If Trim(vResponder).ToUpper = "VERIFIED" Then 

      For Each vFieldName In Request.Form 
       strE &= vFieldName & ": " & Request.Form.Item(vFieldName) & vbCrLf 

      Next 

      sSend_Mail_From_done_aspx("VERIFIED CAME THROUGH", strE) 

      Try 
       transactionID = Request.Form.Item("txn_id").ToString() 
       dblAmount = CType(Request.Form.Item("payment_gross"), Double) 
       intRowID = CType(Request.Form.Item("custom"), Integer) 
       dblPayPalFee = CType(Request.Form.Item("payment_fee"), Double) 
       If Len(Request.Form.Item("memo") & "") <> 0 Then 
        strMemo = Request.Form.Item("memo").ToString.Replace("'", "") 
       End If 
       strPayerEmail = Request.Form.Item("payer_email").ToString 
       strPaymentDate = Request.Form.Item("payment_date").ToString 


      Catch ex As Exception 
       sSend_Mail_From_done_aspx("Request.QueryString)", ex.ToString) 
      End Try 


      Try 

       '============================== 
       'SAVE TRANSACTION INFO HERE 
       '============================== 
       Dim sb As New StringBuilder 
       sb.Append("UPDATE dbo.tblTransactions ") 
       sb.Append("SET pp_txn_id='" & transactionID & "'") 
       sb.Append(", pp_payment_gross=" & dblAmount) 
       sb.Append(", pp_mc_fee=" & dblPayPalFee) 
       sb.Append(", memo='" & strMemo & "'") 
       sb.Append(", pp_payer_email='" & strPayerEmail & "'") 
       sb.Append(", pp_payment_date='" & strPaymentDate & "'") 
       sb.Append(" WHERE RowID =" & intRowID) 

       'SEND SQL TO DEVELOPER 
       sSend_Mail_From_done_aspx("INSERT statement BEFORE action", sb.ToString) 

       Dim conn As New SqlConnection(f1.fUseThisConnection(Server.MachineName)) 
       Dim cmd As New SqlCommand(sb.ToString, conn) 

       cmd.Connection.Open() 
       cmd.ExecuteNonQuery() 

       '========================================================= 
       'UPDATE ACCOUNT INFO HERE (ADD CREDITS TO CURRENT AMOUNT) 
       '========================================================= 
       Dim dr As System.Data.SqlClient.SqlDataReader 


       sb.Length = 0 
       'GET ACCOUNT ID, AND CreditsPurchased 
       sb.Append("SELECT AccountID, CreditsPurchased FROM dbo.tblTransactions ") 
       sb.Append(" WHERE RowID =" & intRowID) 

       cmd.CommandText = sb.ToString 
       dr = cmd.ExecuteReader() 

       If dr.Read() Then 

        intAccountID = dr("AccountID") 
        intCreditsPurchased = dr("CreditsPurchased") 


       End If 

       dr.Close() 


       sb.Length = 0 

       'AT 1.10 A CREDIT, WE DIVIDE THE AMOUNT PAYPAY CHARGES BY THIS TO GET CREDITS PURCHASED 

       sb.Append("UPDATE dbo.tblAL SET Credits = Credits + " & intCreditsPurchased) 
       sb.Append(" WHERE AccountID =" & intAccountID) 

       cmd.CommandText = sb.ToString 
       cmd.ExecuteNonQuery() 

       'SEND ACCOUNT UPDATE AMOUNT TO DEVELOPER 
       sSend_Mail_From_done_aspx(intCreditsPurchased & " CREDITS ADDED TO ", sb.ToString) 

       cmd.Dispose() 
       conn.Close() 
       conn = Nothing 

       MySession.Credits = intCreditsPurchased 


      Catch ex As Exception 
       sSend_Mail_From_done_aspx("tblTransactions NOT UPDATED with Transaction Info", ex.ToString()) 
      End Try 

     Else 
      sSend_Mail_From_done_aspx(Trim(vResponder).ToUpper, "TRANSACTION NOT VERIFIED") 

     End If 
    End Sub 

Tôi nghĩ rằng yêu cầu/đáp ứng được những dưới đây:

hình thức nộp

URL = "https://www.paypal.com/cgi-bin/webscr" 

gửi lại vấn đề này bên trong "notify_url" được đệ trình

Dim vWebRequest As System.Net.HttpWebRequest 
      Dim vSSend As Boolean = False 
      'vWebRequest = CType(System.Net.WebRequest.Create("https://www.sandbox.paypal.com/cgi-bin/webscr"), System.Net.HttpWebRequest) 
      vWebRequest = CType(System.Net.WebRequest.Create("https://www.paypal.com/cgi-bin/webscr"), System.Net.HttpWebRequest) 

Chắc chắn sẽ được tốt đẹp để có một "PayPalFiddle" haha ​​

Các vấn đề liên quan