paypal rest api支付调用使用php返回401

Posted

技术标签:

【中文标题】paypal rest api支付调用使用php返回401【英文标题】:paypal rest api payment call returning 401 using php 【发布时间】:2013-09-01 06:13:50 【问题描述】:

我正在尝试将贝宝添加到我的网站。我一直按照https://developer.paypal.com/webapps/developer/docs/integration/direct/make-your-first-call/ 的说明进行操作,但它不起作用。我已成功发送访问令牌请求并得到响应。响应中的信息存储在一个名为 $accessToken 的对象中。当我尝试从上面列出的站点在步骤 3 中进行 API 调用时,问题就出现了。我收到从请求发回的 401 错误。我很确定将请求作为函数参数发送到的 $url 是正确的。它是https://api.sandbox.paypal.com/v1/payments/payment。在过去的一个半星期里,我一直在互联网上寻求帮助,但我没有任何进展。任何帮助将不胜感激。谢谢!

function MakePaymentAPICall($accessToken, $sale, $url, $url_success, $url_cancel)

// Create cURL resource
$ch = curl_init();

// Set url
curl_setopt($ch, CURLOPT_URL, $url);

$tokenType = $accessToken->GetTokenType();
$token = $accessToken->GetAccessToken();
$auth = "Authorization:" . $tokenType . " " . $token;
$saleTotal = $sale->GetTotal();

$header = array(
'Content-Type' => 'application/json',
'Authorization' => $tokenType . ' ' . $token
);


$dataArray = array(
    'intent' => 'sale',
    'redirect_urls' => array(
            'return_url' => $url_success,
            'cancel_url' => $url_cancel
        ),
    'payer' => array(
            'payment_method' => 'paypal'
        ),
    'transactions' => array(
            'amount' => array(
                    'total' => $saleTotal,
                    'currency' => 'USD'
                ),
            'description' => 'Test payment.'
        )
);


curl_setopt($ch, CURLOPT_HEADER, http_build_query($header));


// set data to post
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($dataArray));


curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);


// Execute curl command
$output = curl_exec($ch);


// Get info about request
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);


// Close cURL resource to free up system resources
curl_close($ch);

return $output;

// MakePaymentAPICall 函数

【问题讨论】:

你是怎么解决的? 【参考方案1】:

@Jason247

http://php.net/manual/en/function.curl-setopt.php

我认为 CURLOPT_HEADER 需要一个 int 或 bool(1 或 TRUE)来发送标头。

我相信 CURLOP_HTTPHEADER 是您想要的,您可以直接将数组传递给它,而无需编码为查询字符串。

例如

curl_setopt($curlHandle, CURLOPT_HEADER, 1);
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, $curlHeaders);

【讨论】:

【参考方案2】:

401 错误通常表示访问令牌无效或已过期: https://developer.paypal.com/webapps/developer/docs/integration/direct/rest-payments-error-handling/

您是否在 Authorization 标头中包含“Bearer”?示例:

Authorization:Bearer EMxItHE7Zl4cMdkvMg-f7c63GQgYZU8FjyPWKQlpsqQP

【讨论】:

是的,在标题数组中我有 'Authorization' => $tokenType 。 ' ' 。 $令牌。 $tokenType 包含“Bearer”,$token 包含访问令牌。谢谢! 我仍然被这个问题困扰。有人可以帮忙吗?

以上是关于paypal rest api支付调用使用php返回401的主要内容,如果未能解决你的问题,请参考以下文章

用于支付流的 Paypal PHP REST API

PayPal Rest API、validation_error、Laravel 全支付

Paypal PHP Rest API 用于信用卡支付,如何处理错误以显示给用户

如何将 PayPal 智能支付按钮与 PHP V2 的 REST API SDK 结合起来?

PayPal智能支付按钮与服务器端REST API集成

PayPal REST API - 使用 PHP 和 curl 进入实时模式