You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ruby on Rails中对接MercadoPago?求控制器实现示例

如何在Ruby on Rails中对接MercadoPago并实现Token保存功能

嘿,我刚好做过类似的MercadoPago对接,给你一步步拆解怎么实现用户点击按钮后保存Tokens的功能——

1. 先安装MercadoPago Ruby SDK

首先得把官方的SDK加到项目里,在你的Gemfile中添加:

gem 'mercadopago-sdk'

然后运行bundle install完成安装。

2. 配置MercadoPago凭据

在config/initializers目录下新建mercado_pago.rb文件,用来初始化SDK:

require 'mercadopago'

MercadoPago::SDK.configure do |config|
  config.access_token = ENV['MERCADO_PAGO_ACCESS_TOKEN'] # 从环境变量取,别硬编码!
  config.client_id = ENV['MERCADO_PAGO_CLIENT_ID']
  config.client_secret = ENV['MERCADO_PAGO_CLIENT_SECRET']
end

记得把你的MercadoPago平台获取的CLIENT_ID、CLIENT_SECRET和ACCESS_TOKEN加到环境变量里(比如用dotenv gem管理)。

3. 准备存储Token的模型

假设你要把用户的MercadoPago Token关联到User模型,先加个迁移:

rails generate migration AddMercadoPagoTokenToUsers mercado_pago_token:string
rails db:migrate

如果需要更详细的token信息(比如过期时间、刷新令牌),也可以建一个单独的PaymentToken模型关联到User,按需调整即可。

4. 实现控制器逻辑

新建一个PaymentsController,处理授权跳转和回调保存Token:

class PaymentsController < ApplicationController
  # 显示授权按钮的页面
  def new
    # 生成MercadoPago授权URL
    @auth_url = MercadoPago::OAuth.create({
      client_id: ENV['MERCADO_PAGO_CLIENT_ID'],
      redirect_uri: payments_callback_url, # 回调URL要和MercadoPago后台配置一致
      response_type: 'code',
      scope: 'offline_access payments write' # 按需申请权限,别多要不必要的
    }).response['auth_url']
  end

  # 处理MercadoPago的回调,保存Token
  def callback
    # 用授权码换取正式的access token
    auth_response = MercadoPago::OAuth.create({
      client_id: ENV['MERCADO_PAGO_CLIENT_ID'],
      client_secret: ENV['MERCADO_PAGO_CLIENT_SECRET'],
      code: params[:code],
      redirect_uri: payments_callback_url,
      grant_type: 'authorization_code'
    })

    if auth_response.success?
      # 提取返回的token相关信息
      access_token = auth_response.response['access_token']
      refresh_token = auth_response.response['refresh_token']
      expires_in = auth_response.response['expires_in']

      # 保存到当前登录用户(假设已实现current_user方法)
      current_user.update!(
        mercado_pago_token: access_token,
        mercado_pago_refresh_token: refresh_token,
        mercado_pago_token_expires_at: Time.now + expires_in.seconds
      )

      redirect_to root_path, notice: 'MercadoPago授权成功,Token已保存!'
    else
      redirect_to root_path, alert: "授权失败:#{auth_response.response['message']}"
    end
  end
end

别忘了在config/routes.rb里添加对应路由:

resources :payments, only: [:new]
get 'payments/callback', to: 'payments#callback'

5. 视图里添加授权按钮

在app/views/payments/new.html.erb中添加跳转按钮:

<h3>绑定MercadoPago账号</h3>
<%= link_to '授权MercadoPago', @auth_url, class: 'btn btn-primary', target: '_blank' %>

用户点击后会跳转到MercadoPago的官方授权页面,授权完成后会自动回调到我们的callback动作,完成Token的保存。

关键注意点

  • 一定要在MercadoPago开发者后台配置好回调URL(和代码里的payments_callback_url完全一致),否则回调会直接失败
  • 权限范围(scope)按需选择,只申请业务需要的权限即可,避免不必要的风险
  • 生产环境绝对不要把凭据硬编码到代码里,用环境变量或者加密配置管理
  • 可以额外处理用户未登录的情况,比如跳转登录页后再回到授权流程

内容的提问来源于stack exchange,提问作者Sebastian Ruiz Perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:55:10