mini_program 1.1.3 → 1.3.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
  SHA256:
3
- metadata.gz: 296c4dddb41810576f1dd0cedbc9aae7f730b1cf50f52b99fea2bdcdac7b8ba1
4
- data.tar.gz: 89873bf39d9be8ebdc9e33602b6a00773266ba0c15751ae113755e1275719a76
3
+ metadata.gz: 299067c25a9cc3d5d9070719da62f4239dafa89990540db1c81d5686475d9dbe
4
+ data.tar.gz: 857dfd0f801159319c7663d12d2d4472149c7f3e34f0a32002dcc6b88cdd0fad
5
5
  SHA512:
6
- metadata.gz: 475db5f1df160f23df1e8b5adbfbe34b84033f86dc55eb44107c99d0167ef0e036d5a994b67bd47e981de8167deb7c0ecc1e82cb6446d01101ce2144e17d7496
7
- data.tar.gz: faa337e8129bbce833f0f4ffd5dea933f30d402618892579de31481c100df7f53ecc2c3d5671b69bdf386c075e948bfd5e8ad3b705304c58d327825b6812d272
6
+ metadata.gz: 4ff9c4555528100bee8afdcb11c0c8de0b8c1df110ee1f2cbf149ff78caba1cc035189b0f21a4a0dc18f1b395820bde5e2f63c4d68a1a4fdc3bb5ba8e865f79c
7
+ data.tar.gz: 6cd0e717e952fd257dd873d0511501c8098f8741a935254ed0b9c190370f0b46d7d6d676a82c56d9a785cf89e2be18b667c56f4bcae2db0bdb3e987b22461e61
data/README.md CHANGED
@@ -48,7 +48,7 @@ code = "041PuvGa1rysrB0noDJa1n7RBv2PuvGe"
48
48
  encrypted_data = "3G/+Fh6kCBaQszXFTxz3h3HFSbu0UuVW/4aLbz8WGzrKfmbGpvnxYHAa4QrKXJvHpB++3ogOYoU6iiG+1HW18Lkt9qEJE9GyRw5OnuXSjTnUIPSRROT3sxeAYnT1kf4ngTAfrD3f4TFtLXkRIrrc1MzSqx/LV8iXA8Lu5Y+7kZx26eulz3yVrlXDH3BOIX6zcGOeprsK5XzDx2ltmf3j5w=="
49
49
  iv = "5tiyfVEHNVgHN4n8lzDrUA=="
50
50
 
51
- result = mp.get_phone_num(code: code, encrypted_data: encrypted_data, iv: iv)
51
+ result = mp.decrypt_phone_num(code: code, encrypted_data: encrypted_data, iv: iv)
52
52
 
53
53
  if result.success?
54
54
  phone_num = result.data[:phone]
@@ -15,23 +15,26 @@ module MiniProgram
15
15
 
16
16
  after_mp_login if respond_to? :after_mp_login
17
17
 
18
- render json: current_mp_user
18
+ render json: ServiceResult.new(success: true,
19
+ data: { current_user: current_mp_user },
20
+ message: "登录成功",
21
+ message_kind: :login_success)
19
22
  else
20
- render json: { error: result.error }
23
+ render json: result, status: 500
21
24
  end
22
25
  end
23
26
 
24
27
  # POST /wechat/phone_num
25
28
  def phone_num
26
29
  client = MiniProgram::Client.new
27
- result = client.get_phone_num(code: params[:code], encrypted_data: params[:encrypted_data], iv: params[:iv])
30
+ result = client.decrypt_phone_num(code: params[:code], encrypted_data: params[:encrypted_data], iv: params[:iv])
28
31
 
29
32
  if result.success?
30
33
  cookies.signed[:phone_num] = result.data[:phone_num]
31
34
 
32
- render json: result.data
35
+ render json: result
33
36
  else
34
- render json: { error: result.error }
37
+ render json: result, status: 500
35
38
  end
36
39
  end
37
40
  end
@@ -0,0 +1,2 @@
1
+
2
+ class InitializeDenied < StandardError; end
@@ -0,0 +1,2 @@
1
+
2
+ class UnsupportedParamType < StandardError; end
@@ -23,17 +23,22 @@ module MiniProgram
23
23
  access_token = Rails.cache.read(access_token_store_key)
