wechat-api 0.1.1 → 0.4.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
- SHA1:
3
- metadata.gz: 719b629d7118b6d301d4aefe2f7672165dd911bf
4
- data.tar.gz: ef220a300a12fde99086b07d82146dec8778b28c
2
+ SHA256:
3
+ metadata.gz: 3af5535d32a85e57f6ed8f517cb17cbd0e8941e42610bc467a0cdb4a4936f411
4
+ data.tar.gz: 5de42166d01da0ea3047cc53f87864e85c4454a753b351f62d2c5d4ee64d0871
5
5
  SHA512:
6
- metadata.gz: 1cfb62e73ee7d3b47ae830f98a3cfbe28ce65883b8cc33e2ebc49a13d363bdb0f25459d498508c1a307836871bfd890f8cd5096be42045ed7f16c3e335d7f44a
7
- data.tar.gz: 95e2407f7f8e3d0273424754ef9d7a2f1008ce1ea5055397878bcdf39b8ff78e82b5f2e57113a6bee31051c7e751a22d8ab32a638d944df488bc21b73cf310cb
6
+ metadata.gz: d77173f5c03d1bf1bf345a947238b5fa6966de3f67a8ff596670c904b1c9e726856d160be9c30a6c14f8e1ec4e21297a357fdf6fc080bb48b496f9a86db36758
7
+ data.tar.gz: 608d72719242789c965ae36b3f875806ddfc7d719fc54f4060c6a9b0d9a77ba424ddae1d4713731aafa88bf1dc0da8b1a491274c2834f63f2e41bc0c826fc3ee
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  Gemfile.lock
2
2
  pkg
3
+ .DS_Store
data/Gemfile CHANGED
@@ -1,9 +1,3 @@
1
- source 'http://ruby.taobao.org'
1
+ source 'https://rubygems.org'
2
2
  # Specify your gem's dependencies in ucpaas.gemspec
3
3
  gemspec
4
-
5
- group :development do
6
- gem 'guard'
7
- gem 'guard-rspec'
8
- gem 'rspec-its'
9
- end
data/README.md CHANGED
@@ -4,8 +4,7 @@ https://github.com/lazing/wechat-api
4
4
 
5
5
  用于微信 api 调用(非服务端推送信息)的处理。
6
6
 
7
- [![Circle CI](https://circleci.com/gh/lazing/wechat-api.svg?style=svg)](https://circleci.com/gh/lazing/wechat-api)
8
- [![Gem Version](https://badge.fury.io/rb/wechat-api.svg)](http://badge.fury.io/rb/ucpaas)
7
+ [![Gem Version](https://badge.fury.io/rb/wechat-api.svg)](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
- client = Wechat::Api::Client.new 'appid', 'appsecret'
38
+ api = Wechat::Api::Client.new 'appid', 'appsecret'
34
39
 
35
- client.get 'user/info', nextopenid: 'xxx'
40
+ api.get 'user/info', nextopenid: 'xxx'
36
41
  # 当使用 get 方式时,hash 参数将做个 query params 附在请求后
37
42
 
38
- client.post 'user/info/updateremark', openid;'xxxx', remark: '我是注释'
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
- client.create_qrcode(scene_str)
65
+ api.create_qrcode(scene_str)
51
66
 
52
67
  # 创建临时二维码
53
- client.create_qrcode_temp(scene_id)
68
+ api.create_qrcode_temp(scene_id)
54
69
 
55
70
  # 发送模板消息
56
- client.send_template(template_id, openid, url, data = {})
71
+ api.send_template(template_id, openid, url, data = {})
57
72
  ````
58
73
 
59
74
  以上接口返回微信文档定义的 json 数据转换后的ruby的 hash 对象
@@ -1 +1,2 @@
1
1
  require 'wechat/api'
2
+ require 'wechat/qy'
@@ -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
@@ -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', API_BASE)
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 token
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', API_BASE, uri)
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
- fail AccessTokenExpiredError, response
109
+ raise AccessTokenExpiredError, response
101
110
  else
102
- fail ResponseError, response
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
@@ -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
@@ -2,6 +2,6 @@
2
2
  module Wechat
3
3
  #
4
4
  module Api
5
- VERSION = '0.1.1'
5
+ VERSION = '0.4.0'.freeze
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
@@ -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
@@ -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 "faraday", "~> 0.9"
21
- spec.add_runtime_dependency "multi_json", "~> 1.2"
22
- spec.add_development_dependency "bundler"
23
- spec.add_development_dependency "rake"
24
- spec.add_development_dependency "pry"
25
- spec.add_development_dependency "rspec", "~> 3.0"
26
- spec.add_development_dependency "webmock", "~> 1.18"
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.1.1
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: 2015-09-25 00:00:00.000000000 Z
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.9'
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.9'
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.2'
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.2'
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: rake
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: pry
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: '1.18'
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: '1.18'
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
- rubyforge_project:
155
- rubygems_version: 2.2.2
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
- has_rdoc:
194
+ - spec/wechat/api/js_ticket_spec.rb
195
+ - spec/wechat/api/util_spec.rb
@@ -1,5 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - ruby-head
4
- - 2.1.0
5
- - 1.9.3