解决方案:将带有用户id的对象Charge存储在数据库中,每次检查我们是否认识该用户:
$customerAlreadyKnown = OrdersModel::checkIfUserKnown($email);
如果我们知道,那么我们必须更新客户来源(不知道为什么(:
if(gettype($customerAlreadyKnown)=='array'){
StripeCustomer::update(
$customerAlreadyKnown[0]['user_id'],
['source' => $token]
);
$charge = StripeCharge::create([
'customer' => $customerAlreadyKnown[0]['user_id'],
'amount' => $itemPrice,
'currency' => 'eur',
'description' => $_POST['description'],
'metadata' => array(
'order_id' => $orderID,
),
]);
否则,我们将创建一个新客户
}else{
// Add customer to stripe
$customer = StripeCustomer::create(array(
'email' => $email,
'card' => $token,
));
$charge = StripeCharge::create([
'customer' => $customer->id,
'amount' => $itemPrice,
'currency' => 'eur',
'description' => $_POST['description'],
'metadata' => array(
'order_id' => $orderID,
),
]);
}
您正在为每次付款创建一个新的Token
和Customer
。相反,您应该以某种方式(例如通过他们的电子邮件地址或Token
的卡指纹(识别现有客户(在应用程序上本地存储关系表(。然后,不要使用新的Token
和新的Customer
,而是在收费前将现有客户检索为$customer
(他们现有的卡将自动使用(。