【发布时间】:2020-04-27 09:55:01
【问题描述】:
我想通过 Stripe 创建一个支付表单,其中包含用户的电子邮件地址和支付信息。然后,这些信息会通过 Flask 发送到我的服务器,如果用户的电子邮件地址符合我设置的特定标准,那么我会处理付款。否则,我取消付款。
根据我的研究,我发现了两种似乎可行的方法。虽然我还没有能够形成一个完整的解决方案。
第一种方法是按照本指南https://stripe.com/docs/payments/checkout/one-time稍作修改。当用户点击我的“立即购买”按钮时,我会发布到以下 API:
@app.route("/generate_session", methods=["POST"])
def generate_session():
session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=[{
'name': 'T-shirt',
'description': 'Comfortable cotton t-shirt',
'images': ['https://example.com/t-shirt.png'],
'amount': 500,
'currency': 'gbp',
'quantity': 1,
}],
payment_intent_data={
'capture_method': 'manual',
},
success_url='http://localhost:5000/success',
cancel_url='http://localhost:5000/cancel',
)
return session["id"]
然后我使用此会话 ID 执行条带 redirectCheckout 函数:
var stripe = Stripe('pk_test_lp7ZS0B23jNmorIoW6Wj0Rs2009E1xTCwS');
sessionId = "" // send POST and get response
stripe.redirectToCheckout({
sessionId: sessionId
}).then(function (result) {
});
由于我已将'capture_method' 定义为'manual',因此实际上不会提交付款。我需要做的是,一旦用户点击支付,使用 session_id POST 到 /api/process_payment。这是我正在努力解决的问题。
@app.route("/api/process_payment", methods=["POST])
def process_payment():
data = request.get_json()
session_id = data["session_id"]
session = stripe.checkout.Session.retrieve(session_id)
payment_intent = session["payment_intent"]
if session["customer_email"] == "abc@mail.com": # will perform a different check, just a trivial example
stripe.PaymentIntent.confirm(payment_intent,)
# verify payment
success = True
else:
stripe.PaymentIntent.cancel(payment_intent,)
success = False
return jsonify({"success": success})
以下是我用来帮助完成该部分的文档:https://stripe.com/docs/api/checkout/sessions/retrieve、https://stripe.com/docs/api/payment_intents/confirm、https://stripe.com/docs/api/payment_intents/cancel。
第二种方法是使用Stripe Elements 制作一个包含电子邮件和付款信息的表单。而且由于在处理之前已经将信息发送到我的服务器,因此在处理付款之前检查电子邮件将是微不足道的。但是,在我看来,Stripe Elements 绝对是一团糟,我想不惜一切代价避免像它这样糟糕的样板代码。我试图制作一个适合我的规格的表格,但我还没有接近。我找到了这个 jsfiddle https://jsfiddle.net/ywain/foc0L56q/,但它似乎并不完整,更改 CSS 似乎很痛苦。
理想情况下,我希望帮助制定第一个选项,但如果有人可以帮助我完成第二个选项,那也很棒。
【问题讨论】:
-
请注意,在您的第一种方法(结帐)中,您实际上是在客户卡上授权该金额。他们会在银行的交易页面上将其视为对他们卡的冻结。推荐的方法是使用 Elements,在电子邮件地址发布到您的后端时检查它,然后仅在您的检查全部通过时才创建付款意图。
-
@taintedzodiac 你确定吗?你能把我链接到这方面的文档吗?我就是不能使用 Elements 太可怕了。
-
@taintedzodiac stripe.com/docs/api/checkout/sessions/create “在客户授权付款时暂停资金,但要等到以后才能获得资金。(并非所有付款方式都支持这一点。)”似乎你'重新正确。但这有问题吗?只有当他们购买了错误的产品或他们的付款被拒绝时,它才会通过。我还是用
stripe.PaymentIntent.cancel(payment_intent,)取消它。 -
这本身并不是一个“问题”,但这并不是最佳实践,因为您实际上是在用户的银行创建付款,然后再实际收取付款。如果您使用 Elements 并等到验证电子邮件地址后才创建 PaymentIntent,则不会让银行参与其中,因此在您准备好之前不会创建“真实”交易。我真的建议写信给support.stripe.com/email,因为他们可以更具体地回答利弊。
标签: stripe-payments