如何在Rails应用中集成WhatsApp并发送消息?是否有可用Gem或插件?
集成WhatsApp到Rails应用&发送消息的方案
嘿,我来给你详细讲讲怎么把WhatsApp集成到Rails应用里,还有怎么实现消息发送——这事儿我之前做过几次,总结下来主要有两种靠谱的方式:用官方的WhatsApp Business Platform,或者用现成的Gem来简化流程。
一、官方WhatsApp Business Platform(最正规的方式)
这是Meta官方提供的渠道,功能最完整,适合需要深度定制的场景。步骤大概是这样:
准备开发者账号与配置
- 先注册Meta开发者账号,创建一个新应用,然后添加「WhatsApp」产品
- 获取你的
ACCESS_TOKEN和PHONE_NUMBER_ID(在WhatsApp产品的设置里能找到) - 配置Webhook:WhatsApp会给你的Rails应用发送回调(比如接收消息、状态更新),你需要写一个控制器来处理这些请求。比如:
别忘了在routes.rb里加路由:# app/controllers/whatsapp_webhook_controller.rb class WhatsappWebhookController < ApplicationController skip_before_action :verify_authenticity_token def verify if params['hub.mode'] == 'subscribe' && params['hub.verify_token'] == ENV['WHATSAPP_VERIFY_TOKEN'] render plain: params['hub.challenge'] else render plain: 'Invalid verify token', status: 403 end end def receive # 处理收到的消息或状态更新 payload = JSON.parse(request.body.read) # 这里可以根据payload做逻辑处理,比如回复消息 head :ok end endpost '/whatsapp/webhook', to: 'whatsapp_webhook#receive' get '/whatsapp/webhook', to: 'whatsapp_webhook#verify'
发送消息
用Rails自带的Net::HTTP或者Faraday这类HTTP客户端调用官方API就行。比如发送文本消息的示例:require 'net/http' require 'uri' uri = URI("https://graph.facebook.com/v18.0/#{ENV['WHATSAPP_PHONE_NUMBER_ID']}/messages") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri) request['Authorization'] = "Bearer #{ENV['WHATSAPP_ACCESS_TOKEN']}" request['Content-Type'] = 'application/json' request.body = JSON.dump({ messaging_product: 'whatsapp', to: '目标用户的WhatsApp号码(带国家码,比如+123456789)', text: { body: '你好,这是来自Rails应用的消息!' } }) response = http.request(request) puts response.read_body
二、用Gem简化操作(快速上手)
如果不想自己写太多HTTP请求的代码,可以用第三方Gem,最常用的是whatsapp-sdk,维护得比较好,文档也清晰。
安装Gem
在你的Gemfile里添加:gem 'whatsapp-sdk'然后运行
bundle install。配置初始化文件
在config/initializers/whatsapp.rb里添加配置:WhatsappSdk.configure do |config| config.access_token = ENV['WHATSAPP_ACCESS_TOKEN'] config.phone_number_id = ENV['WHATSAPP_PHONE_NUMBER_ID'] config.graph_api_version = 'v18.0' # 可以根据官方最新版本调整 end发送消息的示例
发送文本消息:client = WhatsappSdk::Client.new response = client.messages.send_text( to: '+123456789', text: '这是通过Gem发送的WhatsApp消息!' ) puts response.success? # 检查是否发送成功发送图片消息:
client.messages.send_image( to: '+123456789', image: { link: 'https://example.com/image.jpg' } )
一些注意事项
- 所有敏感信息(比如access token、verify token)都要存在环境变量里,别硬编码在代码里,推荐用
dotenv-railsGem来管理 - 正式使用前,需要在Meta平台申请并激活正式的WhatsApp号码,测试阶段可以用官方提供的测试号码
- 要遵守WhatsApp的政策,不要发送垃圾消息,否则可能会被封号
内容的提问来源于stack exchange,提问作者Santosh Kumbhar
相关产品推荐
相关产品推荐

