PHP使用Curl调用PayPal RESTFUL API返回'未授权'

时间:2014-02-11 16:41:59

标签: php api rest paypal

我正在使用PayPal RESTful API并且能够使用curl从命令行创建事务,但是无法使用PHP使其工作,并且有一些关于API的一般性问题我还没有找到答案在文档中。我希望将用户引导到PayPal登录并处理付款,并根据我网站的表格输入将交易金额发送到网站。使用命令行中的curl,我可以使用:

成功获取PayPal会话令牌


    curl -v https://api.sandbox.paypal.com/v1/oauth2/token   -H "Accept: application/json"   -H "Accept-Language: en_US"   -u "[client id]:[secret]"   -d "grant_type=client_credentials"

这将按预期返回带有访问令牌的响应。在PHP中,我正在进行相同的curl请求并获得相同的结果,因此这一步没有问题。

获得令牌后,我可以使用它通过命令行上的curl使用以下代码进行购买:


    curl -v https://api.sandbox.paypal.com/v1/payments/payment -H 'Content-Type: application/json' -H 'Authorization: Bearer [token]' -d '{
    "redirect_urls":{
    "return_url":"http://ruxed.com/thank-you/",
    "cancel_url":"http://ruxed.com/make-a-payment/"
    },
    "payer":{
    "payment_method":"paypal"
    },
    "transactions":[
    {
    "amount":{
    "total":"10.00",
    "currency":"USD"
    }
    }
    ]
    }'

这可以很好地从curl命令行开始,因为我得到一个响应,表明付款成功,然后我可以登录我的PayPal Developer仪表板并查看记录的记录。然而,我对此感到困惑,因为我没有提供任何来自此付款的帐户 - 我没有提供PayPal用户名或任何其他信息,那么PayPal如何知道从哪里获取这些资金?

从PHP开始,我正在进行相同的卷曲调用,但是我收到了“未经授权的401”回复。这里是curl的代码:( stackoverflow上的代码格式化在这里为我提出,不允许我用代码包装器提交问题,所以没有代码包装器。)

$headers = array( # BUILD HEADERS FOR CURL
sprintf('Authorization: Bearer %s', $_POST['token']),
'Content-Type: application/json'
);
$data = array( # BUILD DATA FOR CURL
'intent' => 'sale',
"redirect_urls" => array(
"return_url" => "http://ruxed.com/thank-you/",
"cancel_url" => "http://ruxed.com/make-a-payment/"
),
"payer" => array( "payment_method" => "paypal" ),
"transactions" => array(
array(
"amount" => array(
"total" => $_POST['actual_payment'],
"currency" => "USD"
)
)
)
);
$curl = curl_init( "https://api.sandbox.paypal.com/v1/payments/payment" ); // INIT CURL
curl_setopt( $curl, CURLOPT_POST, true ); 
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $curl, CURLOPT_HEADER, $headers ); // SET HEADERS
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); 
curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode( $data ) ); // SET POST DATA
$result = curl_exec( $curl ); # ROCK THE CURL
if( empty( $result ) ) die( curl_error( $curl ) ); # IF RESPONSE IS EMPTY, THERE WAS AN ERROR
curl_close( $curl ); # CLOSE THE CURL

我希望上面的代码会指示用户使用PayPal登录他们的帐户并处理正在传递的金额的付款,因为我没有在我的网站上请求他们的PayPal登录凭据。我的PHP curl请求有什么问题,它是未经授权的,我正在以正确的方式接近它吗?

1 个答案:

答案 0 :(得分:0)

@ user2252436

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

我认为CURLOPT_HEADER需要一个int或bool,无论是1还是TRUE来发送标题。

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

e.g。

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