PayPal托管按钮集成后如何验证支付完成并存储交易数据
PayPal托管按钮支付验证与服务器同步方案
1. 前端添加支付成功回调
修改你的托管按钮代码,增加onApprove回调捕获支付完成事件,将交易标识传给后端做验证:
<script src="https://www.paypal.com/sdk/js?client-id=myClientId&components=hosted-buttons&disable-funding=venmo¤cy=EUR"></script> <div id="paypal-container-foobar"></div> <script> paypal.HostedButtons({ hostedButtonId: "MYHOSTEDBUTTONSID", onApprove: (data) => { // 向你的后端接口发送交易ID fetch('/verify-paypal-transaction', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ transactionId: data.orderID }) }) .then(res => res.json()) .then(result => { result.success ? console.log('支付验证通过') : console.error('支付无效'); }); } }).render("#paypal-container-foobar") </script>
2. 后端验证交易(核心步骤)
前端回调仅作触发,必须通过PayPal官方API在后端验证交易真实性,流程如下:
- 用你的沙箱商户ID和秘钥调用OAuth接口获取访问令牌
- 拿着令牌调用订单/交易查询接口,核对关键信息
- 验证通过后再存储交易数据到数据库
后端伪代码示例(以Node.js为例)
const axios = require('axios'); async function verifyTransaction(transactionId) { // 1. 获取访问令牌 const authRes = await axios.post( 'https://api-m.sandbox.paypal.com/v1/oauth2/token', 'grant_type=client_credentials', { auth: { username: '你的沙箱商户ID', password: '你的沙箱秘钥' } } ); const token = authRes.data.access_token; // 2. 查询订单详情 const orderRes = await axios.get( `https://api-m.sandbox.paypal.com/v2/checkout/orders/${transactionId}`, { headers: { Authorization: `Bearer ${token}` } } ); const order = orderRes.data; // 3. 验证关键参数 if (order.status === 'COMPLETED' && order.purchase_units[0].amount.currency_code === 'EUR') { // 这里可额外核对订单金额是否符合预期 // 验证通过,存储交易数据 return { success: true, data: order }; } return { success: false, msg: '交易状态或参数异常' }; }
关键注意事项
- 绝对不能仅依赖前端回调:前端可被篡改,后端API验证是唯一可信的方式
- 沙箱与生产环境的API域名不同:沙箱用
api-m.sandbox.paypal.com,生产用api-m.paypal.com - 商户秘钥需安全存储,禁止暴露在前端代码中
内容的提问来源于stack exchange,提问作者gremo
相关产品推荐
相关产品推荐

