2013-10-07 47 views
1

我想弄清楚paypal API,并且我有下面的代码,它应该进行调用,获取访问令牌,然后进行API调用。第一部分工作(直到$accesstoken行),并正确返回访问令牌,但第二部分不返回任何内容。这是应该模仿的代码可以在这里找到:Make Your First CallPayPal API,Curl不返回任何输出

$url = "https://api.sandbox.paypal.com/v1/oauth2/token"; 
$headers = array(
    'Accept' => 'application/json', 
    'Accept-Language' => 'en_US', 
); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=client_credentials'); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_USERPWD, $clientID . ':' . $clientSecret); 
$curl = curl_exec($ch); 

$x = json_decode($curl, TRUE); 
print_r($x); 
$accesstoken = $x['access_token']; 


$headers2 = array(
    'Content-Type' => 'application/json', 
    'Authorization' => 'Bearer' . $accesstoken 
); 

$data = array(
    "intent" => "sale", 
    "redirect_urls" => array(
     "return_url" => "http://example.com/your_redirect_url/", 
     "cancel_url" => "http://example.com/your_cancel_url/" 
    ), 
    "payer" => array(
     "payment_method" => "paypal" 
    ), 
    "transactions" => array(
     "transactions" => array(
      "total" => ".99", 
      "currency" => "USD" 
     ) 
    ) 
); 

$saleurl = "https://api.sandbox.paypal.com/v1/payments/payment"; 

$sale = curl_init(); 
curl_setopt($sale, CURLOPT_URL, $saleurl); 
curl_setopt($sale, CURLOPT_VERBOSE, TRUE); 
curl_setopt($sale, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($sale, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($sale, CURLOPT_SSL_VERIFYHOST, FALSE); 
curl_setopt($sale, CURLOPT_POSTFIELDS, json_encode($data)); 
curl_setopt($sale, CURLOPT_HTTPHEADER, $headers2); 
$finalsale = curl_exec($sale); 

$verb = json_decode($finalsale, TRUE); 
print_r($verb); 

卷翘不作完整意义上的对我来说,任何帮助,将不胜感激。

更新: 我改变了标题的格式:

$headers2 = array(
    'Content-Type: application/json', 
    'Authorization: Bearer ' . $accesstoken 
); 

按其中一个答案。现在,它显示:

[name] => MALFORMED_REQUEST 
[message] => Incoming JSON request does not map to API request 
[information_link] => https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST 
[debug_id] => f53a882702a04 
+1

在你的产品代码总是验证同行和验证安全主机:http://docforge.com/wiki/PHP/Curl –

+1

从不假定外部调用成功。你不检查curl_exec()中的返回值是否为boolean false,这表示失败。你只需要返回的值,并尝试json_decode它。至少你应该更像'if(($ result = $ curl_exec($ handle)=== FALSE){die(curl_error($ handle));}' –

+0

@Matt,我现在正在测试,但是($结果= curl_exec($ sale))=== FALSE){echo“Error。”; die(curl_error($ sale))当然,SSL是一个必须的,一旦我在线 –

回答

2

您没有正确设置你的头......

$headers = array(
    'Accept: application/json', 
    'Accept-Language: en_US' 
); 

$headers2 = array(
    'Content-Type: application/json', 
    'Authorization: Bearer ' . $accesstoken 
); 

是正确的格式。

还要注意(空间)承载后,插图中的$的accessToken

编辑:更新您的JSON(我认为这是正确的,但呼应出来,并检查它与参考,我可能有一对多阵列()

$data = array(
    "intent" => "sale", 
    "redirect_urls" => array(
     "return_url" => "http://example.com/your_redirect_url/", 
     "cancel_url" => "http://example.com/your_cancel_url/" 
    ), 
    "payer" => array(
     "payment_method" => "paypal" 
    ), 
    "transactions" => array(array(
      "amount" => array(
       "total" => ".99", 
       "currency" => "USD" 
      ) 
     ) 
    ) 
); 
+0

现在它给出了关于格式错误的请求的错误,“传入的JSON请求没有映射到API请求” –

+1

现在它给了我:“货币金额必须是非负数,可以选择包含精确的2位小数由'。'隔开,可选的千位分隔符',',限制在小数点前的7位数“ –

+0

加0(0.99 vs .99)固定。 –

1

你需要在这里

$headers2 = array(
    'Content-Type' => 'application/json', 
    'Authorization' => 'Bearer ' . $accesstoken // Added a space after Bearer 
); 

的空间看看现在的工作

+0

这似乎没有改变任何东西,尽管你对这个空间是正确的,我的意思是包括它。 –

0

更改 curl_setopt($ sale,CURLOPT_POSTFIELDS,json_encode($ data));

到 curl_setopt($ sale,CURLOPT_POSTFIELDS,$ data);

JSON的编码功能打破它