wechat-api 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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