wechat 0.16.2 → 0.17.1

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
  SHA256:
3
- metadata.gz: bc8214345aa67e306a93fb57034de6f8ecc898c630e5abb56f29424b8a360110
4
- data.tar.gz: 7152a97b68aada44c5be152e57dbe55233efabe58124c9d36c73b560b213c51e
3
+ metadata.gz: 0d792d78d777375dc558251f8977ee4897e0854cff6276e207e1337c8884d066
4
+ data.tar.gz: d92848e26cd42299997cfa0c700b9c961bf0e89ad6b9992cc088905e5968eabc
5
5
  SHA512:
6
- metadata.gz: aed67b12d96ee44e7ab75b8f3fe2bf5170379efd9b94e2d6fab8a92a4a5f99d477ea032a2d1826b3ddc73b195a42ca0f2f72d6a92d27632eb2de0be8c593d62d
7
- data.tar.gz: 7c00e2715896186abfee532190aae993a766fc0a583f41545c62856a4d70554a6a365312a4d0d6e5eeba3e7259f6d552203e0079a70df73ed21677c924a63aa7
6
+ metadata.gz: dccc900747140ca19c627856b39f7066bdf7ee9cbc34217780b942d703064b645c69a9ca855f0ea79d070a2886f940ba94f1c10230372732454ec3cc6b382ac1
7
+ data.tar.gz: 968546dfcea050c3154179358eb93b24a1afdcffe8a46d5aea9af6cef1497f4a981b9028df84108c7677a180f53fc1687f2b6616613abaf203223ae01932cd1e
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.17.1 (released at 2023-07-28)
4
+
5
+ * Add Record based token support. by @CoolDrinELiu #315
6
+ * Add api shortlink.generate support. by @wikimo #316
7
+ * Add new api & Compatible with WeCom. by @leepood #317
8
+
9
+ ## v0.17.0 yarked
10
+
3
11
  ## v0.16.2 (released at 2022-12-09)
4
12
 
5
13
  * Drop support ruby 2.6 and allow ruby 3.2 will released psych v5.0.0. by @iuhoay #314
data/README-CN.md CHANGED
@@ -89,6 +89,14 @@ rake db:migrate
89
89
 
90
90
  appid/corpid 以及 secret 的配置请阅读下一节
91
91
 
92
+ #### 数据配置模式
93
+ 需要保证传入的 `record` 属性中包含 `access_token`, `token_expires_in`, `got_token_at`。
94
+ ```ruby
95
+ def client
96
+ @client ||= Wechat::Api.new(app_id, app_secret, token_file, network_setting, jsapi_ticket_file, record)
97
+ end
98
+ ```
99
+
92
100
  #### 命令行程序的配置
93
101
 
94
102
  要使用命令行程序,需要在 home 目录中创建一个 `~/.wechat.yml`,包含以下内容。其中 `access_token` 是存放 access_token 的文件位置。
