mini_program 1.1.3 → 1.3.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
  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