使用 curl php 捕获 Paypal 付款
Capture Paypal payment using curl php
curl 'https://api.paypal.com/v1/payments/authorization/4TD55050SV609544L/capture' \
-H "Content-Type: application/json" \
-H "Paypal-Application-Correlation-Id: c2edbd6e97b14ff2b19ddb8eec9d264c" \
-H "Authorization: Bearer WfXdnxmyJtdF4q59ofxuQuAAk6eEV-Njm6puht3Nk3w" \
-d '{
"amount":{
"currency":"USD",
"total":"1.50"
},
"is_final_capture":true
}'
我需要使用 curl
功能来实现此功能,但我在 PHP 上没有收到任何回复。
我就是这样做的。但我没有得到回应。我不想使用 sdk 必须使用 curl 来做到这一点。
$data = array(
"amount" => array(
"currency" => "USD",
"total" => $amount
),
"is_final_capture" => "true"
);
$data_string = json_encode($data);
$ch = curl_init( "https://api.paypal.com/v1/payments/authorization/$auth_id/capture" );
curl_setopt_array( $ch, array(
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string),
'Authorization: Bearer ' . $access_token
//
),
CURLOPT_POSTFIELDS => $data_string,
CURLOPT_RETURNTRANSFER => 真
)
);
$result = curl_exec( $ch );
var_dump($result); die;
首先,不要对 POST 使用 CURLOPT_CUSTOMREQEST,使用 CURLOPT_POST。
第二,在你的 curl 命令行中,你发送了一个 JSON 到 paypal,但是在 php 中,你发送了一个无效的字符串到 CURLOPT_POSTFIELDS 并且......可能会出现未定义的行为(使用 http_build_query 作为 POSTFIELDS,而不是 json_encode)。要在 PHP 的 curl 中发送 json 请求正文,请使用 CURLOPT_INFILE,如下所示:
<?php
$postdata='{
"amount":{
"currency":"USD",
"total":"1.50"
},
"is_final_capture":true
}';
$postdatafileh=tmpfile();
fwrite($postdatafileh,$postdata);
rewind($postdatafileh);
$ch=curl_init();
curl_setopt_array($ch,array(
CURLOPT_URL=>'https://api.paypal.com/v1/payments/authorization/$auth_id/capture',
CURLOPT_HTTPHEADER=>array(
'Content-Type: application/json',
'Paypal-Application-Correlation-Id: foo',
'Authorization: Bearer barbaz',
'Content-Length: '.strlen($postdata)
),
CURLOPT_INFILE=>$postdatafileh,
CURLOPT_INFILESIZE=>strlen($postdata),
CURLOPT_VERBOSE=>true,
CURLOPT_SSL_VERIFYPEER=>false,
CURLOPT_ENCODING=>'',
CURLOPT_POST=>true
));
$ret=curl_exec($ch);
fclose($postdatafileh);
var_dump($ret,curl_errno($ch),curl_error($ch));
curl 'https://api.paypal.com/v1/payments/authorization/4TD55050SV609544L/capture' \
-H "Content-Type: application/json" \
-H "Paypal-Application-Correlation-Id: c2edbd6e97b14ff2b19ddb8eec9d264c" \
-H "Authorization: Bearer WfXdnxmyJtdF4q59ofxuQuAAk6eEV-Njm6puht3Nk3w" \
-d '{
"amount":{
"currency":"USD",
"total":"1.50"
},
"is_final_capture":true
}'
我需要使用 curl
功能来实现此功能,但我在 PHP 上没有收到任何回复。
我就是这样做的。但我没有得到回应。我不想使用 sdk 必须使用 curl 来做到这一点。
$data = array(
"amount" => array(
"currency" => "USD",
"total" => $amount
),
"is_final_capture" => "true"
);
$data_string = json_encode($data);
$ch = curl_init( "https://api.paypal.com/v1/payments/authorization/$auth_id/capture" );
curl_setopt_array( $ch, array(
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string),
'Authorization: Bearer ' . $access_token
//
),
CURLOPT_POSTFIELDS => $data_string,
CURLOPT_RETURNTRANSFER => 真
)
);
$result = curl_exec( $ch );
var_dump($result); die;
首先,不要对 POST 使用 CURLOPT_CUSTOMREQEST,使用 CURLOPT_POST。 第二,在你的 curl 命令行中,你发送了一个 JSON 到 paypal,但是在 php 中,你发送了一个无效的字符串到 CURLOPT_POSTFIELDS 并且......可能会出现未定义的行为(使用 http_build_query 作为 POSTFIELDS,而不是 json_encode)。要在 PHP 的 curl 中发送 json 请求正文,请使用 CURLOPT_INFILE,如下所示:
<?php
$postdata='{
"amount":{
"currency":"USD",
"total":"1.50"
},
"is_final_capture":true
}';
$postdatafileh=tmpfile();
fwrite($postdatafileh,$postdata);
rewind($postdatafileh);
$ch=curl_init();
curl_setopt_array($ch,array(
CURLOPT_URL=>'https://api.paypal.com/v1/payments/authorization/$auth_id/capture',
CURLOPT_HTTPHEADER=>array(
'Content-Type: application/json',
'Paypal-Application-Correlation-Id: foo',
'Authorization: Bearer barbaz',
'Content-Length: '.strlen($postdata)
),
CURLOPT_INFILE=>$postdatafileh,
CURLOPT_INFILESIZE=>strlen($postdata),
CURLOPT_VERBOSE=>true,
CURLOPT_SSL_VERIFYPEER=>false,
CURLOPT_ENCODING=>'',
CURLOPT_POST=>true
));
$ret=curl_exec($ch);
fclose($postdatafileh);
var_dump($ret,curl_errno($ch),curl_error($ch));