PAYATHON 2026

在 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 的结账页面。正常的付款流程是:

  1. 后端创建 Mollie payment。
  2. 保存 Mollie payment ID,并将其与本地订单关联。
  3. 将用户重定向到 Mollie 返回的付款地址。
  4. Mollie 处理完成后调用 webhook。
  5. 后端根据 payment ID 查询实际状态并更新订单。
  6. 用户返回 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'))

备注:内容仅供参考。