wechat-ipay 2.0.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.
@@ -0,0 +1,230 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WechatPay
4
+ # 分账相关
5
+ module Ecommerce
6
+ class << self
7
+ REQUEST_PROFITSHARING_FIELDS = %i[out_trade_no transaction_id sub_mchid out_order_no receivers finish].freeze # :nodoc:
8
+ #
9
+ # 分账请求
10
+ #
11
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_1.shtml
12
+ #
13
+ # Example:
14
+ #
15
+ # ``` ruby
16
+ # params = {"out_trade_no"=>"P202104306585", "transaction_id"=>"4323400972202104301286330188", "sub_mchid"=>"160000", "out_order_no"=>"N202104307987", "finish"=>true, "receivers"=>[{"type"=>"MERCHANT_ID", "receiver_account"=>"1607189890", "amount"=>1, "description"=>"平台抽成", "receiver_name"=>"CXOO5SF5sylMhSWjUBHQ6dBN0BTdrGExiziO8OEnJEG/nAa7gw6JTbsFQVhUbXD2er07Gcvt7qsLg7wYEe6iqNKbHHRWvChVVKWcKSyvfMOcRa95lxUkVn2+YdMmQ/Rt2h+xN7HMFMVPh9Py2c3sxnv1hZSraTEBWp577NOVwfSKiDTOAnbLtVtLbJndZ2N/bRXzW/gpbQV6TnnsrKPJ+NQ64kCedaYoO0XvEK1JavJju4kUAw/TnJ78jBMwj0gx2kfrsAgtwGrIGhrqhGcGHwwwPPDk5lS/iVaKpSdMvxOHN/9mrAqgqmvBg9uHRKE4sUqkZWuaiAFvYF9/5sLgjQ=="}]}
17
+ # WechatPay::Ecommerce.request_profitsharing(params)
18
+ # ```
19
+ def request_profitsharing(params)
20
+ url = '/v3/ecommerce/profitsharing/orders'
21
+ method = 'POST'
22
+ params = {
23
+ appid: WechatPay.app_id
24
+ }.merge(params)
25
+
26
+ payload_json = params.to_json
27
+
28
+ make_request(
29
+ method: method,
30
+ path: url,
31
+ for_sign: payload_json,
32
+ payload: payload_json,
33
+ extra_headers: {
34
+ 'Wechatpay-Serial' => WechatPay.platform_serial_no
35
+ }
36
+ )
37
+ end
38
+
39
+ QUERY_PROFITSHARING_FIELDS = %i[out_order_no transaction_id sub_mchid].freeze # :nodoc:
40
+ #
41
+ # 分账结果查询
42
+ #
43
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_2.shtml
44
+ #
45
+ # Example:
46
+ #
47
+ # ``` ruby
48
+ # WechatPay::Ecommerce.query_profitsharing(out_order_no: 'N202104288345', sub_mchid: '16000000', transaction_id: '4200001048202104280183691118')
49
+ # ```
50
+ #
51
+ def query_profitsharing(params)
52
+ method = 'GET'
53
+ query = build_query(params)
54
+ path = '/v3/ecommerce/profitsharing/orders'
55
+ url = "#{path}?#{query}"
56
+
57
+ make_request(
58
+ path: url,
59
+ method: method,
60
+ extra_headers: {
61
+ 'Content-Type' => 'application/x-www-form-urlencoded'
62
+ }
63
+ )
64
+ end
65
+
66
+ RETURN_PROFITSHARING_FIELDS = %i[sub_mchid order_id out_order_no out_return_no return_mchid amount description].freeze # :nodoc:
67
+ #
68
+ # 请求分账回退
69
+ #
70
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_3.shtml
71
+ #
72
+ # ``` ruby
73
+ # WechatPay::Ecommerce.return_profitsharing(out_order_no: 'P202104306585', sub_mchid: '16000000', out_return_no: 'R20210430223', return_mchid: '180000', amount: 1, description: '分账回退')
74
+ # WechatPay::Ecommerce.return_profitsharing(order_id: '3008450740201411110007820472', sub_mchid: '16000000', out_return_no: 'R20210430223', return_mchid: '180000', amount: 1, description: '分账回退')
75
+ # ```
76
+ def return_profitsharing(params)
77
+ url = '/v3/ecommerce/profitsharing/returnorders'
78
+ method = 'POST'
79
+
80
+ payload_json = params.to_json
81
+
82
+ make_request(
83
+ method: method,
84
+ path: url,
85
+ for_sign: payload_json,
86
+ payload: payload_json
87
+ )
88
+ end
89
+
90
+ QUERY_RETURN_PROFITSHARING_FIELDS = %i[sub_mchid order_id out_order_no out_return_no].freeze # :nodoc:
91
+ #
92
+ # 分账回退结果查询
93
+ #
94
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_4.shtml
95
+ #
96
+ # Example:
97
+ #
98
+ # ``` ruby
99
+ # WechatPay::Ecommerce.query_return_profitsharing(sub_mchid: '1608747309', out_order_no: 'P202104306585', out_return_no: 'R202105023455')
100
+ # WechatPay::Ecommerce.query_return_profitsharing(sub_mchid: '1608747309', order_id: '3008450740201411110007820472', out_return_no: 'R202105023455')
101
+ # ```
102
+ def query_return_profitsharing(params)
103
+ method = 'GET'
104
+ query = build_query(params)
105
+ path = '/v3/ecommerce/profitsharing/returnorders'
106
+ url = "#{path}?#{query}"
107
+
108
+ make_request(
109
+ path: url,
110
+ method: method,
111
+ extra_headers: {
112
+ 'Content-Type' => 'application/x-www-form-urlencoded'
113
+ }
114
+ )
115
+ end
116
+
117
+ FINISH_PROFITSHARING_FIELDS = %i[transaction_id sub_mchid out_order_no description].freeze # :nodoc:
118
+ #
119
+ # 完结分账
120
+ #
121
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_5.shtml
122
+ #
123
+ # Example:
124
+ #
125
+ # ``` ruby
126
+ # WechatPay::Ecommerce.finish_profitsharing(sub_mchid: '160000', out_order_no: 'P202104303106', transaction_id: '4323400972202104305131070133', description: '直接打款到二级商户不分账').bod
127
+ # ```
128
+ #
129
+ def finish_profitsharing(params)
130
+ url = '/v3/ecommerce/profitsharing/finish-order'
131
+ method = 'POST'
132
+
133
+ payload_json = params.to_json
134
+
135
+ make_request(
136
+ method: method,
137
+ path: url,
138
+ for_sign: payload_json,
139
+ payload: payload_json
140
+ )
141
+ end
142
+
143
+ QUERY_PROFITSHARING_AMOUNT_FIELDS = %i[transaction_id].freeze # :nodoc:
144
+ #
145
+ # 查询订单剩余待分金额
146
+ #
147
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_9.shtml
148
+ #
149
+ # Example:
150
+ #
151
+ # ``` ruby
152
+ # WechatPay::Ecommerce.query_profitsharing_amount({ transaction_id: '4323400972202104301286330188' })
153
+ # ```
154
+ #
155
+ def query_profitsharing_amount(params)
156
+ method = 'GET'
157
+ transaction_id = params.delete(:transaction_id)
158
+ url = "/v3/ecommerce/profitsharing/orders/#{transaction_id}/amounts"
159
+
160
+ make_request(
161
+ path: url,
162
+ method: method,
163
+ extra_headers: {
164
+ 'Content-Type' => 'application/x-www-form-urlencoded'
165
+ }
166
+ )
167
+ end
168
+
169
+ ADD_PROFITSHARING_RECEIVERS_FIELDS = %i[type account name relation_type].freeze # :nodoc:
170
+ #
171
+ # 添加分账接收方
172
+ #
173
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_7.shtml
174
+ #
175
+ # Example:
176
+ #
177
+ # ``` ruby
178
+ # WechatPay::Ecommerce.add_profitsharing_receivers(type: 'PERSONAL_OPENID', account: 'oly6s5cLmmVzzr8iPyI6mJj7qG2s', name: 'Lan', relation_type: 'DISTRIBUTOR').body
179
+ # ```
180
+ #
181
+ def add_profitsharing_receivers(params)
182
+ url = '/v3/ecommerce/profitsharing/receivers/add'
183
+ method = 'POST'
184
+
185
+ params = {
186
+ appid: WechatPay.app_id
187
+ }.merge(params)
188
+
189
+ payload_json = params.to_json
190
+
191
+ make_request(
192
+ method: method,
193
+ path: url,
194
+ for_sign: payload_json,
195
+ payload: payload_json
196
+ )
197
+ end
198
+
199
+ DELETE_PROFITSHARING_RECEIVERS_FIELDS = %i[type account].freeze # :nodoc:
200
+ #
201
+ # 删除分账接收方
202
+ #
203
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_4_8.shtml
204
+ #
205
+ # Example:
206
+ #
207
+ # ``` ruby
208
+ # WechatPay::Ecommerce.remove_profitsharing_receivers(type: 'PERSONAL_OPENID', account: 'oly6s5cLmmVzzr8iPyI6mJj7qG2s', name: 'Lan', relation_type: 'DISTRIBUTOR').body
209
+ # ```
210
+ #
211
+ def delete_profitsharing_receivers(params)
212
+ url = '/v3/ecommerce/profitsharing/receivers/delete'
213
+ method = 'POST'
214
+
215
+ params = {
216
+ appid: WechatPay.app_id
217
+ }.merge(params)
218
+
219
+ payload_json = params.to_json
220
+
221
+ make_request(
222
+ method: method,
223
+ path: url,
224
+ for_sign: payload_json,
225
+ payload: payload_json
226
+ )
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WechatPay
4
+ # 退款相关
5
+ module Ecommerce
6
+ INVOKE_REFUND_FIELDS = %i[sub_mchid out_trade_no total refund out_refund_no].freeze # :nodoc:
7
+ #
8
+ # 退款申请
9
+ #
10
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_1.shtml
11
+ #
12
+ # Example:
13
+ #
14
+ # ``` ruby
15
+ # WechatPay::Ecommerce.invoke_refund(sub_mchid: '1600000', transaction_id: '4323400972202104305131070170', total: 1, refund: 1, description: '退款', out_refund_no: 'R10000') # by transaction_id
16
+ # WechatPay::Ecommerce.invoke_refund(sub_mchid: '1608977559', total: 1, refund: 1, description: '退款', out_trade_no: 'N202104302474', out_refund_no: 'R10000') # by out_trade_no
17
+ # ```
18
+ def self.invoke_refund(params)
19
+ url = '/v3/ecommerce/refunds/apply'
20
+ method = 'POST'
21
+ amount = {
22
+ refund: params.delete(:refund),
23
+ total: params.delete(:total),
24
+ currency: 'CNY'
25
+ }
26
+
27
+ params = {
28
+ amount: amount,
29
+ sp_appid: WechatPay.app_id
30
+ }.merge(params)
31
+
32
+ make_request(
33
+ path: url,
34
+ method: method,
35
+ for_sign: params.to_json,
36
+ payload: params.to_json
37
+ )
38
+ end
39
+
40
+ QUERY_REFUND_FIELDS = %i[sub_mchid refund_id out_refund_no].freeze # :nodoc:
41
+ #
42
+ # 退款查询
43
+ #
44
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_2.shtml
45
+ #
46
+ # Example:
47
+ #
48
+ # ``` ruby
49
+ # WechatPay::Ecommerce.query_refund(sub_mchid: '16000000', out_refund_no: 'AFS202104302474')
50
+ # WechatPay::Ecommerce.query_refund(sub_mchid: '16000000', refund_id: '50000000382019052709732678859')
51
+ # ```
52
+ #
53
+ def self.query_refund(params)
54
+ if params[:refund_id]
55
+ params.delete(:out_refund_no)
56
+ refund_id = params.delete(:refund_id)
57
+ path = "/v3/ecommerce/refunds/id/#{refund_id}"
58
+ else
59
+ params.delete(:refund_id)
60
+ out_refund_no = params.delete(:out_refund_no)
61
+ path = "/v3/ecommerce/refunds/out-refund-no/#{out_refund_no}"
62
+ end
63
+
64
+ params = params.merge({
65
+ sp_mchid: WechatPay.mch_id
66
+ })
67
+
68
+ method = 'GET'
69
+ query = build_query(params)
70
+ url = "#{path}?#{query}"
71
+
72
+ make_request(
73
+ method: method,
74
+ path: url,
75
+ extra_headers: {
76
+ 'Content-Type' => 'application/x-www-form-urlencoded'
77
+ }
78
+ )
79
+ end
80
+
81
+ RETURN_ADVANCE_REFUND_FIELDS = %i[refund_id sub_mchid].freeze # :nodoc:
82
+ #
83
+ # 垫付退款回补
84
+ #
85
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_4.shtml
86
+ #
87
+ # Example:
88
+ #
89
+ # ``` ruby
90
+ # WechatPay::Ecommerce.return_advance_refund(refund_id: '50300908092021043008398036516', sub_mchid: '160000')
91
+ # ```
92
+ #
93
+ def self.return_advance_refund(params)
94
+ refund_id = params.delete(:refund_id)
95
+ url = "/v3/ecommerce/refunds/#{refund_id}/return-advance"
96
+ method = 'POST'
97
+
98
+ make_request(
99
+ path: url,
100
+ method: method,
101
+ for_sign: params.to_json,
102
+ payload: params.to_json
103
+ )
104
+ end
105
+
106
+ QUERY_RETURN_ADVANCE_REFUND_FIELDS = %i[sub_mchid refund_id].freeze # :nodoc:
107
+ #
108
+ # 退款查询
109
+ #
110
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_6_2.shtml
111
+ #
112
+ # Example:
113
+ #
114
+ # ``` ruby
115
+ # WechatPay::Ecommerce.query_refund(sub_mchid: '16000000', out_refund_no: 'AFS202104302474')
116
+ # WechatPay::Ecommerce.query_refund(sub_mchid: '16000000', refund_id: '50000000382019052709732678859')
117
+ # ```
118
+ #
119
+ def self.query_return_advance_refund(params)
120
+ refund_id = params.delete(:refund_id)
121
+ path = "/v3/ecommerce/refunds/#{refund_id}/return-advance"
122
+ method = 'GET'
123
+ query = build_query(params)
124
+ url = "#{path}?#{query}"
125
+
126
+ make_request(
127
+ method: method,
128
+ path: url,
129
+ extra_headers: {
130
+ 'Content-Type' => 'application/x-www-form-urlencoded'
131
+ }
132
+ )
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WechatPay
4
+ # 补差相关
5
+ module Ecommerce
6
+ REQUEST_SUBSIDIES_FIELDS = %i[sub_mchid transaction_id amount description].freeze # :nodoc:
7
+ #
8
+ # 请求补差
9
+ #
10
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_5_1.shtml
11
+ #
12
+ # Example:
13
+ #
14
+ # ``` ruby
15
+ # WechatPay::Ecommerce.request_subsidies(sub_mchid: '16000000', transaction_id: '4323400972202104305131070170', amount: 1, description: '订单补差')
16
+ # ```
17
+ #
18
+ def self.request_subsidies(params)
19
+ url = '/v3/ecommerce/subsidies/create'
20
+ method = 'POST'
21
+
22
+ payload_json = params.to_json
23
+
24
+ make_request(
25
+ method: method,
26
+ path: url,
27
+ for_sign: payload_json,
28
+ payload: payload_json
29
+ )
30
+ end
31
+
32
+ RETURN_SUBSIDIES_FIELDS = %i[sub_mchid transaction_id amount description out_order_no].freeze # :nodoc:
33
+ #
34
+ # 补差回退
35
+ #
36
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_5_2.shtml
37
+ #
38
+ # Example:
39
+ #
40
+ # ``` ruby
41
+ # WechatPay::Ecommerce.return_subsidies(sub_mchid: '16000000', transaction_id: '4323400972202104305131070170', amount: 1, description: '订单补差', out_order_no: 'P103333')
42
+ # ```
43
+
44
+ def self.return_subsidies(params)
45
+ url = '/v3/ecommerce/subsidies/return'
46
+ method = 'POST'
47
+
48
+ payload_json = params.to_json
49
+
50
+ make_request(
51
+ method: method,
52
+ path: url,
53
+ for_sign: payload_json,
54
+ payload: payload_json
55
+ )
56
+ end
57
+
58
+ CANCEL_SUBSIDIES_FIELDS = %i[sub_mchid transaction_id description].freeze # :nodoc:
59
+ #
60
+ # 取消补差
61
+ #
62
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_5_3.shtml
63
+ #
64
+ # Example:
65
+ #
66
+ # ``` ruby
67
+ # WechatPay::Ecommerce.return_subsidies(sub_mchid: '1600000', transaction_id: '4323400972202104305131070170', amount: 1, description: '订单补差', out_order_no: 'P103333')
68
+ # ```
69
+ #
70
+ def self.cancel_subsidies(params)
71
+ url = '/v3/ecommerce/subsidies/cancel'
72
+ method = 'POST'
73
+
74
+ payload_json = params.to_json
75
+
76
+ make_request(
77
+ method: method,
78
+ path: url,
79
+ for_sign: payload_json,
80
+ payload: payload_json
81
+ )
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WechatPay
4
+ # 提现相关
5
+ module Ecommerce
6
+ WITHDRAW_FIELDS = %i[sub_mchid out_request_no amount].freeze # :nodoc:
7
+ #
8
+ # 二级商户提现
9
+ #
10
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_2.shtml
11
+ #
12
+ # Example:
13
+ #
14
+ # ``` ruby
15
+ # WechatPay::Ecommerce.withdraw(sub_mchid: '160000', out_request_no: 'P10000', amount: 1)
16
+ # ```
17
+ #
18
+ def self.withdraw(params)
19
+ url = '/v3/ecommerce/fund/withdraw'
20
+ method = 'POST'
21
+
22
+ make_request(
23
+ method: method,
24
+ path: url,
25
+ for_sign: params.to_json,
26
+ payload: params.to_json
27
+ )
28
+ end
29
+
30
+ QUERY_WITHDRAW_FIELDS = %i[withdraw_id out_request_no sub_mchid].freeze # :nodoc:
31
+ #
32
+ # 二级商户提现查询
33
+ #
34
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_3.shtml
35
+ #
36
+ # Example:
37
+ #
38
+ # ``` ruby
39
+ # WechatPay::Ecommerce.query_withdraw(withdraw_id: '335556', sub_mchid: '160000')
40
+ # WechatPay::Ecommerce.query_withdraw(out_request_no: 'P1000', sub_mchid: '160000')
41
+ # ```
42
+ #
43
+ def self.query_withdraw(params)
44
+ if params[:withdraw_id]
45
+ params.delete(:out_request_no)
46
+ withdraw_id = params.delete(:withdraw_id)
47
+ path = "/v3/ecommerce/fund/withdraw/#{withdraw_id}"
48
+ else
49
+ params.delete(:withdraw_id)
50
+ out_request_no = params.delete(:out_request_no)
51
+ path = "/v3/ecommerce/fund/withdraw/out-request-no/#{out_request_no}"
52
+ end
53
+
54
+ method = 'GET'
55
+ query = build_query(params)
56
+ url = "#{path}?#{query}"
57
+
58
+ make_request(
59
+ method: method,
60
+ path: url,
61
+ extra_headers: {
62
+ 'Content-Type' => 'application/x-www-form-urlencoded'
63
+ }
64
+ )
65
+ end
66
+
67
+ PLATFORM_WITHDRAW_FIELDS = %i[out_request_no amount account_type].freeze # :nodoc:
68
+ #
69
+ # 电商平台提现
70
+ #
71
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_5.shtml
72
+ #
73
+ # Example:
74
+ #
75
+ # ``` ruby
76
+ # WechatPay::Ecommerce.platform_withdraw(out_request_no: 'P10000', amount: 1, account_type: 'BASIC')
77
+ # WechatPay::Ecommerce.platform_withdraw(out_request_no: 'P10000', amount: 1, account_type: 'FEES')
78
+ # ```
79
+ #
80
+ def self.platform_withdraw(params)
81
+ url = '/v3/merchant/fund/withdraw'
82
+ method = 'POST'
83
+
84
+ make_request(
85
+ method: method,
86
+ path: url,
87
+ for_sign: params.to_json,
88
+ payload: params.to_json
89
+ )
90
+ end
91
+
92
+ QUERY_PLATFORM_WITHDRAW_FIELDS = %i[withdraw_id out_request_no].freeze # :nodoc:
93
+ #
94
+ # 商户平台提现查询
95
+ #
96
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_6.shtml
97
+ #
98
+ # Example:
99
+ #
100
+ # ``` ruby
101
+ # WechatPay::Ecommerce.query_platform_withdraw(out_request_no: 'P1000')
102
+ # WechatPay::Ecommerce.query_platform_withdraw(withdraw_id: '12313153')
103
+ # ```
104
+ #
105
+ def self.query_platform_withdraw(params)
106
+ if params[:withdraw_id]
107
+ params.delete(:out_request_no)
108
+ withdraw_id = params.delete(:withdraw_id)
109
+ url = "/v3/merchant/fund/withdraw/withdraw-id/#{withdraw_id}"
110
+ else
111
+ params.delete(:withdraw_id)
112
+ out_request_no = params.delete(:out_request_no)
113
+ url = "/v3/merchant/fund/withdraw/out-request-no/#{out_request_no}"
114
+ end
115
+
116
+ method = 'GET'
117
+
118
+ make_request(
119
+ method: method,
120
+ path: url,
121
+ extra_headers: {
122
+ 'Content-Type' => 'application/x-www-form-urlencoded'
123
+ }
124
+ )
125
+ end
126
+
127
+ DOWNLOAD_EXCEPTION_WITHDRAW_FILE = %i[bill_type bill_date].freeze # :nodoc:
128
+ #
129
+ # 按日下载提现异常文件
130
+ #
131
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_8_4.shtml
132
+ #
133
+ # ``` ruby
134
+ # WechatPay::Ecommerce.download_exception_withdraw_file(bill_type: 'NO_SUCC', bill_date: '2021-05-10')
135
+ # ```
136
+ def self.download_exception_withdraw_file(params)
137
+ bill_type = params.delete(:bill_type)
138
+ path = "/v3/merchant/fund/withdraw/bill-type/#{bill_type}"
139
+
140
+ method = 'GET'
141
+
142
+ query = build_query(params)
143
+ url = "#{path}?#{query}"
144
+
145
+ make_request(
146
+ method: method,
147
+ path: url,
148
+ extra_headers: {
149
+ 'Content-Type' => 'application/x-www-form-urlencoded'
150
+ }
151
+ )
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'wechat-pay/helper'
5
+ require 'wechat-pay/ecommerce/withdraw'
6
+ require 'wechat-pay/ecommerce/balance'
7
+ require 'wechat-pay/ecommerce/applyment'
8
+ require 'wechat-pay/ecommerce/order'
9
+ require 'wechat-pay/ecommerce/combine_order'
10
+ require 'wechat-pay/ecommerce/profitsharing'
11
+ require 'wechat-pay/ecommerce/subsidies'
12
+ require 'wechat-pay/ecommerce/refund'
13
+ require 'wechat-pay/ecommerce/bill'
14
+
15
+ module WechatPay
16
+ # # 服务商相关接口封装(电商平台,服务商有许多接口共用)
17
+ # 文档: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter3_3_3.shtml
18
+ #
19
+ # PS: 电商收付通的所有接口已经封装完毕,有需要再补充。
20
+ #
21
+ module Ecommerce
22
+ include WechatPayHelper
23
+
24
+ # 视频上传
25
+ #
26
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter2_1_2.shtml
27
+ #
28
+ # Example:
29
+ #
30
+ # ``` ruby
31
+ # WechatPay::Ecommerce.media_video_upload(File.open('Your Video'))
32
+ # ```
33
+ #
34
+ def self.media_video_upload(video)
35
+ url = '/v3/merchant/media/video_upload'
36
+ method = 'POST'
37
+ meta = {
38
+ filename: video.to_path,
39
+ sha256: Digest::SHA256.hexdigest(video.read)
40
+ }
41
+
42
+ video.rewind
43
+ payload = {
44
+ meta: meta.to_json,
45
+ file: video
46
+ }
47
+
48
+ make_request(
49
+ method: method,
50
+ path: url,
51
+ for_sign: meta.to_json,
52
+ payload: payload,
53
+ extra_headers: {
54
+ 'Content-Type' => nil
55
+ }
56
+ )
57
+ end
58
+
59
+ # 图片上传
60
+ #
61
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter2_1_1.shtml
62
+ #
63
+ # Example:
64
+ #
65
+ # ``` ruby
66
+ # WechatPay::Ecommerce.media_upload(File.open('Your Image'))
67
+ # ```
68
+ def self.media_upload(image)
69
+ url = '/v3/merchant/media/upload'
70
+ method = 'POST'
71
+ meta = {
72
+ filename: image.to_path,
73
+ sha256: Digest::SHA256.hexdigest(image.read)
74
+ }
75
+
76
+ image.rewind
77
+ payload = {
78
+ meta: meta.to_json,
79
+ file: image
80
+ }
81
+
82
+ make_request(
83
+ method: method,
84
+ path: url,
85
+ for_sign: meta.to_json,
86
+ payload: payload,
87
+ extra_headers: {
88
+ 'Content-Type' => nil # Pass nil to remove the Content-Type
89
+ }
90
+ )
91
+ end
92
+ end
93
+ end