【问题标题】:PayPal API returning 500 IS Error when trying to get transactionPayPal API 在尝试获取交易时返回 500 IS 错误
【发布时间】:2017-07-10 15:56:48
【问题描述】:

我正在尝试找出为什么我的 Curl 请求不适用于 PayPal API。我有以下查询可以正常获取身份验证令牌:

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 IS 错误:

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] 的值是从PayPal-Checkout.JS 系统传回的PAY-xxxx 交易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>"

我错过了什么?谢谢!

【问题讨论】:

  • 看起来像 Paypal API 中的一个错误。它在他们身边抛出了一个NPE。这可能意味着您的请求中的错误导致服务器上出现错误。
  • @JimGarrison -NPE ?
  • NullPointerException.
  • @JimGarrison 好的。嗯,在那种情况下不知道从这里去哪里。据我所见,我正在按照期望传递所有内容:/
  • 如果您得到解决方案,请将其作为答案发布,然后在所需的等待期后自行接受,以便其他人可以轻松看到解决方案。

标签: perl paypal paypal-rest-sdk


【解决方案1】:

好的,我刚收到 PayPal 技术人员的回复。看起来这个特定的函数需要一个 GET 而不是 POST

我看到您正在尝试在需要使用 GET 的地方使用 POST( REST API 流需要一个 GET 才能让您获得交易 细节。得到 https://api.sandbox.paypal.com/v1/payments/payment/可以 您尝试将其更改为 GET 吗?我希望这能解决问题。

...果然,解决了它:)

对于任何想知道我是如何做出这种改变的人,我只是注释掉了:

$curl->setopt(CURLOPT_POST,1);

curl 在发送请求时默认为 GET。

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 2014-09-01
    • 2019-12-21
    • 2018-01-18
    • 1970-01-01
    • 2014-04-29
    • 2017-07-17
    • 2017-11-27
    相关资源
    最近更新 更多