wechat-api 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a1da7465e7436ff9a4d1f959f198a63ffc3e028
4
- data.tar.gz: 4bfc9ba3e18733fe9146679b32b295665934d2d8
3
+ metadata.gz: 6d5004c2f463eb0b4f3bdbdc7011e9bc1424c8de
4
+ data.tar.gz: 7e1e9ff5632c305ee2e3589085c7a0912b44dbff
5
5
  SHA512:
6
- metadata.gz: d79b3b01a2fbb922ea6019af273d12244cdda7e15bc250e30f648a2c9c7a94c76f8759619304edb91f911563a5c5e4e47ff62c035e70bab10bdd00abaaab2bf7
7
- data.tar.gz: 4a7aba85ce5c46fb22b8101c25b97c28330b9795db8cbeaf5acb2fc1da5fd2526ae3fbef4279bf7b520c0454ca1392ca76ff1aae4f024bfcff5d1fdc3fe36ec4
6
+ metadata.gz: ecf554acceb4735dd74191f9b461b84c8314a7b3401d43e6e481af9dd3e4707099551725421f354013e2afd0ac1c0a16d9e192a4180b956063779329aead4529
7
+ data.tar.gz: 5cd2529274cac2084aa95c2de52f01d36411d103d3cf38c80b3572929105d562b3617ef9bd825e6300da6168f6ef6424968d7cfded809ac15e082bde14b6f4a8
data/README.md CHANGED
@@ -21,6 +21,12 @@ https://github.com/lazing/wechat-api
21
21
  * 不够简单,特别是用于多账号管理的时候
22
22
  * 微信 api 更新频繁,需要易于使用新功能
23
23
 
24
+ ## 主要功能清单
25
+ * 支持微信服务号和订阅号API
26
+ * 支持微信js_ticket获取
27
+ * 支持微信红包API
28
+ * 支持微信企业号主动调用API
29
+
24
30
  ## 使用方式
25
31
 
26
32
  ````ruby
@@ -30,15 +36,25 @@ gem 'wechat-api'
30
36
  ````ruby
31
37
  require 'wechat-api'
32
38
 
33
- client = Wechat::Api::Client.new 'appid', 'appsecret'
39
+ api = Wechat::Api::Client.new 'appid', 'appsecret'
34
40
 
35
- client.get 'user/info', nextopenid: 'xxx'
41
+ api.get 'user/info', nextopenid: 'xxx'
36
42
  # 当使用 get 方式时,hash 参数将做个 query params 附在请求后
37
43
 
38
- client.post 'user/info/updateremark', openid;'xxxx', remark: '我是注释'
44
+ api.post 'user/info/updateremark', openid;'xxxx', remark: '我是注释'
39
45
  # 当使用 post 方法时,hash 参数将转换为 json,因此可以支持嵌套的结构
40
46
  ````
41
47
 
48
+ 微信企业号主动调用API
49
+
50
+ ````ruby
51
+ require 'wechat-api'
52
+
53
+ qy = Wechat::Qy::Client.new 'corpid', 'corpsecret'
54
+ qy.text_send 'agentid', 'message', touser: 'UserId1|UserId2' #提供的预定义方法
55
+ qy.post 'api/uri', { key: :value} #未提供预定义方法时调用
56
+ ````
57
+
42
58
  ## 一些预定义方法
43
59
 
44
60
  预定义接口方法可以方便使用。
@@ -47,13 +63,13 @@ client.post 'user/info/updateremark', openid;'xxxx', remark: '我是注释'
47
63
 
48
64
  ````ruby
49
65
  # 创建固定二维码
50
- client.create_qrcode(scene_str)
66
+ api.create_qrcode(scene_str)
51
67
 
52
68
  # 创建临时二维码
53
- client.create_qrcode_temp(scene_id)
69
+ api.create_qrcode_temp(scene_id)
54
70
 
55
71
  # 发送模板消息
56
- client.send_template(template_id, openid, url, data = {})
72
+ api.send_template(template_id, openid, url, data = {})
57
73
  ````
58
74
 
59
75
  以上接口返回微信文档定义的 json 数据转换后的ruby的 hash 对象
@@ -1,2 +1,3 @@
1
1
  require 'wechat/api'
2
2
  require 'wechat/pay'
3
+ require 'wechat/qy'
@@ -2,6 +2,6 @@
2
2
  module Wechat
3
3
  #
4
4
  module Api