24
24
 
25
25
  if access_token.present? && !fresh
26
- return MiniProgram::ServiceResult.new(success: true, data: {access_token: access_token})
26
+ return MiniProgram::ServiceResult.new(success: true,
27
+ data: { access_token: access_token },
28
+ message: "获取 access token 成功",
29
+ message_kind: :get_access_token_success)
27
30
  end
28
31
 
29
32
  result = request_access_token
30
33
 
31
34
  if result.success?
32
- # redis.setex access_token_store_key, 1.5.hours.to_i, result.data["access_token"]
33
35
  Rails.cache.write(access_token_store_key,
34
36
  result.data["access_token"],
35
37
  expires_in: 1.5.hours.to_i,
36
38
  race_condition_ttl: 10)
39
+
40
+ result.message = "获取 access token 成功"
41
+ result.message_kind = :get_access_token_success
37
42
  end
38
43
 
39
44
  yield result if block_given?
@@ -57,15 +62,24 @@ module MiniProgram
57
62
  result = JSON.parse(response)
58
63
 
59
64
  if result["errcode"] && result["errcode"].to_s != "0"
60
- logger.error <<~ERROR
61
- Get access token failed.
62
- api: #{api}
63
- error: #{result}
64
- ERROR
65
- return MiniProgram::ServiceResult.new(success: false, error: result, message: result["errmsg"])
65
+ logger.tagged "request access token" do
66
+ logger.error <<~ERROR
67
+ Get access token failed.
68
+ api: #{api}
69
+ error: #{result}
70
+ ERROR
71
+ end
72
+
73
+ MiniProgram::ServiceResult.new(success: false,
74
+ error: result,
75
+ message: result["errmsg"],
76
+ message_kind: :request_access_token_failed)
77
+ else
78
+ MiniProgram::ServiceResult.new(success: true,
79
+ data: { access_token: result["access_token"] },
80
+ message: "请求 access token 成功",
81
+ message_kind: :request_access_token_success)
66
82
  end
67
-
68
- MiniProgram::ServiceResult.new(success: true, data: result)
69
83
  end
70
84
 
71
85
  # 调用微信授权登录 api
@@ -85,21 +99,31 @@ module MiniProgram
85
99
  result = JSON.parse(response)
86
100
 
87
101
  if result["errcode"] && result["errcode"].to_s != "0"
102
+ logger.tagged "login mini program"
88
103
  logger.error <<~ERROR
89
- Get session key failed.
90
- api: #{api}
91
- result: #{result}
104
+ Get session key failed.
105
+ api: #{api}
106
+ result: #{result}
92
107
  ERROR
93
- return MiniProgram::ServiceResult.new(error: result, message: result["errmsg"])
108
+
109
+ MiniProgram::ServiceResult.new(success: false,
110
+ error: result,
111
+ message: result["errmsg"],
112
+ message_kind: :login_failed)
113
+
114
+ else
115
+ MiniProgram::ServiceResult.new(success: true,
116
+ data: result,
117
+ message: "小程序登录成功",
118
+ message_kind: :login_success)
94
119
  end
95
120
 
96
- MiniProgram::ServiceResult.new(success: true, data: result)
97
121
  end
98
122
 
99
123
  # 发送订阅消息
100
124
  # @param [MiniProgram::Msg] msg
101
125
  # @param [String] to 用户的openid
102
- def send_msg(msg, to: )
126
+ def send_msg(msg, to:)
103
127
  openid = to.try(:openid) || to
104
128
 
105
129
  payload = msg.as_json.merge!(touser: openid)
@@ -114,19 +138,34 @@ module MiniProgram
114
138
  result = post(api, payload)
115
139
 
116
140
  if result["errcode"].to_s != "0"
117
- msg_logger.error {"{params: #{payload}, response: #{result}}"}
118
- return MiniProgram::ServiceResult.new(success: false, error: result)
141
+ logger.tagged "Subscribe Message" do
142
+ logger.error { "{params: #{payload}, response: #{result}}" }
143
+ end
144
+
145
+ MiniProgram::ServiceResult.new(success: false,
146
+ error: result,
147
+ message: "发送订阅消息失败",
148
+ message_kind: :send_subscribed_message_failed)
149
+ else
150
+ logger.tagged "Subscribe Message" do
151
+ logger.info { "{params: #{payload}, response: #{result}}" }
152
+ end
153
+
154
+ MiniProgram::ServiceResult.new(success: true,
155
+ data: {
156
+ msgid: result.data["msgid"]
157
+ },
158
+ message: "发送订阅消息成功",
159
+ message_kind: :send_subscribed_message_success)
119
160
  end
