PayPal Express Checkout服务器端,身份验证故障



我到处搜索了很多东西,但我没有找到问题的答案。

我无法使它起作用。我的PayPal按钮正在使用Express Checkout Server端休息,但是在我测试的客户端时,它很容易,并且可以正常工作。

我正在使用Codeigniter,所以这是我的代码。

这是我的视图文件夹中的JavaScript代码。CREATE_URLEXECUTE_URL转到控制器。

paypal.Button.render({
        env: 'sandbox', // sandbox | production
        // Show the buyer a 'Pay Now' button in the checkout flow
        commit: true,
        // payment() is called when the button is clicked
        payment: function() {
            // Set up a url on your server to create the payment
            var CREATE_URL = '/projects/createurl';
            // Make a call to your server to set up the payment
            return paypal.request.post(CREATE_URL)
                .then(function(res) {
                    return res.paymentID;
                });
        },
        // onAuthorize() is called when the buyer approves the payment
        onAuthorize: function(data, actions) {
            // Set up a url on your server to execute the payment
            var EXECUTE_URL = '/projects/executeurl';
            // Set up the data you need to pass to your server
            var data = {
                paymentID: data.paymentID,
                payerID: data.payerID
            };
            // Make a call to your server to execute the payment
            return paypal.request.post(EXECUTE_URL, data)
                .then(function (res) {
                    window.alert('Payment Complete!');
                });
        }
    }, '#paypal-button-container');

这是CREATE_URL控制器

public function createurl() {
            $ch = curl_init();
    $clientId = "something";
    $secret = "something";
    curl_setopt($ch, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/oauth2/token");
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSLVERSION , 6); 
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERPWD, $clientId.":".$secret);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
    $result = curl_exec($ch);
    if(empty($result))die("Error: No response.");
    else
    {
        $json = json_decode($result, TRUE);
    }

    curl_close($ch); 

    $ch2 = curl_init();
    $token = $json['access_token'];
    $data = '{
            "transactions": [{
            "amount": {
                "currency":"EUR",
                "total":"12"
            },
            "description":"creating a payment"
            }],
            "payer": {
                "payment_method":"paypal"
            },
            "intent":"sale",
            "redirect_urls": {
                "cancel_url":"https://mysite.gr/projects/project/10",
                "return_url":"https://mysite.gr/projects/project/10"
            }
       }'; 

    curl_setopt($ch2, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/payments/payment");
    curl_setopt($ch2, CURLOPT_VERBOSE, 1);
    curl_setopt($ch2, CURLOPT_HEADER, 0);
    curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch2, CURLOPT_HTTPHEADER , "Content-Type: application/json");
    curl_setopt($ch2, CURLOPT_HTTPHEADER , "Authorization: Bearer ".$token);
    curl_setopt($ch2, CURLOPT_POST, 1);
    curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch2, CURLOPT_POSTFIELDS, $data);
    $result = curl_exec($ch2);
    $json = json_decode($result, TRUE); 
    print_r($json);
    curl_close($ch2);
} 

因此,当我单击PayPal按钮时 - 失败。从控制台的日志:

ppxo_no_token_passed_to_payment

ppxo_unhandled_error {stack:"错误:没有付款的值 https://w…://www.paypalobjects.com/api/checkout.js:3076:13(",errtype: " [对象错误]"

未接收错误:没有付款的价值

以及当我输入控制器进入URL以查看阵列时,它说的是:

array([名称] => authentication_failure [message] =>身份验证 由于无效的身份验证凭证或丢失而失败 授权标题。[links] => array([0] => array([[href] =>( https://developer.paypal.com/docs/api/overview/#error [rel] => Information_Link(((

好吧,我解决了我的问题,我终于找到了解决方案,现在它非常好!

authentication_failure [message] =>身份验证由于无效的身份验证凭证或缺少的授权标题。

这是因为我要发送两个单独的httpheaders,而不是一个,结果是互相覆盖。因此,正确的方法是在这样的httpheader的第三个参数中传递数组:

curl_setopt($ch2, CURLOPT_HTTPHEADER , array("Content-Type: application/json", "Authorization: Bearer myaccesstokenishere"));

之后,我仍然有问题:

ppxo_no_token_passed_to_payment

ppxo_unhandled_error {stack:; quord;

未接收错误:没有付款的价值

要解决这个问题,我只是在没有JSON_DECODE的情况下呼应结果:

$result = curl_exec($ch2);
echo $result;
curl_close($ch2);

现在一切都起作用。

executeurl控制器非常容易,如果有人要我发布它告诉我。

我希望我能帮助一个有类似问题的人。

最新更新