如何在不修改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
相关产品推荐
相关产品推荐

