Laravel Cashier - 使用现有客户对象创建新订阅
Posted
技术标签:
【中文标题】Laravel Cashier - 使用现有客户对象创建新订阅【英文标题】:Laravel Cashier - Create New Subscription With Existing Customer Object 【发布时间】:2016-07-18 20:05:41 【问题描述】:我正在使用 Laravel Cashier 和 Stripe 来管理订阅。用户在注册时将提供他们的信用卡信息,但此时他们不会订阅特定计划。所以我可以成功地使用 Stripe Checkout 创建一个 Stripe 客户对象并将 Stripe 客户 ID 保存在我的数据库中。但是当用户需要注册计划时,我看不到使用 Stripe 客户 ID 将他们注册到他们想要的计划的方法。
当然,我可以再次询问他们的信用卡信息并获取 Stripe 令牌以与 Laravel Cashier 一起使用,但我想避免这种情况,因为应用程序在他们注册时已经创建了一个 Stripe 客户对象,而我'想简单地使用现有的客户对象向他们的信用卡收费,而不是再次询问他们的卡号。
为了说明我想要做什么,这里是 Laravel 文档中的一些示例代码:
$user->newSubscription('main', 'monthly')->create($creditCardToken);
但我想做的是这样的(注意对 create 方法的更改:
$user->newSubscription('main', 'monthly')->create($user->stripe_id);
有什么建议吗?
【问题讨论】:
如果用户已经有一个stripe_id,这是否意味着他们以前有订阅?如果是这样,您可以恢复订阅,如果您想更改它,请更改它。还是您想完成其他事情? 您可以在没有计划但使用信用卡的情况下创建条带用户。事实上,我正在尝试做一些非常相似的事情,所以添加了赏金。 【参考方案1】:如果用户有条带 ID,则不必提供令牌
$user->newSubscription('main', 'monthly')->create();
看看SubscriptionBuilder 类。
【讨论】:
这按预期工作,但它保留了表中的 ends_at 日期。这是正常的还是这里有问题? ends_at 应保持为空。如果你想取消它,你可以通过使用 Subscription 类的 cancel() 函数来明确地做到这一点。 github.com/laravel/cashier/blob/6.0/src/Subscription.php【参考方案2】:你可以试试这个。
$user->setStripeKey(env("STRIPE_KEY"));
# card details
$card = [
'card_number' => 'xxxxxxxx',
'card_cvc' => 'xxx',
'exp_month' => 'xx',
'exp_year' => 'xxxx',
'name' => 'xxx',
];
# generate token
$token = $this->generateAccessToken($card);
private function generateAccessToken($card)
$client = new \GuzzleHttp\Client();
$url = 'https://api.stripe.com/v1/tokens';
$pubKey = env("STRIPE_SECRET");
$postBody = [
'key' => $pubKey,
'payment_user_agent' => 'stripe.js/Fbebcbe6',
'card' => [
'number' => $card['card_number'],
'cvc' => $card['card_cvc'],
'exp_month' => $card['exp_month'],
'exp_year' => $card['exp_year'],
'name' => $card['name']
]
];
$response = $client->post($url, [
'form_params' => $postBody
]);
$response_obj = json_decode($response->getbody()->getContents());
return $response_obj->id;
# main or primary
$subscription_obj = $user->newSubscription('subscription_name', 'stripe_plan_id')->create($token);
【讨论】:
以上是关于Laravel Cashier - 使用现有客户对象创建新订阅的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Cashier 收费方法失败,单次收费 3d 安全
Laravel Cashier - updateCard() - 指导
Laravel Cashier SCA 订阅返回不完整的订阅