条纹,验证卡并仅在操作后对其进行收费
Posted
技术标签:
【中文标题】条纹,验证卡并仅在操作后对其进行收费【英文标题】:Stripe, verify card and only charge it after an action 【发布时间】:2015-09-27 04:59:00 【问题描述】:我正在为一个网站启用支付功能。我使用 Stripe 作为提供者。我想知道如果 2 个条件为真,我如何从卡中扣款。当用户付款时,我想更改数据库中的一个值,然后从卡中扣款。但是如果数据库查询失败,我不想扣卡。同样,我不想查询卡是否无效。我需要两者,卡有效并且查询成功。我该怎么做?
这是充值代码
try
$charge = \Stripe\Charge::create(array(
"amount" => $amount, // amount in cents, again
"currency" => "cad",
"source" => $token,
"description" => $description)
);
catch(\Stripe\Error\Card $e)
// The card has been declined
【问题讨论】:
这叫做授权;基本支付功能。授权卡,履行订单,获取资金。 【参考方案1】:您应该考虑向客户收费,而不是从卡上收费。 我的意思是:
1. Create a customer
$customer = \Stripe\Customer::create(array(
"description" => "Customer for test@example.com",
"source" => "tok_15gDQhLIVeeEqCzasrmEKuv8" // obtained with Stripe.js
));
2. Create a card
$card = $customer->sources->create(array("source" => "tok_15gDQhLIVeeEqCzasrmEKuv8"));
来自 Stripe API 参考:
来源 | external_account 必填 向客户添加卡时,参数名称为来源。该值可以是一个令牌,例如我们的 Stripe.js 返回的令牌,也可以是一个包含用户信用卡详细信息的字典。 Stripe 会自动验证卡片。
通过创建卡片,Stripe 会自动对其进行验证。因此,拥有一个有效的信用卡对象,您就可以在您的数据库上执行您想要的任何查询,如果成功,则向客户收费。
3. Charge
\Stripe\Charge::create(array(
"amount" => 400,
"currency" => "usd",
"source" => "tok_15gDQhLIVeeEqCzasrmEKuv8", // obtained with Stripe.js,
// "customer" => $cusomer->id // the customer created above
"metadata" => array("order_id" => "6735")
));
收费时,你可以传递来源(使用 Stripe.js 获得的令牌)或我们刚刚创建的客户 ID。
别忘了try...catch
一切。
【讨论】:
【参考方案2】:好的,所以在阅读API之后,我发现可以通过将捕获参数设置为false来实现
像这样:
$charge = \Stripe\Charge::create(array(
"amount" => $amount, // amount in cents, again
"currency" => "cad",
"source" => $token,
"description" => $description,
"capture" => false)
);
这将授权付款和卡,但不会产生费用。完成查询并确保成功后,您可以使用此功能向客户收费(捕获费用)
$ch = \Stripe\Charge::retrieve($charge->id);
$ch->capture();
【讨论】:
这在技术上是正确的,但请注意,至少在北美,预授权经常作为费用出现在客户的信用卡对帐单上,即使在退款时也是如此。这可能会增加支持负担,因为当客户看到他们认为不正确的收费时,他们会主动联系。以上是关于条纹,验证卡并仅在操作后对其进行收费的主要内容,如果未能解决你的问题,请参考以下文章
CoreData:错误:从上下文中删除托管对象后对其进行变异
Django Rest Framework:如何将数据传递给嵌套的序列化器并仅在自定义验证后创建对象
使用条纹 + 格子创建 ACH 收费 - 没有这样的令牌;在实时模式中存在类似的对象