使用PayPal REST API和cURL创建订单可以使用Bash。
下面是Bash脚本:
$ cat paypal.sh
# https://developer.paypal.com/api/rest/authentication/
# https://developer.paypal.com/dashboard/applications/sandbox
CLIENT_ID="aaa"
CLIENT_SECRET="aaa"
# authenticate
RESULT=$( \
curl \
-s \
-X POST "https://api-m.sandbox.paypal.com/v1/oauth2/token" \
-u "${CLIENT_ID}:${CLIENT_SECRET}" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials")
ACCESS_TOKEN=$(echo ${RESULT} | sed 's/.*"access_token":"\([-_a-zA-Z0-9]*\)".*/\1/')
echo "ACCESS_TOKEN=${ACCESS_TOKEN}"
# create order
RESULT=$( \
curl \
-s \
-X POST "https://api-m.sandbox.paypal.com/v2/checkout/orders" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "PayPal-Request-Id: 7b92603e-77ed-4896-8e78-5dea2050476a" \
-d '{
"intent": "CAPTURE",
"purchase_units":
[
{
"reference_id": "d9f80740-38f0-11e8-b467-0ed5f89f718b",
"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",
"shipping_preference": "SET_PROVIDED_ADDRESS",
"user_action": "PAY_NOW",
"return_url": "https://example.com/returnUrl",
"cancel_url": "https://example.com/cancelUrl"
}
}
}
}')
ORDER_ID=$(echo ${RESULT} | sed 's/.*"id":"\([-a-zA-Z0-9_]*\)".*/\1/')
ORDER_STATUS=$(echo ${RESULT} | sed 's/.*"status":"\([A-Z_]*\)".*/\1/')
ORDER_HREF=$(echo ${RESULT} | sed 's/.*"href":"\([-a-zA-Z0-9_:/.?=]*\)".*/\1/')
echo "ORDER_ID=${ORDER_ID}"
echo "ORDER_STATUS=${ORDER_STATUS}"
echo "ORDER_HREF=${ORDER_HREF}"
结果:
$ ./paypal.sh
ACCESS_TOKEN=aaa
ORDER_ID=aaa
ORDER_STATUS=PAYER_ACTION_REQUIRED
ORDER_HREF=https://www.sandbox.paypal.com/checkoutnow?token=aaa
现在,让我们试试PHP。
下面是PHP脚本(我删除了错误处理,因为stackoverflow不能接受我的问题,如果我让它):
$ cat paypal.php
<?php
function authenticate()
{
$ch = false;
$client_id = "aaa";
$client_secret = "aaa";
$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;
}
function create_order($access_token)
{
$ch = false;
$http_header = array
(
"Content-Type: application/x-www-form-urlencoded",
"Authorization: Bearer $access_token",
"PayPal-Request-Id: 7b92603e-77ed-4896-8e78-5dea2050476a"
);
$post_fields = '{
"intent": "CAPTURE",
"purchase_units":
[
{
"reference_id": "d9f80740-38f0-11e8-b467-0ed5f89f718b",
"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",
"shipping_preference": "SET_PROVIDED_ADDRESS",
"user_action": "PAY_NOW",
"return_url": "https://example.com/returnUrl",
"cancel_url": "https://example.com/cancelUrl"
}
}
}
}';
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: ";
print_r($result);
echo "\n";
curl_close($ch);
}
$access_token = authenticate();
echo "access_token: ".$access_token."\n";
create_order($access_token);
?>
结果:
$ php -f paypal.php
access_token: aaa
create_order: access_token: aaa
create_order: http_header: Array
(
[0] => Content-Type: application/x-www-form-urlencoded
[1] => Authorization: Bearer aaa
[2] => PayPal-Request-Id: 7b92603e-77ed-4896-8e78-5dea2050476a
)
create_order: post_fields: {
"intent": "CAPTURE",
"purchase_units":
[
{
"reference_id": "d9f80740-38f0-11e8-b467-0ed5f89f718b",
"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",
"shipping_preference": "SET_PROVIDED_ADDRESS",
"user_action": "PAY_NOW",
"return_url": "https://example.com/returnUrl",
"cancel_url": "https://example.com/cancelUrl"
}
}
}
}
create_order: result: 403 Forbidden
所以,正如你所看到的,我得到了"403禁止",而不是预期的结果。
你能解释一下为什么吗?
谢谢你。
最好的问候。
1条答案
按热度按时间q35jwt9p1#
问题出在PHP脚本中。
我使用了错误的内容类型。
下面是补丁:
结果: