wechat_payment 2.0.12 → 2.1.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: 3d873ce178368297c4807c2931b92f2589d1bcf21f0ded448750e32c98bc523e
4
- data.tar.gz: 07cd0af3317c3454674a0a8951c5c826c5411ed242aa152d6a4a90850c52ce90
3
+ metadata.gz: c976e72ae7aec4d893bb8682f324f69759ee2c42a62efa19d7363931798c21bb
4
+ data.tar.gz: 1069c1c332dc0253a3e57b9c3301ff293e6accbdb279791892623d09db23d361
5
5
  SHA512:
6
- metadata.gz: bd673814ef12f40cfb7d77fae2b032c146896f9509615067a1f5d029a43c89c37302eb6f4e869e5d7138c96477001a577f357a9383f60e36e2b4f80d80acaa29
7
- data.tar.gz: 24d4427cdd1abcc358d04c771dbd9cf6875214b2a11887b6519e20371c8fdaecdda8987c7b82787be006feace175b6ed8114999d3ef63590de67c08ba4415e53
6
+ metadata.gz: '09eb12bc79a0dbd83e6dba6c3f2d67becd956b28665013e77ca30bfddd3ec51be79b6473b287096b7c1fe055014e532b8fb3133af146575c06190f56dbacfdcd'
7
+ data.tar.gz: 12228e2ea147aca00e1ee29e25c6d30956e4519fd98645cbec05f1de6e3057ae0d8a77ccac6eac6cae9ebb50f14bd88334f50a1e2ae43e2be6f4da3865d09612
@@ -1,5 +1,5 @@
1
1
 
2
- class PaymentOrdersController < ApplicationController
2
+ class WechatPayment::PaymentOrdersController < ApplicationController
3
3
  def index
4
4
  @payment_orders = WechatPayment::PaymentOrder.by_state(params[:state])
5
5
 
@@ -28,7 +28,7 @@ module WechatPayment
28
28
  # 生成交易编号
29
29
  def gen_out_trade_no
30
30
  loop do
31
- out_trade_no = "#{Time.current.to_i}#{SecureRandom.random_number(999_999_999)}"
31
+ out_trade_no = "#{WechatPayment.order_no_prefix}#{Time.current.to_i}#{SecureRandom.random_number(999_999_999)}"
32
32
  records_count = WechatPayment::PaymentOrder.where(out_trade_no: out_trade_no).count
33
33
  if records_count == 0
34
34
  self.out_trade_no = out_trade_no
@@ -0,0 +1,15 @@
1
+
2
+ "zh-CN":
3
+ wechat_payment_service_result:
4
+ message:
5
+ invoke_unifiedorder_success: 统一支付预支付成功
6
+ invoke_unifiedorder_failed: 统一支付预支付失败
7
+ payment_apply_success: 支付发起成功
8
+ payment_apply_failed: 支付发起失败
9
+ payment_exec_success: 支付执行成功
10
+ payment_exec_failed: 支付执行失败
11
+ refund_apply_success: 退款发起成功
12
+ refund_apply_failed: 退款发起失败
13
+ refund_exec_success: 退款执行成功
14
+ refund_exec_failed: 退款执行失败
15
+ validate_sign_failed: 支付回调签名验证失败
@@ -16,4 +16,7 @@ WechatPayment.setup do |config|
16
16
  config.sub_appid = "wx8f9f912623456789"
17
17
  config.sub_mch_id = "1234911291"
18
18
  config.sub_app_secret = "88888231e2f3a21152d163f61b99999"
19
+
20
+ # 生成的订单编号前缀
21
+ # config.order_no_prefix = "wx_"
19
22
  end
@@ -3,23 +3,6 @@ module WechatPayment
3
3
  class Client
4
4
  GATEWAY_URL = 'https://api.mch.weixin.qq.com'.freeze
5
5
 
6
- def initialize # (merchant = WechatPayment)
7
- # required_attrs = [:appid, :mch_id, :key, :app_secret, :cert_path]
8
- # missing_attrs = required_attrs.reject { |attr| merchant.respond_to?(attr) }
9
- # if missing_attrs.present?
10
- # raise Exceptions::MerchantMissingAttr.new("Missing attributes: #{missing_attrs}, merchant target must respond to: appid, mch_id, key, appsecret, cert_path")
11
- # end
12
- #
13
- # @merchant = merchant
14
- # cert_path = Rails.root.join(merchant.cert_path)
15
- #
16
- # WechatPayment.appid = merchant.appid
17
- # WechatPayment.key = merchant.key
18
- # WechatPayment.mch_id = merchant.mch_id
19
- # WechatPayment.appsecret = merchant.app_secret
20
- # WechatPayment.set_apiclient_by_pkcs12(File.binread(cert_path), merchant.mch_id)
21
- end
22
-
23
6
  ORDER_REQUIRED_FIELD = [:out_trade_no, :spbill_create_ip, :body, :total_fee, :openid]
24
7
  # 下单
25
8
  def order(order_params)
@@ -37,12 +20,13 @@ module WechatPayment
37
20
  order_result = invoke_unifiedorder(order_params)
38
21
 
39
22
  if order_result.success?
40
-
41
- payment_logger.info("{params: #{order_params}, result: #{order_result}}")
42
- WechatPayment::ServiceResult.new(success: true, data: order_result.with_indifferent_access)
23
+ message = "发起支付成功"
24
+ WechatPayment::PaymentLogger.info { "{ msg: '#{message}', params: #{order_params}, result: #{order_result} }" }
25
+ WechatPayment::SuccessResult.new(data: order_result, message:, message_kind: :payment_apply_success)
43
26
  else
44
- payment_logger.error("{params: #{order_params}, result: #{order_result}}")
45
- WechatPayment::ServiceResult.new(success: false, error: order_result.with_indifferent_access)
27
+ message = "发起支付失败"
28
+ WechatPayment::PaymentLogger.error { "{ msg: '#{message}', params: #{order_params}, result: #{order_result} }" }
29
+ WechatPayment::FailureResult.new(error: order_result, message:, message_kind: :payment_apply_failed)
46
30
  end
47
31
  end
48
32
 
@@ -61,11 +45,13 @@ module WechatPayment
61
45
  refund_result = invoke_refund(refund_params.to_options)
62
46
 
63
47
  if refund_result.success?
64
- refund_logger.info "{params: #{refund_params}, result: #{refund_result}"
65
- WechatPayment::ServiceResult.new(success: true, data: refund_result)
48
+ message = '发起退款成功'
49
+ WechatPayment::RefundLogger.info { "{ msg: '#{message}', params: #{refund_params}, result: #{refund_result}" }
50
+ WechatPayment::SuccessResult.new(data: refund_result, message:, message_kind: :refund_apply_success)
66
51
  else
67
- refund_logger.error "{params: #{refund_params}, result: #{refund_result}"
68
- WechatPayment::ServiceResult.new(success: false, error: refund_result)
52
+ message = "发起退款失败"
53
+ WechatPayment::RefundLogger.error { "{ msg: '#{message}', params: #{refund_params}, result: #{refund_result}" }
54
+ WechatPayment::FailureResult.new(error: refund_result, message:, message_kind: :refund_apply_failed)
69
55
  end
70
56
  end
71
57
 
@@ -77,18 +63,20 @@ module WechatPayment
77
63
  # 处理支付回调
78
64
  def self.handle_payment_notify(notify_data)
79
65
  if !WechatPayment::Sign.verify?(notify_data)
80
- payment_logger.error("{msg: 签名验证失败, error: #{notify_data}}")
81
- WechatPayment::ServiceResult.new(success: false, error: notify_data, message: "回调签名验证失败")
66
+ message = "回调签名验证失败"
67
+ WechatPayment::PaymentLogger.error { "{ msg: '#{message}', error: #{notify_data} }" }
68
+ WechatPayment::FailureResult.new(error: notify_data, message:, message_kind: :validate_sign_failed)
82
69
  end
83
70
 
84
71
  result = WechatPayment::InvokeResult.new(notify_data)
85
-
86
72
  if result.success?
87
- payment_logger.info("{callback: #{notify_data}}")
88
- WechatPayment::ServiceResult.new(success: true, data: notify_data, message: "支付执行成功", )
73
+ message = "支付执行成功"
74
+ WechatPayment::PaymentLogger.info { "{ msg: '#{message}', callback: #{notify_data} }" }
75
+ WechatPayment::SuccessResult.new(data: notify_data, message:, message_kind: :payment_exec_success)
89
76
  else
90
- payment_logger.error("{callback: #{notify_data}}")
91
- WechatPayment::ServiceResult.new(success: false, error: notify_data, message: "支付执行失败", error_type: :payment_exec_failed)
77
+ message = "支付执行失败"
78
+ WechatPayment::PaymentLogger.error{ "{ msg: '#{message}', callback: #{notify_data} }" }
79
+ WechatPayment::FailureResult.new(error: notify_data, message:, message_kind: :payment_exec_failed)
92
80
  end
93
81
  end
94
82
 
@@ -98,11 +86,13 @@ module WechatPayment
98
86
 
99
87
  result = WechatPayment::InvokeResult.new(notify_data)
100
88
  if result.success?
101
- refund_logger.info "退款执行成功{callback: #{notify_data}}"
102
- WechatPayment::ServiceResult.new(success: true, data: notify_data)
89
+ message = "退款执行成功"
90
+ WechatPayment::RefundLogger.info { "{ msg: '#{message}', callback: #{notify_data} }" }
91
+ WechatPayment::SuccessResult.new(data: notify_data, message:, message_kind: :refund_exec_success)
103
92
  else
104
- refund_logger.error "退款执行失败: {callback: #{notify_data}}"
105
- WechatPayment::ServiceResult.new(success:false, error: notify_data, message: "退款回调失败")
93
+ message = "退款执行失败"
94
+ WechatPayment::RefundLogger.error { "{ msg: '#{message}', callback: #{notify_data} }" }
95
+ WechatPayment::FailureResult.new(error: notify_data, message:, message_kind: :refund_exec_failed)
106
96
  end
107
97
  end
108
98
 
@@ -139,7 +129,6 @@ module WechatPayment
139
129
  params
140
130
  end
141
131
 
142
-
143
132
  INVOKE_UNIFIEDORDER_REQUIRED_FIELDS = [:body, :out_trade_no, :total_fee, :spbill_create_ip, :notify_url, :trade_type]
144
133
  def invoke_unifiedorder(params, options = {})
145
134
  params = {
@@ -176,7 +165,10 @@ module WechatPayment
176
165
  params[:op_user_id] ||= params[:mch_id]
177
166
 
178
167
  check_required_options(params, INVOKE_REFUND_REQUIRED_FIELDS)
179
- warn("WechatPayment Warn: missing required option: out_trade_no or transaction_id must have one") if ([:out_trade_no, :transaction_id] & params.keys) == []
168
+
169
+ if ([:out_trade_no, :transaction_id] & params.keys) == []
170
+ warn("WechatPayment Warn: missing required option: out_trade_no or transaction_id must have one")
171
+ end
180
172
 
181
173
  options = {
182
174
  cert: options.delete(:apiclient_cert) || WechatPayment.apiclient_cert,
@@ -191,7 +183,6 @@ module WechatPayment
191
183
  )
192
184
 
193
185
  yield result if block_given?
194
-
195
186
  result
196
187
  end
197
188
 
@@ -237,7 +228,6 @@ module WechatPayment
237
228
  res.body
238
229
  end
239
230
 
240
-
241
231
  private
242
232
 
243
233
  # 判断 hash 是否缺少 key
@@ -248,24 +238,5 @@ module WechatPayment
248
238
  raise WechatPayment::MissingKeyError.new("Parameter missing keys: #{lack_of_keys}")
249
239
  end
250
240
  end
251
-
252
- # 支付日志
253
- def payment_logger
254
- WechatPayment::Client.payment_logger
255
- end
256
-
257
- # 退款日志
258
- def refund_logger
259
- WechatPayment::Client.refund_logger
260
- end
261
-
262
- def self.payment_logger
263
- @payment_logger ||= WechatPayment::RLogger.make("wx_payment")
264
- end
265
-
266
- def self.refund_logger
267
- @refund_logger ||= WechatPayment::RLogger.make("wx_refund")
268
- end
269
-
270
241
  end
271
- end
242
+ end
@@ -42,10 +42,9 @@ module WechatPayment
42
42
  )
43
43
 
44
44
  unless user_goods.save
45
- return WechatPayment::ServiceResult.new(success: false,
46
- error: user_goods.errors,
45
+ return WechatPayment::FailureResult.new(error: user_goods.error,
47
46
  message: "商品中间表 #{user_goods_model.table_name} 插入数据失败",
48
- error_type: :create_user_goods_failed)
47
+ message_kind: :create_user_goods_failed)
49
48
  end
50
49
 
51
50
  payment_order = user_goods.payment_orders.new(
@@ -55,11 +54,13 @@ module WechatPayment
55
54
  customer: user
56
55
  )
57
56
 
58
- unless payment_order.save
59
- return WechatPayment::ServiceResult.new(success: false, error: user_goods.errors, message: "支付订单创建失败")
57
+ if payment_order.save
58
+ message = "支付订单创建成功"
59
+ WechatPayment::SuccessResult.new(data: payment_order, message:, message_kind: :create_payment_order_success)
60
+ else
61
+ message = "支付订单创建失败"
62
+ WechatPayment::FailureResult.new(error: user_goods.error, message:, message_kind: :create_payment_order_failed)
60
63
  end
61
-
62
- WechatPayment::ServiceResult.new(success: true, data: payment_order, message: "支付订单创建成功")
63
64
  end
64
65
 
65
66
  # 重新支付,应用场景是: 用户取消了支付后,使用最后一张订单进行支付
@@ -92,4 +93,4 @@ module WechatPayment
92
93
  end
93
94
  end
94
95
  end
95
- end
96
+ end
@@ -3,5 +3,6 @@ module WechatPayment
3
3
  isolate_namespace WechatPayment
4
4
 
5
5
  config.autoload_paths << "#{config.root}/lib"
6
+ config.i18n.default_locale = "zh-CN"
6
7
  end
7
8
  end
@@ -0,0 +1,7 @@
1
+
2
+ class WechatPayment::FailureResult < WechatPayment::ServiceResult
3
+ def initialize(data: {}, error: nil, message: nil, message_kind: nil, message_type: nil)
4
+ super(success: false, data: data, error: error, message: message, message_kind: message_kind, message_type: message_type)
5
+ end
6
+
7
+ end
@@ -0,0 +1,14 @@
1
+
2
+ class WechatPayment::Logger
3
+ %w{ info error warn fatal }.each do |level|
4
+ define_singleton_method level do |content = "", &block|
5
+ Rails.logger.tagged *self.tags do
6
+ if block.present?
7
+ Rails.logger.send(level, &block)
8
+ else
9
+ Rails.logger.send(level, content)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ class WechatPayment::PaymentLogger < WechatPayment::Logger
2
+
3
+ def self.tags
4
+ ["WechatPayment", "Pay"]
5
+ end
6
+
7
+ end
@@ -0,0 +1,6 @@
1
+
2
+ class WechatPayment::RefundLogger < WechatPayment::Logger
3
+ def self.tags
4
+ ["WechatPayment", "Refund"]
5
+ end
6
+ end
@@ -4,27 +4,22 @@ module WechatPayment
4
4
  :error,
5
5
  :data,
6
6
  :message,
7
- :message_type,
8
- :error_type
7
+ :message_kind,
8
+ :message_type
9
9
 
10
10
  def initialize(success: false,
11
+ data: {},
11
12
  error: nil,
12
13
  message: nil,
13
- message_type: nil,
14
- data: nil,
15
- error_type: nil)
16
- self.success = success
17
-
18
- self.data = data.presence || {}
19
-
20
- if self.data.is_a? Hash
21
- self.data = self.data.with_indifferent_access
22
- end
14
+ message_kind: nil,
15
+ message_type: nil)
23
16
 
17
+ self.success = success
18
+ self.data = data
24
19
  self.error = error
25
-
26
20
  self.message = message