120
161
 
121
- msg_logger.info {"{params: #{payload}, response: #{result}}"}
122
- MiniProgram::ServiceResult.new(success: true, data: result)
123
162
  end
124
163
 
125
164
  # 「发送统一服务消息」
126
165
  # 统一服务消息原本是可以从调用小程序的 api ,通过用户小程序的 openid 发送模板消息到小程序和公众号那里去,
127
166
  # 现在小程序的模板消息功能关闭了,就只剩下发送模板消息到公众号这个功能了
128
167
  #
129
- def send_uniform_msg(msg, to: )
168
+ def send_uniform_msg(msg, to:)
130
169
  openid = to.try(:openid) || to
131
170
 
132
171
  payload = msg.as_json
@@ -143,16 +182,26 @@ module MiniProgram
143
182
  })
144
183
 
145
184
  if result["errcode"].to_s != "0"
146
- msg_logger.error {"{params: #{payload}, response: #{result}}"}
147
- return MiniProgram::ServiceResult.new(success: false, error: result["errmsg"])
185
+ logger.tagged "uniform message" do
186
+ logger.error { "{params: #{payload}, response: #{result}}" }
187
+ end
188
+
189
+ MiniProgram::ServiceResult.new(success: false,
190
+ error: result["errmsg"],
191
+ message: "发送统一服务消息失败",
192
+ message_kind: :send_uniform_message_failed)
193
+ else
194
+ msg_logger.info { "{params: #{payload}, response: #{result}}" }
195
+ MiniProgram::ServiceResult.new(success: true,
196
+ data: result,
197
+ message: "发送统一服务消息成功",
198
+ message_kind: :send_uniform_message_success)
148
199
  end
149
200
 
150
- msg_logger.info { "{params: #{payload}, response: #{result}}"}
151
- MiniProgram::ServiceResult.new(success: true, data: result)
152
201
  end
153
202
 
154
203
  # 获取用户手机号
155
- def get_phone_num(code:, encrypted_data:, iv:)
204
+ def decrypt_phone_num(code:, encrypted_data:, iv:)
156
205
  login_result = login(code)
157
206
  return login_result if login_result.failure?
158
207
 
@@ -165,17 +214,26 @@ module MiniProgram
165
214
 
166
215
  MiniProgram::ServiceResult.new(
167
216
  success: true,
217
+ message: "解密手机号成功",
218
+ message_kind: :decrypt_phone_number_success,
168
219
  data: {
169
220
  openid: openid,
170
221
  phone_num: phone_num
171
- })
222
+ })
223
+ rescue OpenSSL::Cipher::CipherError => e
224
+ MiniProgram::ServiceResult.new(
225
+ success: false,
226
+ message: "解密手机号失败",
227
+ message_kind: :decrypt_phone_data_failed,
228
+ error: e
229
+ )
172
230
  end
173
231
 
174
232
  def config
175
233
  appid, app_secret = if MiniProgram.appid && MiniProgram.app_secret
176
234
  [MiniProgram.appid, MiniProgram.app_secret]
177
235
 
178
- # 如果有挂载 WechatPayment 的 engine 时,使用里边的小程序配置
236
+ # 如果有挂载 WechatPayment 的 engine 时,使用里边的小程序配置
179
237
  elsif Object.const_defined? "WechatPayment"
180
238
  [WechatPayment.sub_appid || WechatPayment.appid, WechatPayment.sub_app_secret || WechatPayment.app_secret]
181
239
  else
@@ -186,32 +244,32 @@ module MiniProgram
186
244
  end
187
245
 
188
246
  #获取小程序二维码
