我正在使用Laravel Cashier和Stripe来管理订阅。用户在注册时会提供他们的信用卡信息,但此时不会订阅特定的计划。因此,我可以成功地使用Stripe Checkout创建Stripe客户对象,并将Stripe客户ID保存在我的数据库中。但是,当用户注册计划时,我看不出有什么方法可以使用Stripe客户ID将他们注册到他们想要的计划中。
当然,我可以再次询问他们的信用卡信息,并获得一个Stripe代币用于Laravel收银台,但我想避免这种情况,因为在他们注册时,该应用程序已经创建了一个Strip客户对象,我只想使用现有的客户对象来向他们的信用卡充费,而不是再次索要他们的卡号。
为了说明我想做什么,这里有一些来自Laravel文档的示例代码:
$user->newSubscription('main', 'monthly')->create($creditCardToken);
但我想做的是这样的事情(注意创建方法的变化:
$user->newSubscription('main', 'monthly')->create($user->stripe_id);
有什么建议吗?
如果用户有条带ID,则不必提供令牌
$user->newSubscription('main', 'monthly')->create();
查看SubscriptionBuilder类。
你可以试试这个。
$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);