data/README.md CHANGED
@@ -97,6 +97,14 @@ URL address for wechat created by running `rails g wechat:install` is `http://yo
97
97
 
98
98
  How to setup appid/corpid and secret see below section.
99
99
 
100
+ #### Configure wechat by record-based mode
101
+ Make sure the `record` attributes include `access_token`, `token_expires_in`, `got_token_at`.
102
+ ```ruby
103
+ def client
104
+ @client ||= Wechat::Api.new(app_id, app_secret, token_file, network_setting, jsapi_ticket_file, record)
105
+ end
106
+ ```
107
+
100
108
  #### Configure for command line
101
109
 
102
110
  To use standalone `wechat` command, you need to create configuration file `~/.wechat.yml` and include content below for public account. The `access_token` will be written to file `/var/tmp/wechat_access_token`.
data/bin/wechat CHANGED
@@ -236,6 +236,12 @@ class App < Thor
236
236
  puts wechat_api.wxa_generate_urllink(body_hash)
237
237
  end
238
238
 
239
+ desc 'wxa_generate_shortlink [PATH]', '获取小程序 Short Link'
240
+ def wxa_generate_shortlink(url, title = '', is_permanent = false)
241
+ body_hash = { page_url: url, page_title: title, is_permanent: is_permanent}
242
+ puts wechat_api.wxa_generate_shortlink(body_hash)
243
+ end
244
+
239
245
  desc 'media_uploadnews [MPNEWS_YAML_PATH]', '上传图文消息素材'
240
246
  def media_uploadnews(mpnews_yaml_path)
241
247
  mpnew = Wechat::ApiLoader.load_yaml(File.read(mpnews_yaml_path))
data/lib/wechat/api.rb CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Wechat
4
4
  class Api < ApiBase
5
- def initialize(appid, secret, token_file, network_setting, jsapi_ticket_file)
5
+ def initialize(appid, secret, token_file, network_setting, jsapi_ticket_file, record = nil)
6
6
  super()
7
7
  @client = HttpClient.new(Wechat::Api::API_BASE, network_setting)
8
- @access_token = Token::PublicAccessToken.new(@client, appid, secret, token_file)
8
+ @access_token = Token::PublicAccessToken.new(@client, appid, secret, token_file, record)
9
9
  @jsapi_ticket = Ticket::PublicJsapiTicket.new(@client, @access_token, jsapi_ticket_file)
10
10
  @qcloud = nil
11
11
  end
@@ -88,6 +88,11 @@ module Wechat
88
88
  post 'message/mass/get', JSON.generate(msg_id: msg_id)
89
89
  end
90
90
 
91
+ def wxa_get_user_phone_number(code)
92
+ # https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html
93
+ post 'business/getuserphonenumber', JSON.generate(code: code), base: Wechat::Api::WXA_BASE
94
+ end
95
+
91
96
  def wxa_get_wxacode(path, width = 430)
92
97
  post 'getwxacode', JSON.generate(path: path, width: width), base: Wechat::Api::WXA_BASE
93
98
  end
@@ -109,6 +114,10 @@ module Wechat
109
114
  post 'generate_urllink', JSON.generate(body_hash), base: Wechat::Api::WXA_BASE
110
115
  end
111
116
 
117
+ def wxa_generate_shortlink(body_hash)
118
+ post 'genwxashortlink', JSON.generate(body_hash), base: Wechat::Api::WXA_BASE
119
+ end
120
+
112
121
  def menu
113
122
  get 'menu/get'
114
123
  end
@@ -13,6 +13,11 @@ module Wechat
13
13
  @qcloud = nil
14
14
  end
15
15
 
16
+ def get_externalcontact(external_userid, cursor = nil)
17
+ # https://developer.work.weixin.qq.com/document/path/92114
18
+ get 'externalcontact/get', params: { external_userid: external_userid, cursor: cursor }
19
+ end
20
+
16
21
  def agent_list
17
22
  get 'agent/list'
18
23
  end
@@ -27,9 +27,12 @@ module Wechat
27
27
  page_url = page_url.split('#').first
28
28
  js_hash = api.jsapi_ticket.signature(page_url)
29
29
 
30
+ # Field `beta` please check https://developer.work.weixin.qq.com/document/path/90514#%E6%AD%A5%E9%AA%A4%E4%BA%8C%EF%BC%9A%E9%80%9A%E8%BF%87config%E6%8E%A5%E5%8F%A3%E6%B3%A8%E5%85%A5%E6%9D%83%E9%99%90%E9%AA%8C%E8%AF%81%E9%85%8D%E7%BD%AE
31
+
30
32
  config_js = <<~WECHAT_CONFIG_JS
31
33
  wx.config({
32
- debug: #{config_options[:debug]},
34
+ beta: #{config_options[:beta] || false},
35
+ debug: #{config_options[:debug] || false},
33
36
  appId: "#{app_id}",
34
37
  timestamp: "#{js_hash[:timestamp]}",
35
38
  nonceStr: "#{js_hash[:noncestr]}",
@@ -3,13 +3,14 @@
3
3
  module Wechat
4
4
  module Token
5
5
  class AccessTokenBase
6
- attr_reader :client, :appid, :secret, :token_file, :access_token, :token_life_in_seconds, :got_token_at
6
+ attr_reader :client, :appid, :secret, :token_file, :access_token, :token_life_in_seconds, :got_token_at, :record
7
7
 
8
- def initialize(client, appid, secret, token_file)
8
+ def initialize(client, appid, secret, token_file, record = nil)
9
9
  @appid = appid
10
10
  @secret = secret
11
11
  @client = client
12
12
  @token_file = token_file
13
+ @record = record
13
14
  @random_generator = Random.new
14
15
  end
15
16
 
@@ -40,16 +41,57 @@ module Wechat
40
41
  end
41
42
 
42
43
  def read_token
43
- JSON.parse(File.read(token_file))
44
+ if record_based_token?
45
+ throw_error_if_missing_attributes!
46
+
47
+ {
48
+ 'access_token' => record.access_token,
49
+ 'got_token_at' => record.got_token_at,
50
+ 'token_expires_in' => record.token_expires_in
51
+ }
52
+ else
53
+ JSON.parse(File.read(token_file))
54
+ end
44
55
  end
45
56
 
46
57
  def write_token(token_hash)
47
- File.write(token_file, token_hash.to_json)
58
+ if record_based_token?
59
+ write_token_to_record(token_hash)
60
+ else
61
+ File.write(token_file, token_hash.to_json)
62
+ end
48
63
  end
49
64
 
50
65
  def remain_life_seconds
51
66
  token_life_in_seconds - (Time.now.to_i - got_token_at)
52
67
  end
68
+
69
+ private
70
+
71
+ def record_based_token?
72
+ record.present?
73
+ end
74
+
75
+ def write_token_to_record(token_hash)
76
+ throw_error_if_missing_attributes!
77
+
78
+ record.access_token = token_hash['access_token']
79
+ record.token_expires_in = token_hash['token_expires_in']
80
+ record.got_token_at = Time.now
81
+ record.save || record.save(validate: false)
82
+ end
83
+
84
+ def missing_necessary_attributes?
85
+ return true unless record.respond_to?(:access_token)
86
+ return true unless record.respond_to?(:token_expires_in)
87
+ return true unless record.respond_to?(:got_token_at)
88
+
89
+ false
90
+ end
91
+
92
+ def throw_error_if_missing_attributes!
93
+ raise "Missing attributes #access_token or #token_expires_in or #got_token_at in #{record.class.name}" if missing_necessary_attributes?
94
+ end
53
95
  end
54
96
  end
55
97
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wechat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.2
4
+ version: 0.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Skinnyworm
@@ -36,7 +36,7 @@ cert_chain:
36
36
  HjK18j09PoL9vWMUtyez2xpxlRDA+bEkF74AEVwMYozjP8VNM1ERTG+8kROuQjGV
37
37
  aWhGk3yVuHjmlBvfDpPqmux3ulWXnvHulcYiPxETh/m3PUfIKMTHydjAz88=
38
38
  -----END CERTIFICATE-----
39
- date: 2022-12-09 00:00:00.000000000 Z
39
+ date: 2023-07-28 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: activesupport
@@ -162,42 +162,42 @@ dependencies:
162
162
  requirements:
163
163
  - - "~>"
164
164
  - !ruby/object:Gem::Version
165
- version: '5.1'
165
+ version: '6.0'
166
166
  type: :development
167
167
  prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
- version: '5.1'
172
+ version: '6.0'
173
173
  - !ruby/object:Gem::Dependency
174
174
  name: rspec-mocks
175
175
  requirement: !ruby/object:Gem::Requirement
176
176
  requirements:
177
- - - '='
177
+ - - "~>"
178
178
  - !ruby/object:Gem::Version
179
- version: 3.10.2
179
+ version: '3.12'
180
180
  type: :development
181
181
  prerelease: false
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
- - - '='
184
+ - - "~>"
185
185
  - !ruby/object:Gem::Version
186
- version: 3.10.2
186
+ version: '3.12'
187
187
  - !ruby/object:Gem::Dependency
188
188
  name: sqlite3
189
189
  requirement: !ruby/object:Gem::Requirement
190
190
  requirements:
191
191
  - - "~>"
192
192
  - !ruby/object:Gem::Version
193
- version: '1.4'
193
+ version: '1.5'
194
194
  type: :development
195
195
  prerelease: false
196
196
  version_requirements: !ruby/object:Gem::Requirement
197
197
  requirements:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
- version: '1.4'
200
+ version: '1.5'
201
201
  description: API, command and message handling for WeChat in Rails
202
202
  email: eric.guocz@gmail.com
203
203
  executables:
@@ -257,8 +257,8 @@ licenses:
257
257
  metadata:
258
258
  bug_tracker_uri: https://github.com/Eric-Guo/wechat/issues
259
259
  changelog_uri: https://github.com/Eric-Guo/wechat/releases
260
- documentation_uri: https://github.com/Eric-Guo/wechat/tree/v0.16.2#readme
261
- source_code_uri: https://github.com/Eric-Guo/wechat/tree/v0.16.2
260
+ documentation_uri: https://github.com/Eric-Guo/wechat/tree/v0.17.1#readme
261
+ source_code_uri: https://github.com/Eric-Guo/wechat/tree/v0.17.1
262
262
  rubygems_mfa_required: 'true'
263
263
  post_install_message:
264
264
  rdoc_options: []
@@ -273,9 +273,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
273
273
  requirements:
274
274
  - - ">="
275
275
  - !ruby/object:Gem::Version
276
- version: 1.8.11
276
+ version: 3.1.6
277
277
  requirements: []
278
- rubygems_version: 3.3.26
278
+ rubygems_version: 3.4.17
279
279
  signing_key:
280
280
  specification_version: 4
281
281
  summary: DSL for wechat message handling and API
metadata.gz.sig CHANGED
Binary file