189
- def qrcode_unlimited(scene:, page:, width: 280, check_path: true, env_version: "release")
190
- get_token_result = get_access_token
191
- if get_access_token.failure?
192
- return get_token_result
247
+ def qrcode_unlimited(scene:, page:, width: 280, check_path: true, env_version: "release")
248
+ get_token_result = get_access_token.on_failure do |result|
249
+ return result
193
250
  end
194
-
251
+
195
252
  api = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=#{get_token_result["access_token"]}"
196
-
197
- params = {
198
- scene:,
199
- page:,
200
- width:,
201
- check_path:,
202
- env_version:
203
- }
204
-
205
- result = post(api, params)
206
253
 
207
- if result["errcode"]
208
- msg_logger.error {"{params: #{params}, response: #{result}}"}
209
- return MiniProgram::ServiceResult.new(success: false, error: result)
254
+ params = { scene:, page:, width:, check_path:, env_version: }
255
+
256
+ result = post(api, params)
257
+
258
+ if result["errcode"]
259
+ logger.error { "{ action: 'generate qrcode', params: #{params}, response: #{result}}" }
260
+ MiniProgram::ServiceResult.new(success: false,
261
+ error: result,
262
+ message: "获取二维码失败",
263
+ message_kind: :get_unlimited_qrcode_failed)
264
+ else
265
+ logger.info { "{ action: 'generate qrcode', params: #{params}, response: #{result} }" }
266
+ MiniProgram::ServiceResult.new(success: true,
267
+ data: { image: result },
268
+ message: "获取二维码成功",
269
+ message_kind: :get_unlimited_qrcode_success)
210
270
  end
211
-
212
- MiniProgram::ServiceResult.new(success: true, data: { image: result })
213
271
  end
214
-
272
+
215
273
  private
216
274
 
217
275
  def get(api, payload = {})
@@ -222,7 +280,7 @@ module MiniProgram
222
280
  end
223
281
 
224
282
  Net::HTTP.get(uri)
225
- end
283
+ end
226
284
 
227
285
  def post(api, payload = {}, options = {})
228
286
  uri = URI(api)
@@ -232,14 +290,16 @@ module MiniProgram
232
290
  options = {
233
291
  use_ssl: true
234
292
  }.merge(options)
235
-
293
+
236
294
  res = Net::HTTP.start(uri.host, uri.port, **options) do |http|
237
295
  http.request(req, payload.to_json)
238
- end
239
-
240
- return res.body if res["Content-Type"] == "image/jpeg"
241
-
242
- JSON.parse(res.body)
296
+ end
297
+
298
+ image_content_types = ["image/jpeg", "image/jpg", "image/gif", "image/png"]
299
+
300
+ return res.body if res["Content-Type"].in? image_content_types
301
+
302
+ JSON.parse(res.body)
243
303
  end
244
304
 
245
305
  def decrypt_phone_data(encrypted_data, iv, session_key)
@@ -0,0 +1,34 @@
1
+ module MiniProgram
2
+ class RLogger
3
+ def initialize
4
+ raise Exceptions::InitializeDenied.new("please use 'RLogger.make' instead of 'RLogger.new'")
5
+ end
6
+
7
+ class << self
8
+ def make(given_filename)
9
+ filename = log_filename(given_filename)
10
+
11
+ # 如果已经存在日志对象,则返回已有的日志对象
12
+ logger = Logger.new(filename)
13
+ ActiveSupport::TaggedLogging.new(logger)
14
+ end
15
+
16
+ def log_filename(given_filename)
17
+ return STDOUT if ENV["RAILS_LOG_TO_STDOUT"].present?
18
+
19
+ if given_filename.class.in? [String, Symbol]
20
+ unless given_filename.end_with? ".log"
21
+ given_filename = "#{given_filename}.log"
22
+ end
23
+
24
+ Rails.root.join("log/#{given_filename}")
25
+ elsif given_filename.respond_to? :to_path
26
+ given_filename.to_path
27
+ else
28
+ raise Exception::UnsupportedParamType.new("\"log filename parameter must be a String type or a Symbol\"")
29
+ end
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,4 @@
1
+
2
+ class MiniProgram::RequestResult
3
+
4
+ end
@@ -2,9 +2,9 @@ module MiniProgram
2
2
  class ServiceResult
3
3
  attr_accessor :success,
4
4
  :error,
5
- :error_type,
6
5
  :data,
7
6
  :message,
