wechat-api 0.1.1 → 0.4.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 +5 -5
- data/.gitignore +1 -0
- data/Gemfile +1 -7
- data/README.md +23 -8
- data/lib/wechat-api.rb +1 -0
- data/lib/wechat/api.rb +13 -0
- data/lib/wechat/api/client.rb +16 -7
- data/lib/wechat/api/js_ticket.rb +22 -0
- data/lib/wechat/api/util.rb +25 -0
- data/lib/wechat/api/version.rb +1 -1
- data/lib/wechat/qy.rb +10 -0
- data/lib/wechat/qy/client.rb +117 -0
- data/lib/wechat/qy/message.rb +16 -0
- data/spec/wechat/api/js_ticket_spec.rb +18 -0
- data/spec/wechat/api/util_spec.rb +19 -0
- data/wechat-api.gemspec +11 -8
- metadata +63 -30
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3af5535d32a85e57f6ed8f517cb17cbd0e8941e42610bc467a0cdb4a4936f411
|
4
|
+
data.tar.gz: 5de42166d01da0ea3047cc53f87864e85c4454a753b351f62d2c5d4ee64d0871
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d77173f5c03d1bf1bf345a947238b5fa6966de3f67a8ff596670c904b1c9e726856d160be9c30a6c14f8e1ec4e21297a357fdf6fc080bb48b496f9a86db36758
|
7
|
+
data.tar.gz: 608d72719242789c965ae36b3f875806ddfc7d719fc54f4060c6a9b0d9a77ba424ddae1d4713731aafa88bf1dc0da8b1a491274c2834f63f2e41bc0c826fc3ee
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,8 +4,7 @@ https://github.com/lazing/wechat-api
|
|
4
4
|
|
5
5
|
用于微信 api 调用(非服务端推送信息)的处理。
|
6
6
|
|
7
|
-
[](http://badge.fury.io/rb/ucpaas)
|
7
|
+
[](http://badge.fury.io/rb/wechat-api)
|
9
8
|
|
10
9
|
常见的应用场景如:
|
11
10
|
* 获取关注用户
|
@@ -21,6 +20,12 @@ https://github.com/lazing/wechat-api
|
|
21
20
|
* 不够简单,特别是用于多账号管理的时候
|
22
21
|
* 微信 api 更新频繁,需要易于使用新功能
|
23
22
|
|
23
|
+
## 主要功能清单
|
24
|
+
* 支持微信服务号和订阅号API
|
25
|
+
* 支持微信js_ticket获取
|
26
|
+
* 支持微信红包API
|
27
|
+
* 支持微信企业号主动调用API
|
28
|
+
|
24
29
|
## 使用方式
|
25
30
|
|
26
31
|
````ruby
|
@@ -30,15 +35,25 @@ gem 'wechat-api'
|
|
30
35
|
````ruby
|
31
36
|
require 'wechat-api'
|
32
37
|
|
33
|
-
|
38
|
+
api = Wechat::Api::Client.new 'appid', 'appsecret'
|
34
39
|
|
35
|
-
|
40
|
+
api.get 'user/info', nextopenid: 'xxx'
|
36
41
|
# 当使用 get 方式时,hash 参数将做个 query params 附在请求后
|
37
42
|
|
38
|
-
|
43
|
+
api.post 'user/info/updateremark', openid;'xxxx', remark: '我是注释'
|
39
44
|
# 当使用 post 方法时,hash 参数将转换为 json,因此可以支持嵌套的结构
|
40
45
|
````
|
41
46
|
|
47
|
+
微信企业号主动调用API
|
48
|
+
|
49
|
+
````ruby
|
50
|
+
require 'wechat-api'
|
51
|
+
|
52
|
+
qy = Wechat::Qy::Client.new 'corpid', 'corpsecret'
|
53
|
+
qy.text_send 'agentid', 'message', touser: 'UserId1|UserId2' #提供的预定义方法
|
54
|
+
qy.post 'api/uri', { key: :value} #未提供预定义方法时调用
|
55
|
+
````
|
56
|
+
|
42
57
|
## 一些预定义方法
|
43
58
|
|
44
59
|
预定义接口方法可以方便使用。
|
@@ -47,13 +62,13 @@ client.post 'user/info/updateremark', openid;'xxxx', remark: '我是注释'
|
|
47
62
|
|
48
63
|
````ruby
|
49
64
|
# 创建固定二维码
|
50
|
-
|
65
|
+
api.create_qrcode(scene_str)
|
51
66
|
|
52
67
|
# 创建临时二维码
|
53
|
-
|
68
|
+
api.create_qrcode_temp(scene_id)
|
54
69
|
|
55
70
|
# 发送模板消息
|
56
|
-
|
71
|
+
api.send_template(template_id, openid, url, data = {})
|
57
72
|
````
|
58
73
|
|
59
74
|
以上接口返回微信文档定义的 json 数据转换后的ruby的 hash 对象
|
data/lib/wechat-api.rb
CHANGED
data/lib/wechat/api.rb
CHANGED
@@ -4,5 +4,18 @@ require 'wechat/api/client'
|
|
4
4
|
module Wechat
|
5
5
|
#
|
6
6
|
module Api
|
7
|
+
class Error < StandardError; end
|
8
|
+
|
9
|
+
def self.client(appid = 'origin_id')
|
10
|
+
var = "@_client_#{appid}"
|
11
|
+
if instance_variable_defined?(var)
|
12
|
+
instance_variable_get(var)
|
13
|
+
elsif block_given?
|
14
|
+
c = yield(Client)
|
15
|
+
instance_variable_set var, c
|
16
|
+
else
|
17
|
+
raise Error, :not_initialized
|
18
|
+
end
|
19
|
+
end
|
7
20
|
end
|
8
21
|
end
|
data/lib/wechat/api/client.rb
CHANGED
@@ -2,6 +2,7 @@ require 'multi_json'
|
|
2
2
|
require 'wechat/api/message'
|
3
3
|
require 'wechat/api/user'
|
4
4
|
require 'wechat/api/util'
|
5
|
+
require 'wechat/api/js_ticket'
|
5
6
|
require 'faraday'
|
6
7
|
require 'logger'
|
7
8
|
|
@@ -18,12 +19,13 @@ module Wechat
|
|
18
19
|
|
19
20
|
API_BASE = 'https://api.weixin.qq.com/cgi-bin/'
|
20
21
|
|
21
|
-
attr_reader :app_id, :secret
|
22
|
-
attr_accessor :logger
|
22
|
+
attr_reader :app_id, :secret, :ticket
|
23
|
+
attr_accessor :logger, :site
|
23
24
|
|
24
25
|
def initialize(app_id, secret)
|
25
26
|
@app_id, @secret = app_id, secret
|
26
27
|
@logger = Logger.new(STDOUT)
|
28
|
+
@ticket = JsTicket.new self
|
27
29
|
@token_file = File.join('/tmp', "wechat-api-#{app_id}")
|
28
30
|
end
|
29
31
|
|
@@ -37,12 +39,13 @@ module Wechat
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def refresh
|
40
|
-
url = format('%stoken',
|
42
|
+
url = format('%stoken', base_url)
|
41
43
|
resp = connection.get(url, token_params)
|
42
44
|
response = MultiJson.load(resp.body)
|
43
45
|
return handle_error(response) if response['errcode']
|
46
|
+
|
44
47
|
@access_token = response['access_token']
|
45
|
-
File.open(@token_file, 'w') { |f| f.write(resp.body) } if
|
48
|
+
File.open(@token_file, 'w') { |f| f.write(resp.body) } if @access_token
|
46
49
|
@access_token
|
47
50
|
end
|
48
51
|
|
@@ -72,9 +75,11 @@ module Wechat
|
|
72
75
|
end
|
73
76
|
|
74
77
|
def with_access_token(uri, params, tried = 2)
|
75
|
-
url = format('%s%s',
|
78
|
+
url = format('%s%s', base_url, uri)
|
76
79
|
begin
|
77
80
|
resp = yield(url, params.merge(access_token: access_token))
|
81
|
+
raise ResponseError, resp unless resp.success?
|
82
|
+
|
78
83
|
response = MultiJson.load(resp.body)
|
79
84
|
handle_error(response)
|
80
85
|
rescue AccessTokenExpiredError => e
|
@@ -86,6 +91,10 @@ module Wechat
|
|
86
91
|
|
87
92
|
private
|
88
93
|
|
94
|
+
def base_url
|
95
|
+
site || API_BASE
|
96
|
+
end
|
97
|
+
|
89
98
|
def debug_request
|
90
99
|
response = yield
|
91
100
|
logger.debug { response }
|
@@ -97,9 +106,9 @@ module Wechat
|
|
97
106
|
when 0, nil
|
98
107
|
response
|
99
108
|
when 40_001, 42_001, 40_014
|
100
|
-
|
109
|
+
raise AccessTokenExpiredError, response
|
101
110
|
else
|
102
|
-
|
111
|
+
raise ResponseError, response
|
103
112
|
end
|
104
113
|
end
|
105
114
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Wechat
|
2
|
+
module Api
|
3
|
+
|
4
|
+
class JsTicket
|
5
|
+
attr_reader :client, :ticket, :expires_at
|
6
|
+
def initialize(client)
|
7
|
+
@client = client
|
8
|
+
end
|
9
|
+
|
10
|
+
def refresh
|
11
|
+
js = client.js_ticket
|
12
|
+
@ticket = js[:ticket]
|
13
|
+
@expires_at = DateTime.now + Rational(js[:expires_in].to_i, 3600*24)
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def expired?
|
18
|
+
expires_at.nil? || DateTime.now > expires_at
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/wechat/api/util.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'digest/sha1'
|
3
|
+
|
1
4
|
module Wechat
|
2
5
|
module Api
|
3
6
|
#
|
@@ -27,6 +30,28 @@ module Wechat
|
|
27
30
|
|
28
31
|
post 'qrcode/create', params
|
29
32
|
end
|
33
|
+
|
34
|
+
def js_ticket
|
35
|
+
res = get 'ticket/getticket', type: :jsapi
|
36
|
+
res['ticket']
|
37
|
+
end
|
38
|
+
|
39
|
+
def sign(params)
|
40
|
+
str = params.to_a.sort.map { |p| p.join('=') }.join('&')
|
41
|
+
logger.debug { "to_sign: #{str}" }
|
42
|
+
Digest::SHA1.hexdigest str
|
43
|
+
end
|
44
|
+
|
45
|
+
def js_config(url: nil)
|
46
|
+
r = ticket.tap { |j| j.refresh if j.expired? }.ticket
|
47
|
+
nonce = SecureRandom.hex
|
48
|
+
timestamp = Time.now.to_i
|
49
|
+
signature = sign(noncestr: nonce, timestamp: timestamp, jsapi_ticket: r, url: url)
|
50
|
+
{
|
51
|
+
appId: app_id, timestamp: timestamp, nonceStr: nonce,
|
52
|
+
signature: signature
|
53
|
+
}.tap { |hash| logger.debug { "js_config: #{hash}, url: #{url}" } }
|
54
|
+
end
|
30
55
|
end
|
31
56
|
end
|
32
57
|
end
|
data/lib/wechat/api/version.rb
CHANGED
data/lib/wechat/qy.rb
ADDED
@@ -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
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
RSpec.describe Wechat::Api::JsTicket do
|
4
|
+
|
5
|
+
let(:client) { double(:client) }
|
6
|
+
subject do
|
7
|
+
Wechat::Api::JsTicket.new client
|
8
|
+
end
|
9
|
+
|
10
|
+
it :refresh do
|
11
|
+
allow(client).to receive(:js_ticket).and_return(expires_in: 7200, ticket: 'bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA')
|
12
|
+
subject.refresh
|
13
|
+
expect(subject.ticket).not_to be_nil
|
14
|
+
should_not be_expired
|
15
|
+
expect(subject.expires_at).to be_a(Date)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
RSpec.describe Wechat::Api::Util do
|
4
|
+
subject { Wechat::Api::Client.new('APPID', 'APPSECRET') }
|
5
|
+
|
6
|
+
before do
|
7
|
+
subject.logger.level = Logger::DEBUG
|
8
|
+
end
|
9
|
+
|
10
|
+
it :js_config do
|
11
|
+
allow(SecureRandom).to receive(:hex).and_return('Wm3WZYTPz0wzccnW')
|
12
|
+
allow_any_instance_of(Time).to receive(:to_i).and_return(1414587457)
|
13
|
+
allow(subject).to receive(:js_ticket).and_return(expires_in: 7200, ticket: 'sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg')
|
14
|
+
js = subject.js_config(url: 'http://mp.weixin.qq.com?params=value')
|
15
|
+
expect(js).not_to be_nil
|
16
|
+
expect(js).to include(signature: '0f9de62fce790f9a083d5c99e95740ceb90c27ed')
|
17
|
+
expect(js).to have_key :appId
|
18
|
+
end
|
19
|
+
end
|
data/wechat-api.gemspec
CHANGED
@@ -13,15 +13,18 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
15
15
|
spec.files = `git ls-files -z`.split("\x0")
|
16
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
16
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
17
|
spec.require_paths = ["lib"]
|
19
18
|
|
20
|
-
spec.add_runtime_dependency
|
21
|
-
spec.add_runtime_dependency
|
22
|
-
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
19
|
+
spec.add_runtime_dependency 'faraday', '~> 1.0'
|
20
|
+
spec.add_runtime_dependency 'multi_json', '~> 1.0'
|
21
|
+
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.0'
|
23
|
+
spec.add_development_dependency 'guard', '~> 2.0'
|
24
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.0'
|
25
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'rspec-its', '~> 1.0'
|
28
|
+
spec.add_development_dependency 'webmock', '~> 3.0'
|
29
|
+
|
27
30
|
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.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Wong
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -16,70 +16,84 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0
|
19
|
+
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0
|
26
|
+
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: multi_json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
47
|
+
version: '1.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '1.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-rspec
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - "
|
73
|
+
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
75
|
+
version: '4.0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - "
|
80
|
+
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
82
|
+
version: '4.0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
89
|
+
version: '13.0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
96
|
+
version: '13.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rspec
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,21 +108,35 @@ dependencies:
|
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '3.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec-its
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: webmock
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
100
128
|
requirements:
|
101
129
|
- - "~>"
|
102
130
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
131
|
+
version: '3.0'
|
104
132
|
type: :development
|
105
133
|
prerelease: false
|
106
134
|
version_requirements: !ruby/object:Gem::Requirement
|
107
135
|
requirements:
|
108
136
|
- - "~>"
|
109
137
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
111
|
-
description:
|
138
|
+
version: '3.0'
|
139
|
+
description:
|
112
140
|
email:
|
113
141
|
- lazing@gmail.com
|
114
142
|
executables: []
|
@@ -117,7 +145,6 @@ extra_rdoc_files: []
|
|
117
145
|
files:
|
118
146
|
- ".gitignore"
|
119
147
|
- ".rspec"
|
120
|
-
- ".travis.yml"
|
121
148
|
- Gemfile
|
122
149
|
- Guardfile
|
123
150
|
- README.md
|
@@ -125,18 +152,24 @@ files:
|
|
125
152
|
- lib/wechat-api.rb
|
126
153
|
- lib/wechat/api.rb
|
127
154
|
- lib/wechat/api/client.rb
|
155
|
+
- lib/wechat/api/js_ticket.rb
|
128
156
|
- lib/wechat/api/message.rb
|
129
157
|
- lib/wechat/api/user.rb
|
130
158
|
- lib/wechat/api/util.rb
|
131
159
|
- lib/wechat/api/version.rb
|
160
|
+
- lib/wechat/qy.rb
|
161
|
+
- lib/wechat/qy/client.rb
|
162
|
+
- lib/wechat/qy/message.rb
|
132
163
|
- spec/spec_helper.rb
|
133
164
|
- spec/wechat/api/client_spec.rb
|
165
|
+
- spec/wechat/api/js_ticket_spec.rb
|
166
|
+
- spec/wechat/api/util_spec.rb
|
134
167
|
- wechat-api.gemspec
|
135
168
|
homepage: https://github.com/lazing/wechat-api
|
136
169
|
licenses:
|
137
170
|
- MIT
|
138
171
|
metadata: {}
|
139
|
-
post_install_message:
|
172
|
+
post_install_message:
|
140
173
|
rdoc_options: []
|
141
174
|
require_paths:
|
142
175
|
- lib
|
@@ -151,12 +184,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
184
|
- !ruby/object:Gem::Version
|
152
185
|
version: '0'
|
153
186
|
requirements: []
|
154
|
-
|
155
|
-
|
156
|
-
signing_key:
|
187
|
+
rubygems_version: 3.0.6
|
188
|
+
signing_key:
|
157
189
|
specification_version: 4
|
158
190
|
summary: Wechat API wrapper
|
159
191
|
test_files:
|
160
192
|
- spec/spec_helper.rb
|
161
193
|
- spec/wechat/api/client_spec.rb
|
162
|
-
|
194
|
+
- spec/wechat/api/js_ticket_spec.rb
|
195
|
+
- spec/wechat/api/util_spec.rb
|