You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PayPal Payments API实现无需用户交互的可变金额自动订单?

解决方案:用PayPal Reference Transactions实现无交互可变金额扣款

你要找的就是PayPal的**Reference Transactions(参考交易)**功能——这玩意儿完美适配你的需求:用户首次授权后,你无需再让他们操作,就能发起任意金额的扣款,完全支持订单金额变化的场景(比如折扣调整、加购商品)。

实现步骤(PHP环境)

1. 先开通权限

这个功能不是默认开放的,得先去PayPal商家后台提交申请,说明你的业务是自动订单、后续扣款金额可变,一般只要业务合理都会通过审核。

2. 引导用户完成首次授权(生成协议ID)

首先得让用户走一次授权流程(类似首次下单的确认),生成一个计费协议ID,之后就靠这个ID发起后续扣款。

PHP示例代码(用PayPal REST SDK):

<?php
require 'vendor/autoload.php';

// 初始化PayPal API上下文
$apiContext = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        '你的Client ID',
        '你的Client Secret'
    )
);

// 创建计费协议
$agreement = new \PayPal\Api\Agreement();
$agreement->setName('自动订单授权协议')
    ->setDescription('允许商家根据订单内容自动发起扣款')
    ->setStartDate(date('c', strtotime('+1 day'))); // 协议生效日期设为次日

// 关联一个"按需扣款"的计划(可在PayPal后台创建,或使用官方默认计划)
$plan = new \PayPal\Api\Plan();
$plan->setId('P-XXXXXX'); // 替换成你的计划ID

$agreement->setPlan($plan);

// 设置付款方信息
$payer = new \PayPal\Api\Payer();
$payer->setPaymentMethod('paypal');

$agreement->setPayer($payer);

// 生成授权跳转链接
try {
    $agreement = $agreement->create($apiContext);
    foreach ($agreement->getLinks() as $link) {
        if ($link->getRel() === 'approval_url') {
            // 跳转到该URL让用户完成授权
            header("Location: {$link->getHref()}");
            exit;
        }
    }
} catch (\PayPal\Exception\PayPalConnectionException $ex) {
    // 错误处理,比如写入日志
    error_log($ex->getData());
}

3. 确认授权,保存协议ID

用户授权完成后,PayPal会跳回你指定的回调页面,你需要用返回的token确认协议,拿到正式的协议ID并存入MySQL(与用户ID关联):

<?php
require 'vendor/autoload.php';

$apiContext = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        '你的Client ID',
        '你的Client Secret'
    )
);

$token = $_GET['token'];
$agreement = new \PayPal\Api\Agreement();

try {
    $agreement->execute($token, $apiContext);
    $agreementId = $agreement->getId();
    // 将$agreementId与用户ID绑定,存入你的MySQL数据库
} catch (\PayPal\Exception\PayPalConnectionException $ex) {
    error_log($ex->getData());
}

4. 发起自动扣款

需要扣款时,直接用保存的协议ID发起交易即可,金额可根据当前订单灵活设置:

<?php
require 'vendor/autoload.php';

$apiContext = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        '你的Client ID',
        '你的Client Secret'
    )
);

// 创建付款请求
$payment = new \PayPal\Api\Payment();
$payment->setIntent('sale')
    ->setPayer([
        'payment_method' => 'paypal',
        'funding_instruments' => [
            [
                'billing' => [
                    'agreement_id' => '你保存的协议ID'
                ]
            ]
        ]
    ])
    ->setTransactions([
        [
            'amount' => [
                'total' => '29.99', // 填写当前订单的实际金额
                'currency' => 'AUD' // 替换为你的业务货币类型
            ],
            'description' => '自动订单扣款:商品名称+订单说明'
        ]
    ]);

try {
    $payment->create($apiContext);
    // 扣款成功,更新你的订单状态与交易记录
} catch (\PayPal\Exception\PayPalConnectionException $ex) {
    // 处理失败场景,比如余额不足、风控拦截等
    error_log($ex->getData());
}

注意事项

  • 必须先开通Reference Transactions权限,否则API会直接报错
  • 扣款金额需符合PayPal风控规则,避免出现异常大额扣款
  • 确保协议ID与用户信息正确绑定,避免误扣
  • 可在PayPal商家后台查看所有参考交易记录,方便对账

内容的提问来源于stack exchange,提问作者Kevin Allison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:45:54