0

0

PayPal Express Checkout 交易ID获取与退款操作指南

DDD

DDD

发布时间:2025-09-05 12:42:20

|

270人浏览过

|

来源于php中文网

原创

PayPal Express Checkout 交易ID获取与退款操作指南

本教程详细阐述了在PayPal Express Checkout流程中,如何正确获取并管理交易ID以进行退款操作。核心在于交易ID并非由getExpressCheckoutDetails返回,而是通过doExpressCheckoutPayment成功完成支付后获得。文章强调了存储交易ID的重要性,并提供了在未存储ID情况下的备选方案(交易搜索API),同时给出专业建议和最佳实践。

理解PayPal Express Checkout交易流程与交易ID

paypal express checkout是一个多步骤的支付流程,通常包括以下几个关键api调用

  1. SetExpressCheckout: 初始化支付,设置订单详情并获取一个TOKEN。用户被重定向到PayPal进行授权。
  2. GetExpressCheckoutDetails: 用户授权后,PayPal会将用户重定向回您的网站,并附带TOKEN和PAYERID。此时,您可以使用GetExpressCheckoutDetails API获取用户授权的详细信息,例如收货地址、支付金额等。请注意,在此阶段,支付尚未最终完成,因此不会返回最终的交易ID。 示例中CHECKOUTSTATUS显示为PaymentActionNotInitiated正是此意。
  3. DoExpressCheckoutPayment: 这是支付流程的最后一步。您需要调用此API来最终执行支付。只有当此API调用成功后,PayPal才会返回一个唯一的交易ID

正确获取交易ID

如上所述,交易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后,最关键的一步是将其持久化存储。通常,这意味着将其与您的内部订单记录(例如在数据库中)关联起来。

最佳实践:

  • 立即存储: 在DoExpressCheckoutPayment成功响应后,应立即将PAYMENTINFO_0_TRANSACTIONID存储到您的订单表中。
  • 唯一性关联: 确保交易ID与您的内部订单号(例如invoice_id)之间建立清晰的关联。
  • 安全性: 存储交易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'] : '未知错误');
    // 处理退款失败逻辑
}

备选方案:通过交易搜索API获取交易ID(不推荐常规使用)

如果由于某种原因,您未能存储交易ID,或者需要查询历史交易,PayPal提供了TransactionSearch API。您可以使用多种参数(如发票号、日期范围、交易类型等)来搜索并获取交易ID。

Bandy AI
Bandy AI

全球领先的电商设计Agent

下载

使用场景:

  • 数据丢失:意外删除了存储的交易ID。
  • 审计:需要查找特定时间段或特定发票号的所有交易。
  • 手动操作:在后台管理系统中,通过发票号查找并手动触发退款。

搜索参数示例:

  • INVNUM: 发票号(推荐,如果您的发票号是唯一的)
  • STARTDATE, ENDDATE: 交易日期范围
  • EMAIL: 交易关联的PayPal账户邮箱
  • STATUS: 交易状态

示例(概念性):

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的调用会增加系统复杂性,并且在处理大量退款时效率较低。

注意事项与最佳实践

  1. 错误处理: 务必对所有PayPal API调用进行严格的错误处理。检查ACK字段,并根据L_ERRORCODE和L_LONGMESSAGE来诊断问题。
  2. 异步通知(IPN/Webhooks): 虽然本教程主要关注同步API响应,但对于生产环境,强烈建议配置PayPal的即时支付通知(IPN)或Webhooks。它们可以作为您系统状态更新的补充机制,尤其是在网络波动导致同步响应丢失的情况下。
  3. 测试环境: 在将任何更改部署到生产环境之前,务必在PayPal沙盒(Sandbox)环境中进行充分的测试。
  4. 官方文档: 始终参考PayPal官方开发者文档,以获取最新、最准确的API信息和最佳实践。

总结

正确获取PayPal Express Checkout的交易ID是执行退款及其他后续操作的关键。核心要点是:交易ID在DoExpressCheckoutPayment成功后返回,而非getExpressCheckoutDetails。务必在支付成功后立即将交易ID存储到您的系统中,这是最推荐和高效的做法。虽然TransactionSearch API可以作为备选方案,但它不应用于常规的交易ID获取流程。遵循这些指导原则,将确保您的PayPal集成稳健可靠。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6169

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

817

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1066

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1353

2024.03.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

358

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2082

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

349

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

256

2023.09.05

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号