如何在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
相关产品推荐
相关产品推荐

