在 Rails 中正确引入 Mollie Payment API 的方法
结论
这个版本的 Mollie::API::Client 没有 api_key= 方法。创建客户端时应直接传入 API Key:
mollie = Mollie::API::Client.new(ENV.fetch('MOLLIE_API_KEY'))
Ruby 的 require 路径区分大小写,通常应写成:
require 'mollie/api/client'
如果 Gemfile 没有禁用自动加载,Rails 通常会通过 Bundler 加载这个 gem,不必在 controller 中重复 require。
修改后的示例
问题中的代码使用了 Mollie::API::Client 和 mollie.payments.create,对应的旧版客户端接口可以这样写:
class PagesController < ApplicationController
def form_page
mollie = Mollie::API::Client.new(ENV.fetch('MOLLIE_API_KEY'))
payment = mollie.payments.create(
amount: 10.00,
description: 'My first API payment',
redirectUrl: success_url
)
redirect_to payment.get_payment_url
end
def success
mollie = Mollie::API::Client.new(ENV.fetch('MOLLIE_API_KEY'))
payment = mollie.payments.get(params[:id])
if payment.paid?
# 在这里展示付款结果,或读取已经由 webhook 更新的订单状态
end
end
end
get_payment_url、回跳参数和 redirectUrl 的具体名称取决于项目安装的 mollie-api-ruby 版本。如果当前版本使用 checkout_url 等其他方法,应以该版本提供的接口为准。
推荐的配置方式
不要将 API Key 直接写进 controller,也不要把它提交到 Git 仓库。可以将其保存在环境变量中:
export MOLLIE_API_KEY="test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
然后在 Rails 中读取:
Mollie::API::Client.new(ENV.fetch('MOLLIE_API_KEY'))
如果项目使用 Rails credentials,也可以这样配置:
mollie = Mollie::API::Client.new(
Rails.application.credentials.dig(:mollie, :api_key)
)
如果 Bundler 没有自动加载这个 gem,先检查 Gemfile 是否设置了 require: false。正常配置如下:
gem 'mollie-api-ruby'
确实需要手动加载时,可以将 require 放在 initializer 或相关类的顶部:
require 'mollie/api/client'
付款流程还需要调整
创建付款后马上执行下面的查询,通常不会得到已付款状态:
payment = mollie.payments.get(payment.id)
if payment.paid?
puts 'Payment received.'
end
此时用户还没有进入 Mollie 的结账页面。正常的付款流程是:
- 后端创建 Mollie payment。
- 保存 Mollie payment ID,并将其与本地订单关联。
- 将用户重定向到 Mollie 返回的付款地址。
- Mollie 处理完成后调用 webhook。
- 后端根据 payment ID 查询实际状态并更新订单。
- 用户返回
success_url后,页面展示订单结果。
访问了 success 页面并不表示付款成功,因为用户可以直接打开这个 URL。付款状态应通过 Mollie API 查询,或从已经验证的 webhook 结果中确认。
Mollie 一般要求 redirectUrl 使用完整的公开 URL,因此应写成:
redirectUrl: success_url
不要写成:
redirectUrl: '/index'
注意不同 SDK 版本的差异
较新的 Mollie Ruby SDK 可能使用不同的命名空间、全局配置方式和金额结构。例如,金额可能需要同时提供币种和保留两位小数的字符串:
amount: {
currency: 'EUR',
value: '10.00'
}
不要混用不同版本文档中的代码。当前错误已经表明,加载的 Mollie::API::Client 不支持 api_key=。对于问题中的接口,将 API Key 直接传给构造函数即可:
mollie = Mollie::API::Client.new(ENV.fetch('MOLLIE_API_KEY'))
备注:内容仅供参考。