基于Laravel与PayPal按钮搭建的服务支付系统中,订单资金无法自动入账的技术咨询
解决PayPal资金需要手动点击「Get your money」才能到账的问题
我之前对接PayPal支付的时候也碰到过一模一样的情况,大概率是账户设置或者API实现模式的问题,咱们一步步排查:
一、先检查PayPal商家账户的设置
这是新商家账户最常见的问题:
- 登录PayPal商家后台,进入「设置」→「付款偏好」
- 找到「接受付款」板块,确认是否开启了自动接受付款,如果设置成「需要手动确认每笔付款」,就会出现你说的情况,改成自动接受即可
- 进入「资金」→「资金保留」
- 查看是否有自动保留资金的规则(比如新账户的初始审核期、高风险交易保留),如果是这种情况,要么等审核期自然结束,要么联系PayPal客服确认是否可以调整规则
二、排查后端API的实现逻辑
如果账户设置没问题,那大概率是你用了PayPal的授权(AUTHORIZE)模式而非捕获(CAPTURE)模式:
PayPal有两种核心交易模式:
- AUTHORIZE模式:先冻结用户资金,需要手动调用捕获接口或在后台点击「Get your money」才能完成资金到账
- CAPTURE模式:用户付款后直接完成交易,资金自动转入你的账户
你需要检查这两处代码:
1. 创建订单时的Intent参数
确保创建订单的请求里,intent字段设置为CAPTURE,而不是AUTHORIZE。Laravel里的示例代码大概是这样:
use PayPalCheckoutSdk\Orders\OrdersCreateRequest; $request = new OrdersCreateRequest(); $request->prefer('return=representation'); $request->body = [ "intent" => "CAPTURE", // 重点:必须是CAPTURE "purchase_units" => [[ "amount" => [ "currency_code" => "USD", "value" => "19.99" ] ]] ]; // 发送请求创建订单 $response = $client->execute($request);
2. 订单批准后的捕获操作
前端的onApprove触发后,后端的批准端点必须调用PayPal的订单捕获接口,而不是仅仅验证订单状态。示例代码:
use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; // 拿到前端传过来的order_id $orderId = request('order_id'); $request = new OrdersCaptureRequest($orderId); $request->prefer('return=representation'); // 执行捕获 $response = $client->execute($request); // 检查捕获结果 if ($response->result->status === 'COMPLETED') { // 这里处理你的订单状态更新(比如标记为已支付) } else { // 处理捕获失败的情况 }
如果你的后端只是验证了订单存在,但没有调用这个捕获接口,资金就会一直处于授权状态,需要手动触发到账。
额外说明
如果是刚开通的PayPal商家账户,平台可能会有初始审核期,这段时间即使设置正确,也可能需要手动释放资金,一般审核期过了(大概1-2周)就会自动到账。如果还是有问题,可以直接联系PayPal商家客服,让他们帮忙检查账户的资金流转设置。
内容的提问来源于stack exchange,提问作者Teabx
相关产品推荐
相关产品推荐

