
本文详解如何通过 PayPal Orders v2 REST API 在 PHP 中创建订单、正确构造请求体,并从响应中精准提取 approve 链接生成“立即支付”按钮,避免常见 JSON 结构错误与字段解析失败问题。
本文详解如何通过 paypal orders v2 rest api 在 php 中创建订单、正确构造请求体,并从响应中精准提取 `approve` 链接生成“立即支付”按钮,避免常见 json 结构错误与字段解析失败问题。
在 PayPal V2 订单流程中,核心步骤是调用 /v2/checkout/orders 接口创建订单,成功后返回包含多个 HATEOAS 链接(links)的 JSON 响应,其中 rel: "approve" 对应的 href 即为用户跳转至 PayPal 沙箱支付页的 URL(如 https://www.sandbox.paypal.com/checkoutnow?token=7T223580KS69XXXX)。但许多开发者因请求结构不合规或响应解析错误而无法正确获取该链接。
✅ 正确构造请求:purchase_units 必须是索引数组
PayPal V2 API 明确要求 purchase_units 字段必须是一个索引数组(indexed array),而非关联数组或单个对象。常见错误(如原代码中 "purchase_units" => array("amount" => ...))会导致 MALFORMED_REQUEST_JSON 错误——因为 API 期望的是 purchase_units: [{ "amount": { ... } }] 形式。
以下是符合规范的完整 PHP 示例(含错误处理与链接提取):
<?php // 1. 获取访问令牌(生产环境建议使用 OAuth2 Client Credentials 流程)
$accessToken = 'YOUR_SANDBOX_ACCESS_TOKEN'; // 替换为实际 Bearer Token
// 2. 构建请求数据:注意 purchase_units 是索引数组!
$data = [
'intent' => 'CAPTURE',
'purchase_units' => [[ // ← 关键:双层方括号,表示索引数组含一个元素
'amount' => [
'currency_code' => 'USD',
'value' => '100.00'
]
]]
];
// 3. 初始化 cURL
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api-m.sandbox.paypal.com/v2/checkout/orders',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $accessToken
],
CURLOPT_SSL_VERIFYPEER => false // 生产环境请设为 true 并配置 CA 证书
]);
// 4. 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
// 5. 处理响应
if ($error) {
die('cURL Error: ' . $error);
}
$result = json_decode($response, true);
if ($httpCode !== 201) {
echo '<pre class="brush:php;toolbar:false;">';
print_r(['HTTP Code' => $httpCode, 'Response' => $result]);
echo '';
exit('PayPal API Error: Order creation failed.');
}
// 6. ✅ 安全提取 approve 链接(遍历 links 数组查找 rel === "approve")
$approveUrl = null;
if (isset($result['links']) && is_array($result['links'])) {
foreach ($result['links'] as $link) {
if ($link['rel'] === 'approve' && $link['method'] === 'GET') {
$approveUrl = $link['href'];
break;
}
}
}
if (!$approveUrl) {
die('Error: "approve" link not found in PayPal response.');
}
// 7. 输出支付按钮
echo '? Pay Now with PayPal!';
?>
⚠️ 关键注意事项
-
purchase_units格式不可省略索引:必须写作[[...]]或array(array(...)),否则触发MALFORMED_REQUEST_JSON; -
approve链接在links数组中,非data.links或links[0]:响应顶层即为对象,直接访问$result['links'];需遍历匹配rel => "approve",因其位置不固定(示例中位于索引[1],但文档不保证顺序); -
Token 安全性:
Authorization: Bearer中的 token 应通过服务端 OAuth2 流程动态获取,切勿硬编码或前端暴露; -
HTTPS 与证书验证:生产环境务必启用
CURLOPT_SSL_VERIFYPEER => true并配置有效 CA 证书; -
金额精度:
value字符串需保留两位小数(如"100.00"),且不能含千分位符号; -
沙箱测试:使用 PayPal Developer Dashboard 创建沙箱账号,登录
https://www.sandbox.paypal.com完成模拟支付。
✅ 总结
创建 PayPal V2 订单的本质是:发送结构严谨的 JSON 请求 → 解析标准 HATEOAS 响应 → 精准定位语义化链接。只要确保 purchase_units 为合法索引数组,并通过 rel 属性健壮提取 approve 链接,即可稳定生成跳转按钮。后续还可扩展 capture 调用完成资金捕获,实现完整支付闭环。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











