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

如何在不修改vendor文件的情况下移除PayPal订阅的收货地址栏

问题

我使用srmklive/paypal这个PayPal订阅包,想去掉订阅流程里的收货地址(ship to)区域。目前我的订阅初始化代码是这样的:

$response = $this->provider->addProductById($data['product_id'])
    ->addBillingPlanById($data['plan_id'])
    ->setReturnAndCancelUrl($return_url, $cancel_url)
    ->setupSubscription($user['user_name'], $user['email'], Carbon::now()->addMinutes(5));

查看源码后发现,只要在createSubscription()方法里加上$data['application_context']['shipping_preference'] = 'NO_SHIPPING';就能实现需求,但我不想修改vendor目录下的文件,请问该怎么操作?

解决方案

方法1:手动构造参数,直接调用createSubscription

setupSubscription本质就是组装请求参数后调用createSubscription,所以可以自己拼参数,加上收货地址隐藏配置后直接调用核心方法:

// 先让provider加载产品和计费计划信息,设置回调地址
$this->provider->addProductById($data['product_id'])
    ->addBillingPlanById($data['plan_id'])
    ->setReturnAndCancelUrl($return_url, $cancel_url);

// 组装订阅请求的完整参数
$start_date = Carbon::now()->addMinutes(5)->toIso8601String();
$subscriptionParams = [
    'plan_id'    => $this->provider->billing_plan['id'],
    'start_time' => $start_date,
    'quantity'   => 1,
    'subscriber' => [
        'name'          => [
            'given_name' => $user['user_name'],
        ],
        'email_address' => $user['email'],
    ],
    'application_context' => [
        'return_url' => $return_url,
        'cancel_url' => $cancel_url,
        'shipping_preference' => 'NO_SHIPPING' // 关键配置:隐藏收货地址
    ]
];

// 直接调用createSubscription发起请求
$response = $this->provider->createSubscription($subscriptionParams);

// 清理provider中的临时数据,和原setupSubscription保持一致
unset($this->provider->product);
unset($this->provider->billing_plan);
unset($this->provider->trial_pricing);
unset($this->provider->return_url);
unset($this->provider->cancel_url);

方法2:扩展原Provider类,重写setupSubscription

创建自定义的PayPal Provider类,继承原包的类,重写setupSubscription方法,在里面加入隐藏收货地址的配置:

use Srmklive\PayPal\Services\PayPal as BasePayPal;
use Carbon\Carbon;

class CustomPayPalProvider extends BasePayPal
{
    public function setupSubscription(string $customer_name, string $customer_email, string $start_date = '')
    {
        $start_date = !empty($start_date) ? Carbon::parse($start_date)->toIso8601String() : Carbon::now()->toIso8601String();

        $body = [
            'plan_id'    => $this->billing_plan['id'],
            'start_time' => $start_date,
            'quantity'   => 1,
            'subscriber' => [
                'name'          => [
                    'given_name' => $customer_name,
                ],
                'email_address' => $customer_email,
            ],
        ];

        if ($this->has_setup_fee) {
            $body['plan'] = [
                'payment_preferences' => $this->payment_preferences,
            ];
        }

        if ($this->return_url && $this->cancel_url) {
            $body['application_context'] = [
                'return_url' => $this->return_url,
                'cancel_url' => $this->cancel_url,
                'shipping_preference' => 'NO_SHIPPING' // 添加这行配置
            ];
        }

        $subscription = $this->createSubscription($body);

        unset($this->product);
        unset($this->billing_plan);
        unset($this->trial_pricing);
        unset($this->return_url);
        unset($this->cancel_url);

        return $subscription;
    }
}

之后在项目里替换原Provider为这个自定义类即可,后续调用setupSubscription就会自动带上隐藏收货地址的配置。

方法3:检查包是否有现成配置方法

如果这个包提供了设置application_context的方法(比如setApplicationContext),可以直接在调用链里添加:

$response = $this->provider->addProductById($data['product_id'])
    ->addBillingPlanById($data['plan_id'])
    ->setReturnAndCancelUrl($return_url, $cancel_url)
    ->setApplicationContext(['shipping_preference' => 'NO_SHIPPING']) // 如果存在这个方法
    ->setupSubscription($user['user_name'], $user['email'], Carbon::now()->addMinutes(5));

如果包没有这个方法,优先用前两种方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:04:57