php - Laravel Cashier - 终身订阅
问题描述
我正在尝试进行每月、每年和终身订阅,其中每月和每年订阅都可以正常工作。我如何进行终身/永久订阅?每当我将计划名称和计划 ID 传递给$user->newSubscription()
我时都会收到错误消息:
You passed a non-recurring price but this field only accepts recurring prices.
以下是我的订阅代码:
$paymentMethod = $user->defaultPaymentMethod();
if ($period == 'yearly') {
$selectedPlan = $plan->plan_year;
} elseif($period=='monthly') {
$selectedPlan = $plan->plan_month;
}
else{
$selectedPlan = $plan->plan_lifetime;
}
$subscription = $user->newSubscription($plan->name, $selectedPlan);
解决方案
假设您使用的是价格而不是计划,您应该创建发票而不是订阅:
if ($period == 'yearly') {
$subscription = $user->newSubscription($plan->name, $plan->plan_year);
} elseif($period=='monthly') {
$subscription = $user->newSubscription($plan->name, $plan->plan_month);
} else {
// Create an invoice item with the lifetime price
StripeInvoiceItem::create([
'customer' => $user->stripeId(),
'price' => $plan->plan_lifetime,
], $user->stripeOptions());
// create the invoice with the lifetime item and finalize it automatically after 1 hour
$user->invoice(['auto_advance' => true]);
}
接下来,invoice.paid
通过扩展 WebhookController 添加到您的 webhook 和您需要监听此通知。在这里您将找到匹配的发票并检查发票项目是否具有与 相同的 id $plan->lifetime_plan
。如果是这样,您可以更新客户模型上的列以设置终身订阅:
public function handleInvoicePaid(array $payload)
{
if ($user = $this->getUserByStripeId($payload['data']['object']['customer'])) {
$data = $payload['data']['object'];
$invoice = $user->findInvoice($data['id']);
if (isset($invoice)) {
$plan = ...
if ($invoice->invoiceItems()->contains(function (InvoiceLineItem $item) use ($plan) {
return $item->price->id === $plan->lifetime_plan;
})) {
$user->update(['has_lifetime_subscription' => true]);
}
}
}
return $this->successMethod();
}
在您的应用程序中,您可以检查用户是终身订阅还是普通订阅:
if ($user->has_lifetime_subscription || $user->subscribed()) {
// ...
}
推荐阅读
- python - 将 Pine 脚本转换为 Python
- javascript - 使用数组的映射创建html时子组件不会立即重新渲染
- visual-studio-code - 在 VSCode 中按 CTRL 时隐藏自动建议弹出窗口
- windows - 从其他批处理文件中调用批处理文件时,只有第一个被调用
- google-apps-script - 从 Google ContactsApp 返回公司名称、未定义的电话号码和标签组
- html - 如何将数据(字符串)从我的 html 发送到我的服务器(节点或快递)并使用它执行某些功能?
- shell - 如何在源 csh 中获取文件名
- playframework - Play 支持哪种类型的 OpenID
- graphql - 如何将争论传递给 Apollo 中的子字段?
- kotlin - Android:如何在不同进程中运行的活动和服务之间进行通信?