-
Notifications
You must be signed in to change notification settings - Fork 116
Getting Started
在你的 Gemfile
加入:
gem 'weixin_authorize'
或者
gem 'weixin_authorize', git: "https://github.com/lanrion/weixin_authorize.git"
然后:
bundle
- 初始化
WeixinAuthorize::Client
的实例,传入公众账号的app_id跟app_secret即可。
# 创建一个实例
$client ||= WeixinAuthorize::Client.new(ENV["APPID"], ENV["APPSECRET"])
- 为了避免用户填写app_id和app_secret出错,请务必在初始化client时,对其做验证,注意:不是每次调用微信API时调用。
$client.is_valid? # return true or false
-
$client.mass_autoreply_rules
-
创建分组:
group = $client.create_group("test")
-
查询所有分组:
groups = $client.groups
-
查询用户所在分组:
group = $client.get_group_for(ENV["OPENID"])
-
修改分组名:
group = $client.update_group_name(ENV["OPENID"], "new_group_name")
-
移动用户分组:
group = $client.update_group_for_openid(ENV["OPENID"], "to_groupid")
-
response = $client.create_menu(menu) # Hash or Json
-
response = $client.menu
-
response = $client.delete_menu
-
发送文本信息:
$client.send_text_custom(to_user, content)
-
发送图片信息:
$client.send_image_custom(to_user, media_id)
-
发送语音消息:
$client.send_voice_custom(to_user, media_id)
-
发送视频消息:
$client.send_video_custom(to_user, media_id, options)
-
发送音乐消息:
$client.send_music_custom(to_user, media_id, musicurl, hqmusicurl, options)
-
发送图文消息:
$client.send_news_custom(to_user, articles=[])
-
创建临时二维码
$client.create_qr_scene("123", 1800)
-
创建永久二维码(数字ID)
$client.create_qr_limit_scene({scene_id: 1234})
-
创建永久二维码(字符串)
$client.create_qr_limit_str_scene({scene_str: "concrete_scene"})
-
通过ticket换取二维码, 直接访问返回的链接即可显示!
$client.qr_code_url("ticket_example_value")
- 上传多媒体文件
上传的多媒体文件有格式和大小限制,如下:
图片(image): 128K,支持JPG格式 语音(voice):256K,播放长度不超过60s,支持AMR\MP3格式 视频(video):1MB,支持MP4格式 缩略图(thumb):64KB,支持JPG格式 媒体文件在后台保存时间为3天,即3天后media_id失效。
$client.upload_media(image_file_or_path, "input_media_type")
目前1.5.9(包括1.5.9)以后, 支持任何格式与任何URL形式的图片上传. 你可以指定本地图片或者远程图片, 也可以使用不同格式的比如png, ico 等格式, 或者直接自己 File.new 出来的图片.
- 下载多媒体文件
注意:媒体文件在后台保存时间为3天,即3天后media_id失效。
$client.download_media_url(media_id)
返回一个Media远程下载链接,注意:包含access_token值,请务必在action层做好安全性,下载请第三方开发者自行根据Paperclip或者Carrierwave来保存。
-
获取门店信息
$client.poi(poi_id)
-
拉取门店列表
$client.pois
-
新增门店
$client.poi_add
-
修改门店
$client.poi_update
-
删除门店
$client.poi_delete
-
拉取门店类目表
$client.poi_category
参考实现:https://github.com/lanrion/weixin_authorize/blob/master/lib%2Fweixin_authorize%2Fapi%2Foauth.rb 用于授权,获取用户信息,或者绑定系统账号
$client.authorize_url(redirect_url)
# 回调后,获取code请求token或者openid:
sns_info = $client.get_oauth_access_token(params[:code])
# 再调用以下API,拉取用户信息:
$client.get_oauth_userinfo(openid, oauth_token)
多个公众账号情况下强烈建议使用 Redis来保存access_token
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。
-
原因:为了避免 多公众账号情况下 请求次数过多以及在请求中浪费不必要的资源(重新发起http请求获取),我们使用Redis 的
Hash
结构,并使用appid加密后作为key来存储access_token,默认的生命周期为7200-10=7180
秒,详见:https://github.com/lanrion/weixin_authorize/blob/master/lib/weixin_authorize/client.rb#L71 -
添加
redis-namespace
到你的Gemfile
:
# Adds a Redis::Namespace class which can be used to namespace calls to Redis. This is useful when using a single instance of Redis with multiple, different applications.
# http://github.com/resque/redis-namespace
gem "redis-namespace", "~> 1.4.1"
- 添加被始化文件:
config/initializers/weixin_authorize.rb
# 这里修改成你的的命名空间。
namespace = "app_name_weixin:weixin_authorize"
redis = Redis.new(:host => "127.0.0.1", :port => "6379", :db => 15)
# 每次重启时,会把当前的命令空间所有的access_token 清除掉。
exist_keys = redis.keys("#{namespace}:*")
exist_keys.each{|key|redis.del(key)}
# Give a special namespace as prefix for Redis key, when your have more than one project used weixin_authorize, this config will make them work fine.
redis = Redis::Namespace.new("#{namespace}", :redis => redis)
WeixinAuthorize.configure do |config|
config.redis = redis
end
注意,如果不做上述的redis配置,则不会使用Redis来存放access_token,直接存在当前实例中
- 另外一个可选项是,你可以指定存储access_token的key值,多个公众账号,建议最好用
id
值即可(插件会进行加密转换),保持唯一性。
没有特别的需求,不建议使用。
$client ||= WeixinAuthorize::Client.new(ENV["APPID"], ENV["APPSECRET"], redis_key: "your_store_key")
access_token
每次请求后,上一次的access_token会失效。所以如果存储在Redis中,但同时又在另一边重新跑了一次请求access_token的操作,那么保存在Redis的access_token会失效,在开发环境下,restart你的Rails Server即可,清除所有access_token的代码如下:
# 每次重启时,会把当前的命令空间所有的access_token 清除掉。
exist_keys = redis.keys("#{namespace}:*")
exist_keys.each{|key|redis.del(key)}
所以 强烈建议在微信的沙盒测试环境下进行开发并测试 : 微信沙盒测试平台地址: http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index 一个微信号对应一个测试账号,申请后,app_id和app_secret_key, 一年内不会发生改变。