27
21
  self.message_type = message_type
22
+ self.message_kind = message_kind
28
23
  end
29
24
 
30
25
  alias success? :success
@@ -41,9 +36,9 @@ module WechatPayment
41
36
  yield(self) if failure?
42
37
  end
43
38
 
44
- def get_message_type
45
- if message_type.present?
46
- message_type.to_sym
39
+ def message_type
40
+ if @message_type.present?
41
+ @message_type.to_sym
47
42
  elsif success?
48
43
  :info
49
44
  else
@@ -51,15 +46,22 @@ module WechatPayment
51
46
  end
52
47
  end
53
48
 
49
+ def message_kind_prefix
50
+ "wechat_payment_"
51
+ end
52
+
53
+ def message_kind
54
+ "#{message_kind_prefix}#{@message_kind}"
55
+ end
56
+
54
57
  def as_json(options = {})
55
- # data.as_json(options)
56
58
  {
57
59
  success: success,
58
60
  data: data,
59
61
  message: message,
60
- message_type: get_message_type,
61
62
  error: error,
62
- error_type: error_type
63
+ message_kind: message_kind,
64
+ message_type: message_type
63
65
  }
64
66
  end
65
67
  end
@@ -0,0 +1,6 @@
1
+
2
+ class WechatPayment::SuccessResult < WechatPayment::ServiceResult
3
+ def initialize(data: {}, error: nil, message: nil, message_kind: nil, message_type: nil)
4
+ super(success: true, data: data, error: error, message: message, message_kind: message_kind, message_type: message_type)
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module WechatPayment
2
- VERSION = '2.0.12'
2
+ VERSION = '2.1.0'
3
3
  end
@@ -5,7 +5,7 @@ module WechatPayment
5
5
 
6
6
  class << self
7
7
  attr_reader :apiclient_cert, :apiclient_key
8
- attr_accessor :appid, :app_secret, :mch_id, :sub_appid, :sub_app_secret, :sub_mch_id, :key, :cert_path, :host
8
+ attr_accessor :appid, :app_secret, :mch_id, :sub_appid, :sub_app_secret, :sub_mch_id, :key, :cert_path, :host, :order_no_prefix
9
9
  end
10
10
 
11
11
  def self.setup
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wechat_payment
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.12
4
+ version: 2.1.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-01-20 00:00:00.000000000 Z
11
+ date: 2022-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -75,6 +75,7 @@ files:
75
75
  - app/models/wechat_payment/refund_order.rb
76
76
  - app/services/wechat_payment/service.rb
77
77
  - app/views/layouts/wechat_payment/application.html.erb
78
+ - config/locales/zh-CN.yml
78
79
  - config/routes.rb
79
80
  - db/migrate/20210706075217_create_wechat_payment_payment_orders.rb
80
81
  - db/migrate/20210706095205_create_wechat_payment_refund_orders.rb
@@ -92,11 +93,16 @@ files:
92
93
  - lib/wechat_payment/concern/user.rb
93
94
  - lib/wechat_payment/concern/user_goods.rb
94
95
  - lib/wechat_payment/engine.rb
96
+ - lib/wechat_payment/failure_result.rb
95
97
  - lib/wechat_payment/invoke_result.rb
98
+ - lib/wechat_payment/logger.rb
96
99
  - lib/wechat_payment/missing_key_error.rb
100
+ - lib/wechat_payment/payment_logger.rb
97
101
  - lib/wechat_payment/r_logger.rb
102
+ - lib/wechat_payment/refund_logger.rb
98
103
  - lib/wechat_payment/service_result.rb
99
104
  - lib/wechat_payment/sign.rb
105
+ - lib/wechat_payment/success_result.rb
100
106
  - lib/wechat_payment/version.rb
101
107
  homepage: http://dev.com
102
108
  licenses:
@@ -120,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
126
  - !ruby/object:Gem::Version
121
127
  version: '0'
122
128
  requirements: []
123
- rubygems_version: 3.3.3
129
+ rubygems_version: 3.3.7
124
130
  signing_key:
125
131
  specification_version: 4
126
132
  summary: Summary of WechatPayment.