解决方案:将带有用户ID的对象Charge存储在db中,并每次检查我们是否认识此用户:
$customerAlreadyKnown = OrdersModel::checkIfUserKnown($email);
如果我们知道,那么我们就必须更新客户来源(不知道为什么):
if(gettype($customerAlreadyKnown)=='array'){
\Stripe\Customer::update(
$customerAlreadyKnown[0]['user_id'],
['source' => $token]
);
$charge = \Stripe\Charge::create([
'customer' => $customerAlreadyKnown[0]['user_id'],
'amount' => $itemPrice,
'currency' => 'eur',
'description' => $_POST['description'],
'metadata' => array(
'order_id' => $orderID,
),
]);
否则我们将创建一个新客户
}else{
// Add customer to stripe
$customer = \Stripe\Customer::create(array(
'email' => $email,
'card' => $token,
));
$charge = \Stripe\Charge::create([
'customer' => $customer->id,
'amount' => $itemPrice,
'currency' => 'eur',
'description' => $_POST['description'],
'metadata' => array(
'order_id' => $orderID,
),
]);
}
答案 0 :(得分:1)
您正在为每次付款创建新的Token
和Customer
。您应该以某种方式(例如,通过其email_address或Token
的{{3}})来标识现有客户(在应用程序本地存储关系表)。然后,不使用新的Token
和新的Customer
,而是在收费之前以$customer
的身份获取现有客户(他们的现有卡将自动使用)。