7
+ :message_kind,
8
8
  :message_type
9
9
 
10
10
  delegate :[], :[]=, to: :data
@@ -13,12 +13,15 @@ module MiniProgram
13
13
  error: nil,
14
14
  message: nil,
15
15
  message_type: nil,
16
+ message_kind: nil,
16
17
  data: {})
18
+
17
19
  self.success = success
18
20
  self.data = (data.presence || {}).with_indifferent_access
19
21
  self.error = error
20
22
  self.message = message
21
23
  self.message_type = message_type
24
+ self.message_kind = message_kind
22
25
  end
23
26
 
24
27
  alias success? :success
@@ -49,12 +52,12 @@ module MiniProgram
49
52
 
50
53
  def as_json(options = nil)
51
54
  {
52
- success: success,
53
- data: data,
54
- message: message,
55
+ success:,
56
+ data:,
57
+ message:,
55
58
  message_type: get_message_type,
56
- error: error,
57
- error_type: error_type
59
+ message_kind:,
60
+ error:,
58
61
  }
59
62
  end
60
63
  end
@@ -1,3 +1,3 @@
1
1
  module MiniProgram
2
- VERSION = '1.1.3'
2
+ VERSION = '1.3.0'
3
3
  end
data/lib/mini_program.rb CHANGED
@@ -4,8 +4,9 @@ require "mini_program/client"
4
4
  require "mini_program/msg"
5
5
  require "mini_program/user"
6
6
  require "application_controller_ext"
7
- require "r_logger"
8
- require "service_result"
7
+ require "mini_program/r_logger"
8
+ require "mini_program/log_formatter"
9
+ require "mini_program/service_result"
9
10
  require "mocha"
10
11
 
11
12
  module MiniProgram
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_program
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-10 00:00:00.000000000 Z
11
+ date: 2022-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -63,6 +63,8 @@ files:
63
63
  - app/views/mini_program/wechat/login.html.erb
64
64
  - config/routes.rb
65
65
  - lib/application_controller_ext.rb
66
+ - lib/exceptions/initialize_denied.rb
67
+ - lib/exceptions/unsupported_param_type.rb
66
68
  - lib/generators/mini_program/install/USAGE
67
69
  - lib/generators/mini_program/install/install_generator.rb
68
70
  - lib/generators/mini_program/install/templates/initializer.rb
@@ -73,10 +75,11 @@ files:
73
75
  - lib/mini_program/client.rb
74
76
  - lib/mini_program/engine.rb
75
77
  - lib/mini_program/msg.rb
78
+ - lib/mini_program/r_logger.rb
79
+ - lib/mini_program/request_result.rb
80
+ - lib/mini_program/service_result.rb
76
81
  - lib/mini_program/user.rb
77
82
  - lib/mini_program/version.rb
78
- - lib/r_logger.rb
79
- - lib/service_result.rb
80
83
  - lib/tasks/mini_program_tasks.rake
81
84
  homepage: https://github.com/bkyz/mini_program
82
85
  licenses:
data/lib/r_logger.rb DELETED
@@ -1,36 +0,0 @@
1
- module MiniProgram
2
- class RLogger
3
- def initialize
4
- raise Exceptions::InitializeDenied.new("please use 'ILogger.make' instead of 'ILogger.new'")
5
- end
6
-
7
- class << self
8
- def make(log_file)
9
- @logger ||= {}
10
-
11
- log_file_name = if log_file.class.in? [String, Symbol]
12
- log_file_name = log_file.to_sym
13
-
14
- unless log_file_name.to_s.end_with? ".log"
15
- log_file_name = "#{log_file_name}.log"
16
- end
17
-
18
- "#{root_path}/#{log_file_name}"
19
- elsif log_file.respond_to? :to_path
20
- log_file.to_path
21
- else
22
- raise Exceptions::UnsupportdParamType.new("log file parameter only support 'File' or 'String' Type.")
23
- end
24
-
25
- # 如果已经存在日志对象,则返回已有的日志对象
26
- @logger[log_file_name] ||= ::Logger.new(log_file_name)
27
- end
28
-
29
- def root_path
30
- @root ||= "#{Rails.root}/log"
31
- end
32
- end
33
-
34
-
35
- end
36
- end