2016-08-02 6 views
6

Я пытаюсь получить сведения о транзакции из SOAP API от PayPal, но у меня возникла ошибка с PayPal. Она возвращает ошибку:Получение информации о транзакции из API-интерфейса PayPal SOAP (надеюсь, также настраиваемые поля)

The transaction id is not valid 

Я знаю, что это действительный идентификатор транзакции, так как я я могу получить сведения о транзакции с помощью API PayPal НВП, но, может быть, у меня есть запрос SOAP неправильно отформатирован. Я следил за примерами API-интерфейса PayPal SOAP, которые я могу найти в Интернете для создания SOAP XML, но они тонкие. Я использую программу PAW от mac для отправки SOAP-запроса в API PayPal, но эта проблема должна быть воспроизводимой с использованием HTTP-клиента.

Я попытался использовать API REST PayPal, но there's no method to get transaction details (например, имя, адрес электронной почты, сумма оплаченных, настраиваемые поля). Я также попытался использовать NVP (Name-Value-Pair) API, и я верну подробности транзакции, но он не дает мне все сохраненные настраиваемые поля для транзакции. Когда я вхожу в систему PayPal и просматриваю одну транзакцию, я могу видеть все пользовательские поля для этой транзакции, поэтому я знаю, что они хранятся.

SOAP API - моя последняя надежда.

Вот запрос SOAP конверт, я использую:

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

Вот ответ я получаю от 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> 

Я не уверен, что я делаю неправильно но, возможно, кто-то с большим опытом может обнаружить ошибку легче, чем я могу. Я ответил на вопрос другого пользователя о API-интерфейсе PayPal REST и получении данных транзакции, но, насколько я знаю, нет никакого способа сделать это Get customer details after transaction. Если вы нашли способ выполнить это с помощью REST API, сообщите мне, потому что я бы скорее использовал REST, чем SOAP.

Спасибо.

+0

Каков ваш серверный язык, который вы используете для отправки? Я использую asp.net, но довольно уверен, что он не использует XML. – JustJohn

+0

@JustJohn Я планировал использовать PHP для вызова метода SOAP API PayPal, но если я не могу заставить его работать с Paw или Postman, я сомневаюсь, что вызов PHP будет работать и просто еще больше смутит меня. Если вы используете API-интерфейс PayPal SOAP, то вы являетесь программой ASP.net, которая компилирует XML-вызов для отправки в API SOAP PayPal. –

ответ

1

Сообщение об ошибке является отвлекающим маневром. PayPal не может найти TransactionId, указав пустой TransactionId как недействительный.

Элемент TransactionId принадлежит к пространству имен urn:ebay:api:PayPalAPI. Ваш XML привязывает его к пространству имен urn:ebay:apis:eBLBaseComponents. Все, что вам нужно сделать, это изменить ebl:TransactionId на 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> 

Проверить это example at the PayPal KB.

+0

это работает. Похоже, что SOAP API PayPal по-прежнему будет извлекать только два из семи возможных вариантов. Это известная проблема с API NVP и SOAP. Http://stackoverflow.com/questions/16764186/gettransactiondetails-doesnt-report-part-of-the-order-options –

0

Я бы поставил это как комментарий, но он довольно полный goobly gook. Может быть, я, возможно, немного помогу. Итак, мой код vb.net отправляет форму на paypal, которая включает в себя «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> 

Тогда в моей «notify_url» при загрузке страницы он получает то, что PayPal отправляет обратно после завершения транзакции. Вы заметите, что тонну отладочных писем отправляется мне обратно. Это было мое дело.

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 

Я думаю, что запрос/ответы эти ниже:

представлен вид

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

отсылает обратно к этому внутри "notify_url", который представлен

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) 

Конечно было бы неплохо иметь «PayPalFiddle» ха-ха

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

  • Нет связанных вопросов^_^