我正试图整合贝宝支付网关。我得到授权令牌。创建订单调用返回订单ID。但捕获不返回批准链接。你能帮我检查一下下面的代码,让我知道哪里出错了吗?
function authenticate() {
$ch = false;
global $api_endpoint, $client_id, $client_secret;
$http_header = array("Content-Type: application/x-www-form-urlencoded");
$post_fields = 'grant_type=client_credentials';
$ch = curl_init();
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_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $client_id.":".$client_secret);
curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$result = curl_exec($ch);
$json = json_decode($result);
$access_token = $json->access_token;
curl_close($ch);
return $access_token;
}
// Request access token
function getAccessToken() {
global $auth_api_endpoint, $client_id, $client_secret;
$data = array(
'grant_type' => 'client_credentials'
);
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
);
$ch = curl_init($auth_api_endpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $client_id . ':' . $client_secret);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
$access_token = json_decode($response, true)['access_token'];
echo "Access token: " . $access_token . "\n";
return $access_token;
} else {
echo "Failed to get access token: " . $response . "\n";
}
}
function create_order($access_token) {
$ch = false;
$http_header = array
(
"Content-Type: application/json",
"Authorization: Bearer $access_token",
"PayPal-Request-Id: $my_request_id"
);
$post_fields = '{
"intent": "CAPTURE",
"purchase_units":
[
{
"reference_id": "$my_reference_id",
"amount":
{
"currency_code": "EUR",
"value": "10.00"
}
}
],
"payment_source":
{
"paypal":
{
"experience_context":
{
"payment_method_preference": "IMMEDIATE_PAYMENT_REQUIRED",
"payment_method_selected": "PAYPAL",
"brand_name": "EXAMPLE INC",
"locale": "en-US",
"landing_page": "LOGIN",
"user_action": "PAY_NOW",
"return_url": "https://mydomain/accept_payment.php",
"cancel_url": "https://mydomain/cancel_payment.php"
}
}
}
}';
echo "create_order: access_token: $access_token\n";
echo "create_order: http_header: ";
print_r($http_header);
echo "create_order: post_fields: $post_fields\n";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api-m.sandbox.paypal.com/v2/checkout/orders");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$result = curl_exec($ch);
echo "create_order: result: ";
$arr_result = json_decode($result);
var_dump($arr_result);
echo "\n";
curl_close($ch);
return $arr_result->id;
}
//$access_token = authenticate();
$access_token = getAccessToken();
echo "access_token: ".$access_token."\n";
$order_id = create_order($access_token);
$api_endpoint = "https://api.sandbox.paypal.com/v2/checkout/orders/$order_id";
echo "endpoint: ".$api_endpoint."\n";
// Initialize cURL session
$ch = curl_init();
// Set cURL options
curl_setopt($ch, CURLOPT_URL, $api_endpoint);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $access_token,
));
// Execute cURL session and store the response
$response = curl_exec($ch);
// Check for cURL errors and handle them if necessary
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
}
// Close the cURL session
curl_close($ch);
// Process the response (for example, print it)
echo $response;
我得到这样的回应:
{
"id": "2H5...815N",
"intent": "CAPTURE",
"status": "PAYER_ACTION_REQUIRED",
"payment_source": {
"paypal": {}
},
"purchase_units": [{
"reference_id": "d...b",
"amount": {
"currency_code": "EUR",
"value": "10.00"
},
"payee": {
"email_address": "[email protected]",
"merchant_id": "P...6",
"display_data": {
"brand_name": "EXAMPLE INC"
}
}
}],
"create_time": "2023-..-..T14:17:18Z",
"links": [{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/2H...5N",
"rel": "self",
"method": "GET"
}, {
"href": "https://www.sandbox.paypal.com/checkoutnow?token=2H...N",
"rel": "payer-action",
"method": "GET"
}]
}
1条答案
按热度按时间hc2pp10m1#
您正在寻找的批准链接就在响应中,标记为rel:payer-action。
然而,这样的链接是针对旧的集成模式,重定向远离您的网站。您不应该重定向远离您的网站。
相反,让您的网站在后台加载,并使用JS SDK显示一个上下文审批窗口。
你可以在这里找到一个demo:https://developer.paypal.com/demo/checkout/#/pattern/server和standard integration guide中的示例(使用node.js作为其示例后端)。这个后端当然可以用任何语言实现,包括PHP。创建和捕获路由应该只返回/输出JSON数据(没有HTML或文本,即我从来没有对任何非JSON的内容使用print或其他调试语句)
integration builder也有各种样品。