【问题标题】:How to check user email before submitting payment with Stripe如何在使用 Stripe 提交付款之前检查用户电子邮件
【发布时间】: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/retrievehttps://stripe.com/docs/api/payment_intents/confirmhttps://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


【解决方案1】:

我想我已经解决了第一种方法,方法是将 success_url 设置为在自定义页面上包含 session_id 作为参数。然后当该页面加载时,我通过 Flask 获取 session_id 并按如下方式检索信息

data = request.args
session_id = data["session_id"]
session = stripe.checkout.Session.retrieve(session_id)
payment_intent_id = session["payment_intent"]
payment_intent = stripe.PaymentIntent.retrieve(payment_intent_id,)
customer_email = payment_intent["charges"]["data"][0]["billing_details"]["email"]
if customer_email == "abc@mail.com":  # will perform a different check, just a trivial example
    stripe.PaymentIntent.capture(payment_intent_id, )
    # verify payment
    success = True
else:
    stripe.PaymentIntent.cancel(payment_intent_id, )
    success = False
return f"{success}"

编辑: 如前所述,这会冻结资金,因此可能不是最好的主意。正在研究方法 2。

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 2014-09-29
    • 2022-11-25
    • 1970-01-01
    • 2014-02-14
    • 2022-01-22
    • 1970-01-01
    • 2016-06-09
    • 2015-04-03
    相关资源
    最近更新 更多