2016-08-02 3 views
6

Ich versuche, Transaktionsdetails von PayPal SOAP API zu erhalten, aber ich renne in Fehler von PayPal. Es gibt den Fehler:Abrufen von Transaktionsdetails von PayPal SOAP API (hoffentlich auch benutzerdefinierte Felder)

The transaction id is not valid 

Ich weiß, dass es eine gültige Transaktions-ID ist, da ich bin ich bin in der Lage zu Transaktionsdetails mit dem PayPal NVP API zu bekommen, aber vielleicht habe ich die SOAP-Anforderung falsch formatiert. Ich folgte den SOAP-API-Beispielen von PayPal, die ich im Web finden kann, um die SOAP-XML zu erstellen, aber sie sind schlank. Ich verwende Macs PAW-Programm, um eine SOAP-Anfrage an die API von PayPal zu senden, aber dieses Problem sollte mit einem HTTP-Client reproduzierbar sein.

Ich habe versucht, PayPal REST API, aber there's no method to get transaction details (z. B. Name, E-Mail, Betrag bezahlt, benutzerdefinierte Felder) zu verwenden. Ich habe auch versucht, die NVP (Name-Value-Pair) API zu verwenden, und ich bekomme die Transaktionsdetails zurück, aber es gibt mir nicht alle gespeicherten benutzerdefinierten Felder für eine Transaktion. Wenn ich mich bei PayPal anmelde und eine einzelne Transaktion ansehe, kann ich alle benutzerdefinierten Felder für diese Transaktion sehen, sodass ich weiß, dass sie gespeichert werden.

Die SOAP-API ist meine letzte Hoffnung.

Hier ist die SOAP-Umschlag Anfrage Ich verwende:

<?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> 

Hier ist die Antwort, die ich von der PayPal-SOAP-API erhalten:

<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> 

Ich bin nicht sicher, was mache ich falsch aber vielleicht kann jemand mit mehr Erfahrung den Fehler leichter finden als ich. Ich habe auf die Frage eines anderen Benutzers über die PayPal-REST-API geantwortet und Transaktionsdetails davon erhalten, aber soweit ich weiß, gibt es keine Möglichkeit, dies zu tun Get customer details after transaction. Wenn Sie einen Weg gefunden haben, dies mit der REST-API zu erreichen, lassen Sie es mich wissen, denn ich würde lieber REST als SOAP verwenden.

Danke.

+0

Was ist Ihre serverseitige Sprache, die Sie zum Senden empfangen? Ich benutze asp.net, aber ziemlich sicher, dass es nicht XML benutzt. – JustJohn

+0

@JustJohn Ich plante, PHP zu verwenden, um den Aufruf der PayPal SOAP API zu machen, aber wenn ich es nicht mit Paw oder Postman arbeiten kann, bezweifle ich, dass der PHP-Aufruf funktionieren würde und würde mich nur weiter verwirren. Wenn Sie die SOAP-API von PayPal verwenden, kompiliert das ASP.net-Programm einen XML-Aufruf, der an die SOAP-API von PayPal gesendet wird. –

Antwort

1

Die Fehlermeldung eine falsche Fährte zu haben ist schön. PayPal kann keine TransactionId finden und meldet die leere TransactionId als ungültig. Das Element TransactionId gehört zum Namensbereich urn:ebay:api:PayPalAPI. Ihr XML verbindet es mit dem Namespace . Alles, was Sie tun müssen, ist die ebl:TransactionId zu ns:TransactionId zu ändern.

<?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> 

prüfen diese example at the PayPal KB.

+0

das funktioniert. Es sieht so aus, als würde die SOAP-API von PayPal nur zwei der möglichen sieben Optionen abrufen, die sie speichern kann. Dies ist ein bekanntes Problem mit der NVP- und SOAP-API http://stackoverflow.com/questions/16764186/gettransactiondetails-doesnt-report-part-of-order-options –

0

Ich hätte dies als Kommentar, aber es ist ziemlich voll von goble gook. Auf Kosten des weit entfernten Weges könnte ich vielleicht eine Hilfe sein. Also sendet mein vb.net-Code ein Formular an paypal, das "notify_url" enthält.

  ' 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> 

Da ist in meinem "notify_url" Seite zu laden, wird es, was PayPal sendet nach Transaktion abgeschlossen ist. Sie werden feststellen, dass eine Menge Debug-E-Mails an mich zurückgeschickt werden. Das war mein Tun.

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 

Ich denke, die Anfrage/Antworten sind diese unter:

vorgelegten Form

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

sendet dazu in der "notify_url", die eingereicht wird

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) 

Sicher würde ein „PayPalFiddle“ haha ​​

Verwandte Themen