我正在尝试设置 Stripe 结帐,如本 GoRails 剧集
中所述我已经使用Figaro gem在application.yml中定义了publishable_key和secret_key,所以在我的config/initializers/stripe.rb中我有这个代码
Rails.configuration.stripe = {
:publishable_key => ENV["public_key"],
:secret_key => ENV["private_key"]
}
Stripe.api_key = Rails.configuration.stripe[:secret_key]
puts Rails.configuration.stripe[:publishable_key]
puts Rails.configuration.stripe[:secret_key]
puts Stripe.api_key
现在,我知道到目前为止一切都很好,因为服务器启动时密钥会打印在控制台中。
但是,当操作转到控制器时,我收到一条消息:
“未提供 API 密钥。使用“Stripe.api_key = 设置您的 API 密钥” “。您可以从 Stripe Web 界面生成 API 密钥。 请参阅 https://stripe.com/api 了解详细信息,或者发送电子邮件至 [email protected](如果) 你有什么问题吗?”
我可以让它工作的唯一方法是通过
在控制器操作中重新设置条带 API 密钥class CheckoutsController < ApplicationController
def show
Stripe.api_key = Rails.configuration.stripe[:secret_key] #<---Have to re-set the API key
current_user.set_payment_processor :stripe
@checkout_session = current_user.payment_processor.checkout(
# mode: "payment",
# line_items: "price_1KuweRFkaCcck7q2JSu01hHi"
mode: "subscription",
line_items: "price_1KuyuVFkaCcck7q23EJLLpra"
)
end
end
为什么控制器无法识别初始化程序中定义的内容?
对于我来说,从“env”切换到“凭据”方法就做到了!: 首先使用以下命令设置凭证文件:
EDITOR=nano rails credentials:edit
然后像这样填充它:
secret_key_base: xxxxxx
stripe_publishable_key: xxxxxxxxx
stripe_secret_key: xxxxx
保存它。
然后在我的 PaymentController 中(您可以在任何涉及条带的控制器中转置)我添加了一个方法来设置 api_key:
before_action :set_stripe_key
....
private
def set_stripe_key
Rails.env.production?
Stripe.api_key = Rails.application.credentials.stripe_secret_key
else
Stripe.api_key = Rails.configuration.stripe[:secret_key]
end
end
然后重新启动您的应用程序/服务器,一切都应该很好
注意:直到今天我仍然不知道为什么“env”方法在生产中不起作用......
这是一个变量范围问题。控制器中使用的条带实例与初始化程序中使用的条带实例不同。我会从一开始就更密切地关注该视频,并使用与该视频相同的策略。