2017-02-21 140 views
1

我正在努力解決爲什麼我的Curl請求不適用於PayPal API。我有以下查詢工作的罰款,以獲得身份驗證令牌:PayPal API返回500 IS嘗試獲取交易時出錯

sub get_token { 

    my $curl = WWW::Curl::Easy->new(); 
    my $fh = 'README'; 

    $curl->setopt(CURLOPT_HEADER,0); # dont want the headers, or they will break the json reading! 
    $curl->setopt(CURLOPT_URL,"https://".$config->{$config->{mode}}->{transaction_endpoint}."/v1/oauth2/token"); 
    $curl->setopt(CURLOPT_POSTFIELDS,"grant_type=client_credentials"); 
    $curl->setopt(CURLOPT_USERPWD, $config->{$config->{mode}}->{system_client_id}.":".$config->{$config->{mode}}->{system_secret}); 
    $curl->setopt(CURLOPT_SSL_VERIFYPEER,0); 
    $curl->setopt(CURLOPT_SSL_VERIFYHOST,0); 
    $curl->setopt('CURLOPT_RETURNTRANSFER',1); 
    $curl->setopt(CURLOPT_POST,1); 

    my $response_body; 

    open(my $fh, '>', \$response_body); 
    $curl->setopt(CURLOPT_WRITEDATA, $fh); 
    $curl->setopt(CURLOPT_VERBOSE,0); 
    my $retcode = $curl->perform(); 

    if ($retcode != 0) { 
     warn "An error happened: ", $curl->strerror($retcode), " ($retcode)\n"; 
     warn "errbuf: ", $curl->errbuf; 
    } 

    my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); 
    use JSON; 
    my $json_vals = decode_json($response_body); 

    return $json_vals->{access_token}; 
} 

..但後來當我嘗試使用下面的相同的邏輯來獲得交易時,出現一個500錯誤:

sub get_proper_trans_id { 

    my $token = get_token($_[0]); 

    print $IN->header('utf8'); 

    my $curl = WWW::Curl::Easy->new(); 
    my $fh = 'README'; 

    my @headers = ("Authorization: Bearer $token","Content-Type: application/json; charset=utf-8"); 

    print qq|Getting: https://$config->{$config->{mode}}->{transaction_endpoint}/v1/payments/payment/$_[0] \n|; 

    $curl->setopt(CURLOPT_HTTPHEADER,\@headers); 
    $curl->setopt(CURLOPT_HEADER,1); 
    $curl->setopt(CURLOPT_URL,"https://$config->{$config->{mode}}->{transaction_endpoint}/v1/payments/payment/$_[0]"); 
    $curl->setopt(CURLOPT_SSL_VERIFYPEER,0); 
    $curl->setopt(CURLOPT_SSL_VERIFYHOST,0); 
    $curl->setopt('CURLOPT_RETURNTRANSFER',1); 
    $curl->setopt(CURLOPT_POST,1); 

    my $response_body; 

    open(my $fh, '>', \$response_body); 
    $curl->setopt(CURLOPT_WRITEDATA, $fh); 
    $curl->setopt(CURLOPT_VERBOSE,1); 
    my $retcode = $curl->perform(); 

    if ($retcode != 0) { 
     warn "An error happened: ", $curl->strerror($retcode), " ($retcode)\n"; 
     warn "errbuf: ", $curl->errbuf; 
    } 

    my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); 

} 

傳入get_proper_trans_id()$_[0]的值爲PAY-xxxx從PayPal-Checkout.JS系統傳回的交易ID。

如果我手動運行該curl命令,它的工作原理:

curl https://$config->{$config->{mode}}->{transaction_endpoint}/v1/payments/payment/$_[0] -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer $token" 

的問題是,我在使用該方法UTF8的問題,所以我想找到一個模塊,將做的工作爲了我。

這裏是curl的輸出(帶有調試和頭文件);

* Hostname was NOT found in DNS cache 
* Trying 173.0.82.78... 
* Connected to api.sandbox.paypal.com (173.0.82.78) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* SSL connection using TLSv1.2/AES256-SHA256 
* Server certificate: 
*  subject: C=US; ST=California; L=San Jose; O=PayPal, Inc.; OU=PayPal Production; CN=api.sandbox.paypal.com 
*  start date: 2016-01-13 00:00:00 GMT 
*  expire date: 2018-01-13 23:59:59 GMT 
*  issuer: C=US; O=Symantec Corporation; OU=Symantec Trust Network; CN=Symantec Class 3 Secure Server CA - G4 
*  SSL certificate verify ok. 
> POST /v1/payments/payment/PAY-6KY19646FF321593HLCVRQSY HTTP/1.1 
Host: api.sandbox.paypal.com 
Accept: */* 
Authorization: Bearer MY_TOKEN_HERE 
Content-Type: application/json; charset=utf-8 
Expect: 100-continue 

< HTTP/1.1 500 Internal Server Error 
< Date: Tue, 21 Feb 2017 06:38:03 GMT 
* Server Apache is not blacklisted 
< Server: Apache 
< paypal-debug-id: 217b14fc80976 
< Connection: close 
< X-SLR-RETRY: 500 
< X-SLR-RETRY-API: /v1/payments/payment/{id} 
< Connection: close 
< Paypal-Debug-Id: 217b14fc80976 
< Set-Cookie: X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D1880%26app%3Dplatformapiserv%26TIME%3D1273015128%26HTTP_X_PP_AZ_LOCATOR%3D; Expires=Tue, 21 Feb 2017 07:08:03 GMT; domain=.paypal.com; path=/; Secure; HttpOnly 
< Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT 
< Vary: Authorization 
< Content-Length: 196 
< Content-Type: text/xml;charset=UTF-8 
< 
* Closing connection 0 
GOT: 

"HTTP/1.1 500 Internal Server Error 
Date: Tue, 21 Feb 2017 06:38:03 GMT 
Server: Apache 
paypal-debug-id: 217b14fc80976 
Connection: close 
X-SLR-RETRY: 500 
X-SLR-RETRY-API: /v1/payments/payment/{id} 
Connection: close 
Paypal-Debug-Id: 217b14fc80976 
Set-Cookie: X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D1880%26app%3Dplatformapiserv%26TIME%3D1273015128%26HTTP_X_PP_AZ_LOCATOR%3D; Expires=Tue, 21 Feb 2017 07:08:03 GMT; domain=.paypal.com; path=/; Secure; HttpOnly 
Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT 
Vary: Authorization 
Content-Length: 196 
Content-Type: text/xml;charset=UTF-8 

<ns1:XMLFault xmlns:ns1="http://cxf.apache.org/bindings/xformat"><ns1:faultstring xmlns:ns1="http://cxf.apache.org/bindings/xformat">java.lang.NullPointerException</ns1:faultstring></ns1:XMLFault>" 

我錯過了什麼?謝謝!

+2

看起來像Paypal API中的錯誤。它向他們扔了一個NPE。這可能意味着請求中的錯誤會在服務器上出現錯誤。 –

+0

@JimGarrison -NPE? –

+0

NullPointerException。 –

回答

0

好吧,我剛剛從PayPal Tech的回覆。這似乎是這個特殊的功能需要GET的代替POST

I see you are trying to use a POST where you need to use a GET (the REST API flow needs a GET for you to be able to get transaction details. GET https://api.sandbox.paypal.com/v1/payments/payment/ Can you try changing it for a GET? I hope this sorts it.

...果然,這固定它:)

對於任何人知道我是如何做出改變,我剛剛註釋掉了:

$curl->setopt(CURLOPT_POST,1); 

curl在發送請求時默認爲GET。

相關問題