5
- VERSION = '0.1.3'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
@@ -0,0 +1,10 @@
1
+ module Wechat
2
+ #
3
+ module Qy
4
+ end
5
+ end
6
+
7
+ require 'wechat/qy/client'
8
+ require 'wechat/qy/message'
9
+
10
+ ::Wechat::Qy::Client.send :include, ::Wechat::Qy::Message
@@ -0,0 +1,117 @@
1
+ require 'multi_json'
2
+ require 'faraday'
3
+ require 'logger'
4
+
5
+ module Wechat
6
+ module Qy
7
+ #
8
+ class ResponseError < StandardError; end
9
+ class AccessTokenExpiredError < ResponseError; end
10
+ #
11
+ class Client
12
+
13
+ API_BASE = 'https://qyapi.weixin.qq.com/cgi-bin/'
14
+
15
+ attr_reader :corp_id, :corp_secret
16
+ attr_accessor :logger
17
+
18
+ def initialize(corp_id, corp_secret)
19
+ @corp_id, @corp_secret = corp_id, corp_secret
20
+ @logger = Logger.new(STDOUT)
21
+ @token_file = File.join('/tmp', "wechat-api-#{corp_id}")
22
+ end
23
+
24
+ def access_token
25
+ @access_token ||= begin
26
+ token = MultiJson.load(File.read(@token_file))
27
+ token['access_token']
28
+ rescue
29
+ refresh
30
+ end
31
+ end
32
+
33
+ def refresh
34
+ url = format('%sgettoken', API_BASE)
35
+ resp = connection.get(url, token_params)
36
+ response = MultiJson.load(resp.body)
37
+ return handle_error(response) if response['errcode']
38
+ @access_token = response['access_token']
39
+ File.open(@token_file, 'w') { |f| f.write(resp.body) } if @access_token
40
+ @access_token
41
+ end
42
+
43
+ def get(uri, params = {})
44
+ with_access_token(uri, params) do |url, params_with_token|
45
+ debug_request do
46
+ connection.get do |req|
47
+ req.url url, params_with_token
48
+ req.headers[:accept] = 'application/json'
49
+ req.headers[:content_type] = 'application/json'
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ def post(uri, data = {})
56
+ with_access_token(uri, {}) do |url, params|
57
+ logger.debug { [:data, data] }
58
+ debug_request do
59
+ connection.post do |req|
60
+ req.url url, params
61
+ req.headers[:accept] = 'application/json'
62
+ req.headers[:content_type] = 'application/json'
63
+ req.body = MultiJson.dump(data)
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ def with_access_token(uri, params, tried = 2)
70
+ url = format('%s%s', API_BASE, uri)
71
+ begin
72
+ resp = yield(url, params.merge(access_token: access_token))
73
+ response = MultiJson.load(resp.body)
74
+ handle_error(response)
75
+ rescue AccessTokenExpiredError => e
76
+ refresh
77
+ retry unless (tried -= 1).zero?
78
+ raise e
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def debug_request
85
+ response = yield
86
+ logger.debug { response }
87
+ response
88
+ end
89
+
90
+ def handle_error(response)
91
+ case response['errcode']
92
+ when 0, nil
93
+ response
94
+ when 40_001, 42_001, 40_014
95
+ fail AccessTokenExpiredError, response
96
+ else
97
+ fail ResponseError, response
98
+ end
99
+ end
100
+
101
+ def token_params
102
+ {
103
+ corpid: corp_id,
104
+ corpsecret: corp_secret
105
+ }
106
+ end
107
+
108
+ def connection
109
+ @connection ||= begin
110
+ Faraday.new do |faraday|
111
+ faraday.adapter Faraday.default_adapter
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,16 @@
1
+ module Wechat
2
+ module Qy
3
+ module Message
4
+ # text_send('appid', 'hello', touser: 'User1|User2')
5
+ def text_send(agent_id, content, data = {})
6
+ params = {
7
+ msgtype: :text,
8
+ agentid: agent_id,
9
+ safe: 0,
10
+ text: { content: content }
11
+ }.merge(data)
12
+ post 'message/send', params
13
+ end
14
+ end
15
+ end
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wechat-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Wong
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-20 00:00:00.000000000 Z
11
+ date: 2016-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -174,6 +174,9 @@ files:
174
174
  - lib/wechat/pay.rb
175
175
  - lib/wechat/pay/client.rb
176
176
  - lib/wechat/pay/redpack.rb
177
+ - lib/wechat/qy.rb
178
+ - lib/wechat/qy/client.rb
179
+ - lib/wechat/qy/message.rb
177
180
  - spec/spec_helper.rb
178
181
  - spec/wechat/api/client_spec.rb
179
182
  - spec/wechat/pay/client_spec.rb