开源项目 企业微信 gem 发布: qy_wechat、qy_wechat_api

ruby_sky · 2014年11月04日 · 最后由 ruby_sky 回复于 2016年06月06日 · 8278 次阅读

对接企业微信应答: https://github.com/lanrion/qy_wechat

(对应公众号 gem:https://github.com/lanrion/weixin_rails_middleware)

安装

目前只有 Master 稳定版本,务必通过:

gem 'qy_wechat', git: 'https://github.com/lanrion/qy_wechat.git'

安装。

使用

示例:https://github.com/lanrion/qy_wechat_example

rails g qy_wechat:install
rails g qy_wechat:migration QyApp # QyAapp 你保存企业号应用的Model

分别会产生:

配置保存企业微信账号的 Model: qy_wechat_example/config/initializers/qy_wechat_config.rb

这里实现你的业务逻辑: qy_wechat_example/app/decorators/controllers/qy_wechat/qy_wechat_controller_decorator.rb

同时添加以下 4 个字段:

  • qy_token
  • encoding_aes_key # 长度固定为 43 个字符,从 a-z, A-Z, 0-9 共 62 个字符中选取
  • corp_id
  • qy_secret_key # 用于标志属于哪个应用

特别注意: 由于一个企业号,可以对应多个应用,可以根据 corp_id 关联你保存对应的企业号应用。

最后在你的 QyApp 中添加如下代码生成你的 qy_secret_key:

class QyApp < ActiveRecord::Base

  before_create :init_qy_secret_key

  private

    def init_qy_secret_key
      self.qy_secret_key = SecureRandom.hex(8)
    end
end

生成服务验证 URL

qy_wechat_engine.qy_verify_url(qy_app.qy_secret_key)

issue

欢迎提交使用中的 bug,或者改进意见:https://github.com/lanrion/qy_wechat/issues/new

QyWechatApi

企业微信高级 API

https://rubygems.org/gems/qy_wechat_api

Gem Version

企业号对应多个管理组,请前往 设置 => 权限管理 任意创建一个管理组,在管理组最下角即可获取 CorpID Secret

有问题请及时提 issue

gem "qy_wechat_api", git: "https://github.com/lanrion/qy_wechat_api.git"

Token 存储方案

对象存储

如果你是单个企业号,建议使用这个方案,无需任何配置即可使用。

Redis 存储

redis = Redis.new(host: "127.0.0.1", port: "6379")

namespace = "qy_wechat_api:redis_storage"

# cleanup keys in the current namespace when restart server everytime.
exist_keys = redis.keys("#{namespace}:*")
exist_keys.each{|key|redis.del(key)}

redis_with_ns = Redis::Namespace.new("#{namespace}", redis: redis)

QyWechatApi.configure do |config|
  config.redis = redis_with_ns
end

API 基本用法

请务必结合:http://qydev.weixin.qq.com/wiki/index.php 理解以下 API 参数使用。

初始化

group_client = QyWechatApi::Client.new(corpid, corpsecret)
# 为了确保用户输入的corpid, corpsecret是准确的,请务必执行:
group_client.is_valid?

部门

group_client.department.create(name, parent_id, order=nil)
group_client.department.update(id, name, parent_id, order=nil)
group_client.department.delete(id)
group_client.department.list

成员

group_client.user.create(user_id, name, options={})
group_client.user.update(user_id, options={})
group_client.user.delete(user_id)
group_client.user.get(user_id)
group_client.user.simple_list(department_id, fetch_child=nil, status=nil)

标签

group_client.tag.create(name)
group_client.tag.update(id, name)
group_client.tag.delete(id)
group_client.tag.get(id)
group_client.tag.add_tag_users(id, user_ids)
group_client.tag.delete_tag_users(id, user_ids)
group_client.tag.list

自定义菜单

menu_json 的生成方法请参考: https://github.com/lanrion/weixin_rails_middleware/wiki/DIY-menu

group_client.menu.create(menu_json, app_id)
group_client.menu.delete(app_id)
group_client.menu.get(app_id)

Oauth2 用法

先要配置你应用的 可信域名 2458023e.ngrok.com state 为开发者自定义参数,可选

# 生成授权url
group_client.oauth.authorize_url("http://2458023e.ngrok.com", "state")

# 获取code后,获取用户信息
# app_id: 跳转链接时所在的企业应用ID
group_client.oauth.get_user_info("code", "app_id")

发送消息

# params: (users, parties, tags, agent_id, content, safe=0)
# users, parties, tags 如果是多个用户,传数组,如果是全部,则直接传 "@all"
group_client.message.send_text("@all", "@all", "@all", app_id, text_message)

其他发送消息方法请查看 api/message.rb

上传多媒体文件

# params: media, media_type
group_client.media.upload(image_jpg_file, "image")

# 获取下载链接
# 返回一个URL,请开发者自行使用此url下载
group_client.media.get_media_by_id(media_id)

有问题可以前往:微信开发论坛:http://weixin-dev.com/

匿名 #1 2014年11月04日

已喜欢 :plus1:

@ruby_sky 为何你要用 engine,这只是一个简单的 GEM,一般不需要用 engine 吧?你这里使用的好处是?

#5 楼 @luffycn 不是认同 简单,任何一个 gem,外人看着简单,其实要保持长期维护、如果与实际业务沟通、与第三方开发者保持沟通、与官方的 API 保持更新,是相当辛苦的,相信有自己开源 gem 的同学,都能深刻体会。

Rails engine 是基于 Rails 框架的很多特性,而 普通的 ruby gem,仅仅是一个可以打包为一个插件的工具,如果要集成 Rails 的特性,你需要花很多时间去手动弄,所以,直接用 engine 是最好的。

@ruby_sky 我想你误会了,我这里并不是指 '难度' 简单,而是看到很多使用 engine 的,像 spree, 有比较复杂的业务逻辑,就像是一个很大的 application. 我这里的简单指的是业务逻辑相对简单,功能比较单一的,并不是什么算法简单,或者难度简单。。我的意思是一个功能相对单一的,为何要使用 engine 模式,他的好处是什么

#7 楼 @luffycn 嗯,我误会了。 Rails Engine 可以很好的无缝接入 Rails,比如你要有一个 route、生成一个 migration,Controller 的特性。微信需要做一个信息校验、加解密等非业务,这一部分我的想法是透明的,不需要开发者关心,开发者只需要重写某个东西来实现自己的业务。用 Rails Engine 是优先选择。

当然如果用普通的 ruby gem,也可以实现,但是你还是要借助于 rails 的某些组件,比如说 Railties、AR、AS 等,那何不苦直接用 Engine 呢。

什么时间用 Ruby gem,比如https://github.com/lanrion/qy_wechat_api (未完成),对接企业微信的高级 API,需要做的只是发一个 HTTP 请求,我们可以做得很简单,也可以做得很复杂,比如 token 2 个小时过期,缓存起来,提供 redis 和对象缓存方案,但也要考虑要让第三方接入自己的缓存方案,比如说开发者喜欢用 memcached,那你的代码设计要灵活,开发者可以很方便接入。 举个例子: https://github.com/lanrion/weixin_rails_middleware/wiki/Custom-Adapter weixin_rails_middleware 目前默认支持一个公众号与多个公众号,但有些用户存储多个公众号的设计方案会有些不同,所以,我提供一个开发者可以自定义存储的解决方案。

微信给开发者的新功能推出较频繁,维护这样几个 gem 确实相当辛苦,赞楼主

赞一个!

来赞一个。

中文指导,良心制作,先赞。

请问一下这两个 gem 有啥区别啊

#13 楼 @golden05 一个是企业微信的关键字应答,一个是高级 API。

@ruby_sky 刚在你 Github 上的 weixin_authorize 开了一个 issue,希望能看下为什么会是这样?

#14 楼 @ruby_sky 高级 api 是否可以在 回调模式 下 响应 员工的请求 并通过第三方应用回复请求啊,这个可否有一个简单的 rails 案例啊

#17 楼 @golden05 “第三方应用”指的是?

#18 楼 @ruby_sky 回调模式 不就是为了满足 企业应用接收企业号推送请求的吗

@ruby_sky 在 Github 上提交了一个 issue,想问下,当前是否支持回复模板消息?

#21 楼 @OhCoder 不支持,目前测试公众号没的这个权限。有需要的话,需要提供测试号给我,提供支持。

@ruby_sky 你好。Github 上更新了關於模板消息的 issue,麻煩幫忙看下。thanks

@OhCoder 你好,添加了 redis,不确定配置是否正确,在 Github 上提交了一个问题,麻烦帮忙回答一下,thanks

@ruby_sky 你好,调用多客服方法的时候遇到一个返回消息的问题,thanks

#25 楼 @OhCoder 有问题,请前往: http://weixin-dev.com/topics 微信开发论坛提问,会第一时间响应。

ruby_sky [该话题已被删除] 提及了此话题。 06月06日 21:52
需要 登录 后方可回复, 如果你还没有账号请 注册新账号