如何在Laravel 8中通过PayPal智能按钮/JS SDK获取paypal_fee
获取PayPal智能按钮订单的paypal_fee值
要拿到paypal_fee并存储,不能仅靠前端Javascript SDK,必须结合PayPal后端API完成,以下是具体流程:
1. 支付完成后捕获订单获取实际手续费
用户通过前端智能按钮完成支付后,必须在后端调用/v2/checkout/orders/{order_id}/capture接口捕获订单,此时接口会返回准确的paypal_fee值,适合存入数据库。
前端配合(传递订单ID到后端)
前端JS SDK在支付成功后会返回订单ID,将其传给后端接口:
paypal.Buttons({ createOrder: function(data, actions) { return actions.order.create({ purchase_units: [{ amount: { value: '100.00' } }] }); }, onApprove: function(data, actions) { // 将orderID传给后端捕获接口 return fetch('/api/capture-paypal-order', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ orderId: data.orderID }) }).then(function(response) { return response.json(); }).then(function(data) { // 可拿到后端返回的paypal_fee做前端展示 console.log('实际手续费:', data.paypalFee); }); } }).render('#paypal-button-container');
后端捕获订单并提取paypal_fee
以Node.js为例,后端处理逻辑如下:
const paypal = require('@paypal/checkout-server-sdk'); // 初始化PayPal客户端 const client = new paypal.core.PayPalHttpClient( new paypal.core.SandboxEnvironment('你的CLIENT_ID', '你的CLIENT_SECRET') ); // 后端捕获订单接口 app.post('/api/capture-paypal-order', async (req, res) => { const { orderId } = req.body; const request = new paypal.orders.OrdersCaptureRequest(orderId); request.requestBody({}); try { const response = await client.execute(request); // 提取实际paypal_fee const paypalFee = response.result.purchase_units[0].payments.captures[0].seller_receivable_breakdown.paypal_fee.value; const netAmount = response.result.purchase_units[0].payments.captures[0].seller_receivable_breakdown.net_amount.value; // 此处将paypalFee和订单信息存入数据库 // saveToDatabase(orderId, paypalFee, netAmount, ...); res.json({ success: true, paypalFee, netAmount }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } });
关键注意点
- 前端无法直接获取paypal_fee:PayPal不会在前端返回敏感的手续费信息,必须通过后端API获取。
- 以捕获订单时的实际fee为准:创建订单时的预估fee可能和实际有差异,存入数据库一定要用捕获后的实际值。
- 权限验证:后端调用PayPal API必须使用你的Client ID和Secret,确保接口安全。
内容的提问来源于stack exchange,提问作者nonoy porcaraye
相关产品推荐
相关产品推荐

