
paypal express checkout是一个多步骤的支付流程,通常包括以下几个关键api调用:
如上所述,交易ID(Transaction ID)是在DoExpressCheckoutPayment API调用成功后,在其响应中返回的。getExpressCheckoutDetails的响应虽然包含了丰富的订单信息(如TOKEN、AMT、INVNUM等),但它仅反映了用户在PayPal端授权的情况,而非实际的支付完成。
当您调用DoExpressCheckoutPayment并成功处理支付后,响应数据中通常会包含PAYMENTINFO_0_TRANSACTIONID字段,这就是您需要存储的交易ID。
以下是一个概念性的PHP代码示例,展示了如何调用DoExpressCheckoutPayment并获取交易ID:
use Srmklive\PayPal\Services\ExpressCheckout;
// 假设 $provider 已经实例化,并且 $token 和 $payerId 已从 GetExpressCheckoutDetails 步骤获取
$provider = new ExpressCheckout;
// 准备支付详情,这通常与 SetExpressCheckout 时提供的详情一致
$data = [
'items' => [
[
'name' => 'Monthly Unlimited',
'price' => 24.99,
'qty' => 1,
],
],
'invoice_id' => '61', // 您的订单发票号
'invoice_description' => 'Order #61 Invoice',
'return_url' => 'https://example.com/paypal/success',
'cancel_url' => 'https://example.com/paypal/cancel',
'total' => 24.99,
'currency' => 'USD',
];
// 调用 DoExpressCheckoutPayment 最终完成支付
$response = $provider->doExpressCheckoutPayment($data, $request->token, $request->PayerID);
// 检查响应是否成功
if (isset($response['ACK']) && $response['ACK'] === 'Success') {
// 成功获取交易ID
$transactionId = $response['PAYMENTINFO_0_TRANSACTIONID'];
// 此时,您应该将 $transactionId 存储到您的数据库中,与您的订单关联
// 例如:Order::where('invoice_id', $data['invoice_id'])->update(['paypal_transaction_id' => $transactionId]);
echo "支付成功!交易ID: " . $transactionId;
// 进一步处理订单,例如更新订单状态、发送确认邮件等
} else {
// 支付失败,处理错误
echo "支付失败:" . (isset($response['L_LONGMESSAGE0']) ? $response['L_LONGMESSAGE0'] : '未知错误');
}获取到交易ID后,最关键的一步是将其持久化存储。通常,这意味着将其与您的内部订单记录(例如在数据库中)关联起来。
最佳实践:
一旦您正确存储了交易ID,执行退款操作就变得非常简单。您只需调用PayPal的refundTransaction API,并传入对应的交易ID即可。
use Srmklive\PayPal\Services\ExpressCheckout;
$provider = new ExpressCheckout;
// 从您的数据库中获取需要退款的交易ID
$transactionIdToRefund = 'YOUR_STORED_TRANSACTION_ID'; // 示例:从数据库中取出
// 调用 refundTransaction API
// 第二个参数是退款金额,如果省略或为 null,则默认全额退款
$response = $provider->refundTransaction($transactionIdToRefund);
// 检查退款响应
if (isset($response['ACK']) && $response['ACK'] === 'Success') {
echo "退款成功!";
// 更新您的订单状态为已退款
} else {
echo "退款失败:" . (isset($response['L_LONGMESSAGE0']) ? $response['L_LONGMESSAGE0'] : '未知错误');
// 处理退款失败逻辑
}如果由于某种原因,您未能存储交易ID,或者需要查询历史交易,PayPal提供了TransactionSearch API。您可以使用多种参数(如发票号、日期范围、交易类型等)来搜索并获取交易ID。
使用场景:
搜索参数示例:
示例(概念性):
use Srmklive\PayPal\Services\ExpressCheckout;
$provider = new ExpressCheckout;
$searchParams = [
'INVNUM' => '61', // 根据您的发票号进行搜索
// 'STARTDATE' => '2021-10-01T00:00:00Z', // 可选:指定搜索开始日期
// 'ENDDATE' => '2021-11-30T23:59:59Z', // 可选:指定搜索结束日期
];
$response = $provider->transactionSearch($searchParams);
if (isset($response['ACK']) && $response['ACK'] === 'Success') {
if (isset($response['L_TRANSACTIONID0'])) { // 假设只有一个匹配项
$foundTransactionId = $response['L_TRANSACTIONID0'];
echo "通过搜索找到交易ID: " . $foundTransactionId;
// 现在可以使用这个ID进行退款
// $provider->refundTransaction($foundTransactionId);
} else {
echo "未找到匹配的交易。";
}
} else {
echo "交易搜索失败:" . (isset($response['L_LONGMESSAGE0']) ? $response['L_LONGMESSAGE0'] : '未知错误');
}重要提示: PayPal官方强烈建议在DoExpressCheckoutPayment成功后立即存储交易ID,而不是依赖TransactionSearch API来获取。TransactionSearch API的调用会增加系统复杂性,并且在处理大量退款时效率较低。
正确获取PayPal Express Checkout的交易ID是执行退款及其他后续操作的关键。核心要点是:交易ID在DoExpressCheckoutPayment成功后返回,而非getExpressCheckoutDetails。务必在支付成功后立即将交易ID存储到您的系统中,这是最推荐和高效的做法。虽然TransactionSearch API可以作为备选方案,但它不应用于常规的交易ID获取流程。遵循这些指导原则,将确保您的PayPal集成稳健可靠。
以上就是PayPal Express Checkout 交易ID获取与退款操作指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号