gpt4 book ai didi

ruby-on-rails - Stripe 结帐测试版 : Avoid creating new customer for every payment

转载 作者:行者123 更新时间:2023-12-04 17:39:26 24 4
gpt4 key购买 nike

我正在使用 Stripe Checkout Beta 构建 Rails 应用程序.为此,我正在创建一个 Stripe::Checkout::Session在服务器上,使用 redirectToCheckout在前端,然后等待类型为 checkout_beta.session_succeeded 的 webhook 进入告诉我付款已完成。这工作正常,但是:

对于每笔付款,Stripe 创建一个 新品 客户 - 这不是我想要的。如果现有客户第二次付款,Stripe 不应创建新客户,新付款应链接到现有客户。

如何在重定向到 Checkout 之前设置客户 ID?

这是我的 ruby Controller 代码:

# app/controllers/payments_controller.rb

def new
@session = Stripe::Checkout::Session.create(
success_url: "https://shop.example.test/success",
cancel_url: "https://shop.example.test/cancelled",
payment_method_types: ["card"],
line_items: cart_items.map do |cart_item|
{
name: cart_item.name,
quantity: 1,
amount: cart_item.name.price.cents,
currency: 'eur'
}
end,
customer_email: current_user.email
)
end

HTML 代码(使用 Slim):
# app/views/payments/new.html.slim

= content_tag :div, nil, data: { \
controller: 'stripe',
stripe_public_key: ENV['STRIPE_PUBLIC_KEY'],
stripe_session_id: @session.id }


JavaScript 代码(使用 Stimulus.js):

// app/javascripts/controllers/stripe_controller.js

import { Controller } from 'stimulus'

export default class extends Controller {
connect() {
this.stripe = window.Stripe(this.data.get('public-key'), {
betas: ['checkout_beta_4']
})

this.stripe.redirectToCheckout({
paymentIntentId: this.data.get('session-id')
}).then((result) => {
console.log(result)
})
}
}


ruby 网络钩子(Hook) 代码(使用 gem stripe_event):

# config/initializer/stripe.rb

Stripe.api_key = Rails.configuration.x.stripe.private_key
Stripe.api_version = '2019-02-19; checkout_sessions_beta=v4'
StripeEvent.signing_secret = Rails.configuration.x.stripe.webhook_secret

class RecordSessions
def call(event)
session = event.data.object

Payment.create!(
stripe_charge_token: session.payment_intent
)
end
end

StripeEvent.configure do |events|
events.subscribe 'checkout_beta.session_succeeded', RecordSessions.new
end

最佳答案

Stripe::Checkout::Session.createAPI允许添加 customer引用 Stripe 客户 ID 的键。这样,付款将添加到您现有的客户。

You may specify an existing Customer object for Checkout to use when making one-time payments or subscriptions. If you do so, any Stripe objects that Checkout creates are associated with that Customer.

session = Stripe::Checkout::Session.create(
customer: 'cus_123',
payment_method_types: ['card'],
line_items: [{
name: 'T-shirt',
description: 'Comfortable cotton t-shirt',
images: ['https://example.com/t-shirt.png'],
amount: 500,
currency: 'eur',
quantity: 1,
}],
success_url: 'https://example.com/success',
cancel_url: 'https://example.com/cancel',
)


见: https://stripe.com/docs/payments/checkout/server#using-existing-customers

关于ruby-on-rails - Stripe 结帐测试版 : Avoid creating new customer for every payment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55165793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com