chan_pay 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/chan_pay/api/query_balance.rb +33 -0
- data/lib/chan_pay/api/query_order.rb +36 -2
- data/lib/chan_pay/api/quick_pay.rb +0 -18
- data/lib/chan_pay/api/sms_pay_confirm.rb +58 -0
- data/lib/chan_pay/api/sms_pay_request.rb +79 -0
- data/lib/chan_pay/api/sms_pay_resend.rb +57 -0
- data/lib/chan_pay/client.rb +4 -0
- data/lib/chan_pay/sign/rsa.rb +3 -1
- data/lib/chan_pay/version.rb +1 -1
- data/lib/chan_pay.rb +4 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3d9ed83edfada8388e102fcd1345977c5cf9108
|
4
|
+
data.tar.gz: d9b0a665d39ed30a1600844cfd1ec8ff87a28b9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 122a3f26eefd382947f1b2dacd3cc6c18bbefdbb75f1fe71c5bbffc3ab238e42d73eeded8c7c5c0181acf48725a48dd6d5698595a3745b3060c945e65b9778ab
|
7
|
+
data.tar.gz: ed1397100c2a5f4d73aa66db390305b7b475d471615b9fee0bea1370d8a84edc9653763b1b7e9aaeec717da4a8017afdc5f8a4f7a651aefda32143d80acb70ec
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
# 4.2.13 商户余额查询
|
4
|
+
|
5
|
+
module ChanPay
|
6
|
+
module Api
|
7
|
+
module QueryBalance
|
8
|
+
|
9
|
+
SERVICE_NAME = 'cjt_dsf'
|
10
|
+
|
11
|
+
# 商户余额查询
|
12
|
+
#
|
13
|
+
# @param flow_id [String] 订单号(需要保证唯一)
|
14
|
+
#
|
15
|
+
# @return [Hash] 返回结果集
|
16
|
+
#
|
17
|
+
def query_balance(flow_id)
|
18
|
+
params = {
|
19
|
+
:TransCode => 'C00005',
|
20
|
+
:OutTradeNo => flow_id,
|
21
|
+
}
|
22
|
+
|
23
|
+
response = Http.post(@partner_id, @private_key, @public_key, @server_uri, SERVICE_NAME, params)
|
24
|
+
|
25
|
+
{
|
26
|
+
result: response[:AcceptStatus],
|
27
|
+
balance: response[:RecBalance].to_f,
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -8,14 +8,48 @@ module ChanPay
|
|
8
8
|
|
9
9
|
SERVICE_NAME = 'nmg_api_query_trade'
|
10
10
|
|
11
|
-
|
11
|
+
# 确认收货接口
|
12
|
+
#
|
13
|
+
# @param flow_id [String] 订单号(需要保证唯一)
|
14
|
+
# @param ori_flow_id [String] 原业务订单号
|
15
|
+
#
|
16
|
+
# @return [Hash] 返回结果集
|
17
|
+
#
|
18
|
+
def query_order(flow_id, ori_flow_id)
|
12
19
|
params = {
|
13
20
|
:TrxId => flow_id,
|
14
|
-
:OrderTrxId =>
|
21
|
+
:OrderTrxId => ori_flow_id,
|
15
22
|
:TradeType => 'pay_order',
|
16
23
|
}
|
17
24
|
|
18
25
|
response = Http.post(@partner_id, @private_key, @public_key, @server_uri, SERVICE_NAME, params)
|
26
|
+
|
27
|
+
res = {
|
28
|
+
result: 'P', # 默认 pending
|
29
|
+
msg: response[:RetMsg],
|
30
|
+
ret_code: response[:RetCode],
|
31
|
+
flow_id: response[:TrxId],
|
32
|
+
vendor_order_id: response[:OrderTrxid],
|
33
|
+
extension: response[:Extension],
|
34
|
+
log: [params.to_json, response.to_json],
|
35
|
+
}
|
36
|
+
|
37
|
+
# 因为是查询,所以如果受理失败,状态还是按 P
|
38
|
+
if response[:AcceptStatus] == 'F'
|
39
|
+
res[:result] = 'P'
|
40
|
+
end
|
41
|
+
|
42
|
+
# 受理成功但是结果失败
|
43
|
+
if response[:AcceptStatus] == 'S' && response[:Status] == 'F'
|
44
|
+
res[:result] = 'F'
|
45
|
+
end
|
46
|
+
|
47
|
+
# 受理成功并且结果成功,才是成功
|
48
|
+
if response[:AcceptStatus] == 'S' && response[:Status] == 'S'
|
49
|
+
res[:result] = 'S'
|
50
|
+
end
|
51
|
+
|
52
|
+
res
|
19
53
|
end
|
20
54
|
|
21
55
|
end
|
@@ -46,24 +46,6 @@ module ChanPay
|
|
46
46
|
params[:CstmrNm] = Encrypt::RSA.encrypt(@public_key, true_name)
|
47
47
|
params[:MobNo] = Encrypt::RSA.encrypt(@public_key, phone)
|
48
48
|
|
49
|
-
# api 返回
|
50
|
-
# TrxId, 商户网站唯一订单号, String(32)
|
51
|
-
# OrderTrxId, 畅捷流水号, String(32)
|
52
|
-
# Status, 订单状态, String(2), S:成功,F:失败;P:处理中
|
53
|
-
# RetCode, 业务返回码, String(64)
|
54
|
-
# RetMsg, 返回描述, String (200)
|
55
|
-
# Extension, 扩展字段, String(4000), json格式
|
56
|
-
# 例子:
|
57
|
-
# {:AcceptStatus=>"S",
|
58
|
-
# :InputCharset=>"UTF-8",
|
59
|
-
# :OrderTrxid=>"101150831263182558262",
|
60
|
-
# :PartnerId=>"200001280051",
|
61
|
-
# :RetCode=>"S0001",
|
62
|
-
# :RetMsg=>"受理成功",
|
63
|
-
# :Status=>"S",
|
64
|
-
# :TradeDate=>"20171018",
|
65
|
-
# :TradeTime=>"154354",
|
66
|
-
# :TrxId=>"1508312631562"}
|
67
49
|
response = Http.post(@partner_id, @private_key, @public_key, @server_uri, SERVICE_NAME, params)
|
68
50
|
|
69
51
|
res = {
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
# 4.4.2.6 支付确认接口(API)
|
4
|
+
|
5
|
+
module ChanPay
|
6
|
+
module Api
|
7
|
+
module SmsPayConfirm
|
8
|
+
|
9
|
+
SERVICE_NAME = 'nmg_api_quick_payment_smsconfirm'
|
10
|
+
|
11
|
+
# 支付确认接口
|
12
|
+
#
|
13
|
+
# @param flow_id [String] 订单号(需要保证唯一)
|
14
|
+
# @param ori_flow_id [String] 原发短信验证码订单号
|
15
|
+
# @param sms [String] 验证码
|
16
|
+
#
|
17
|
+
# @return [Hash] 返回结果集
|
18
|
+
#
|
19
|
+
def sms_pay_confirm(flow_id, ori_flow_id, sms)
|
20
|
+
params = {
|
21
|
+
:TrxId => flow_id.to_s, # 最长 32 位唯一订单号
|
22
|
+
:OriPayTrxId => ori_flow_id,
|
23
|
+
:SmsCode => sms,
|
24
|
+
}
|
25
|
+
|
26
|
+
# 这里是明文参数输出
|
27
|
+
puts "\n[#{SERVICE_NAME}] 请求参数为:\n#{params.inspect}"
|
28
|
+
|
29
|
+
response = Http.post(@partner_id, @private_key, @public_key, @server_uri, SERVICE_NAME, params)
|
30
|
+
|
31
|
+
res = {
|
32
|
+
result: 'P', # 默认 pending
|
33
|
+
msg: response[:RetMsg],
|
34
|
+
ret_code: response[:RetCode],
|
35
|
+
# TODO(tony): 本来这个字段应该是 flow_id,但是目前返回不是,畅捷正在和技术确认中
|
36
|
+
# flow_id: response[:TrxId],
|
37
|
+
flow_id: flow_id,
|
38
|
+
vendor_order_id: response[:OrderTrxid],
|
39
|
+
extension: response[:Extension],
|
40
|
+
log: [params.to_json, response.to_json],
|
41
|
+
}
|
42
|
+
|
43
|
+
# 受理失败 || 受理成功但是结果失败
|
44
|
+
if response[:AcceptStatus] == 'F' || (response[:AcceptStatus] == 'S' && response[:Status] == 'F')
|
45
|
+
res[:result] = 'F'
|
46
|
+
end
|
47
|
+
|
48
|
+
# 受理成功并且结果成功,才是成功
|
49
|
+
if response[:AcceptStatus] == 'S' && response[:Status] == 'S'
|
50
|
+
res[:result] = 'S'
|
51
|
+
end
|
52
|
+
|
53
|
+
res
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
# 4.4.2.7 直接支付请求接口(API)
|
4
|
+
|
5
|
+
module ChanPay
|
6
|
+
module Api
|
7
|
+
module SmsPayRequest
|
8
|
+
|
9
|
+
SERVICE_NAME = 'nmg_zft_api_quick_payment'
|
10
|
+
|
11
|
+
# 快捷直接支付请求接口
|
12
|
+
#
|
13
|
+
# @param flow_id [String] 订单号(需要保证唯一)
|
14
|
+
# @param user_id [String] 唯一用户识别号,比如数据库 ID(但要考虑分布式)
|
15
|
+
# @param card_id [String] 支付银行卡号
|
16
|
+
# @param identity_id [String] 身份证号
|
17
|
+
# @param true_name [String] 真实姓名
|
18
|
+
# @param phone [String] 银行卡预留手机号
|
19
|
+
# @param money [String] 支付金额(单位:元,精确到 2 位小数点)
|
20
|
+
#
|
21
|
+
# @return [Hash] 返回结果集
|
22
|
+
#
|
23
|
+
def sms_pay_request(flow_id, user_id,
|
24
|
+
card_id, identity_id, true_name, phone, money)
|
25
|
+
params = {
|
26
|
+
:TrxId => flow_id.to_s, # 最长 32 位唯一订单号
|
27
|
+
:OrdrName => '快捷充值', # 商品名称
|
28
|
+
:MerUserId => user_id, # 商户网站用户唯一标识,不建议手机号
|
29
|
+
:SellerId => @seller_id, # 畅捷提供的商户编号
|
30
|
+
:ExpiredTime => '90m', # 订单有效期
|
31
|
+
:BkAcctTp => '01', # 卡类型
|
32
|
+
:BkAcctNo => card_id, # 卡号,需要 rsa 加密
|
33
|
+
:IDTp => '01', # 证件类型,01 身份证
|
34
|
+
:IDNo => identity_id, # 证件号,rsa 加密
|
35
|
+
:CstmrNm => true_name, # 持卡人姓名,rsa 加密
|
36
|
+
:MobNo => phone, # 银行预留手机号,rsa 加密
|
37
|
+
:TradeType => '11', # 交易类型(即时 11 担保 12)
|
38
|
+
:TrxAmt => money.to_s, # 交易金额
|
39
|
+
# 'NotifyUrl' => '', # 异步通知地址,可空
|
40
|
+
# 'Extension' => '', # 扩展字段,可空
|
41
|
+
}
|
42
|
+
|
43
|
+
# 这里是明文参数输出
|
44
|
+
puts "\n[#{SERVICE_NAME}] 请求参数为:\n#{params.inspect}"
|
45
|
+
|
46
|
+
# 敏感字段加密
|
47
|
+
params[:BkAcctNo] = Encrypt::RSA.encrypt(@public_key, card_id)
|
48
|
+
params[:IDNo] = Encrypt::RSA.encrypt(@public_key, identity_id)
|
49
|
+
params[:CstmrNm] = Encrypt::RSA.encrypt(@public_key, true_name)
|
50
|
+
params[:MobNo] = Encrypt::RSA.encrypt(@public_key, phone)
|
51
|
+
|
52
|
+
response = Http.post(@partner_id, @private_key, @public_key, @server_uri, SERVICE_NAME, params)
|
53
|
+
|
54
|
+
res = {
|
55
|
+
result: 'P', # 默认 pending
|
56
|
+
msg: response[:RetMsg],
|
57
|
+
ret_code: response[:RetCode],
|
58
|
+
flow_id: response[:TrxId],
|
59
|
+
vendor_order_id: response[:OrderTrxid],
|
60
|
+
extension: response[:Extension],
|
61
|
+
log: [params.to_json, response.to_json],
|
62
|
+
}
|
63
|
+
|
64
|
+
# 受理失败 || 受理成功但是结果失败
|
65
|
+
if response[:AcceptStatus] == 'F' || (response[:AcceptStatus] == 'S' && response[:Status] == 'F')
|
66
|
+
res[:result] = 'F'
|
67
|
+
end
|
68
|
+
|
69
|
+
# 受理成功并且结果成功,才是成功
|
70
|
+
if response[:AcceptStatus] == 'S' && response[:Status] == 'S'
|
71
|
+
res[:result] = 'S'
|
72
|
+
end
|
73
|
+
|
74
|
+
res
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
# 4.4.2.11 短信验证码重发接口
|
4
|
+
|
5
|
+
module ChanPay
|
6
|
+
module Api
|
7
|
+
module SmsPayResend
|
8
|
+
|
9
|
+
SERVICE_NAME = 'nmg_api_quick_payment_resend'
|
10
|
+
|
11
|
+
# 短信验证码重发接口
|
12
|
+
#
|
13
|
+
# @param flow_id [String] 订单号(需要保证唯一)
|
14
|
+
# @param ori_flow_id [String] 原发短信验证码订单号
|
15
|
+
#
|
16
|
+
# @return [Hash] 返回结果集
|
17
|
+
#
|
18
|
+
def sms_pay_resend(flow_id, ori_flow_id)
|
19
|
+
params = {
|
20
|
+
:TrxId => flow_id.to_s, # 最长 32 位唯一订单号
|
21
|
+
:OriTrxId => ori_flow_id,
|
22
|
+
:TradeType => 'pay_order',
|
23
|
+
}
|
24
|
+
|
25
|
+
# 这里是明文参数输出
|
26
|
+
puts "\n[#{SERVICE_NAME}] 请求参数为:\n#{params.inspect}"
|
27
|
+
|
28
|
+
response = Http.post(@partner_id, @private_key, @public_key, @server_uri, SERVICE_NAME, params)
|
29
|
+
|
30
|
+
res = {
|
31
|
+
result: 'P', # 默认 pending
|
32
|
+
msg: response[:RetMsg],
|
33
|
+
ret_code: response[:RetCode],
|
34
|
+
# TODO(tony): 本来这个字段应该是 flow_id,但是目前返回不是,畅捷正在和技术确认中
|
35
|
+
# flow_id: response[:TrxId],
|
36
|
+
flow_id: flow_id,
|
37
|
+
vendor_order_id: response[:OrderTrxid],
|
38
|
+
extension: response[:Extension],
|
39
|
+
log: [params.to_json, response.to_json],
|
40
|
+
}
|
41
|
+
|
42
|
+
# 受理失败 || 受理成功但是结果失败
|
43
|
+
if response[:AcceptStatus] == 'F' || (response[:AcceptStatus] == 'S' && response[:Status] == 'F')
|
44
|
+
res[:result] = 'F'
|
45
|
+
end
|
46
|
+
|
47
|
+
# 受理成功并且结果成功,才是成功
|
48
|
+
if response[:AcceptStatus] == 'S' && response[:Status] == 'S'
|
49
|
+
res[:result] = 'S'
|
50
|
+
end
|
51
|
+
|
52
|
+
res
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/chan_pay/client.rb
CHANGED
@@ -7,6 +7,10 @@ module ChanPay
|
|
7
7
|
|
8
8
|
include ChanPay::Api::QuickPay
|
9
9
|
include ChanPay::Api::QueryOrder
|
10
|
+
include ChanPay::Api::QueryBalance
|
11
|
+
include ChanPay::Api::SmsPayRequest
|
12
|
+
include ChanPay::Api::SmsPayConfirm
|
13
|
+
include ChanPay::Api::SmsPayResend
|
10
14
|
|
11
15
|
def initialize(options_arg)
|
12
16
|
options = Utils.symbolize_keys(options_arg)
|
data/lib/chan_pay/sign/rsa.rb
CHANGED
@@ -12,7 +12,9 @@ module ChanPay
|
|
12
12
|
def self.verify?(key, hash, sign)
|
13
13
|
content = link_hash(hash)
|
14
14
|
rsa = OpenSSL::PKey::RSA.new(key)
|
15
|
-
rsa.verify('sha1', Base64.strict_decode64(sign), content)
|
15
|
+
result = rsa.verify('sha1', Base64.strict_decode64(sign), content)
|
16
|
+
puts "\nrsa verify:#{result}; 回过来的 sign 为:#{sign}\n" unless result
|
17
|
+
result
|
16
18
|
end
|
17
19
|
|
18
20
|
private
|
data/lib/chan_pay/version.rb
CHANGED
data/lib/chan_pay.rb
CHANGED
@@ -10,8 +10,12 @@ require "chan_pay/sign/rsa"
|
|
10
10
|
require "chan_pay/encrypt/rsa"
|
11
11
|
require "chan_pay/http/ret_code"
|
12
12
|
require "chan_pay/http/communicate"
|
13
|
+
require "chan_pay/api/sms_pay_request"
|
14
|
+
require "chan_pay/api/sms_pay_confirm"
|
15
|
+
require "chan_pay/api/sms_pay_resend"
|
13
16
|
require "chan_pay/api/quick_pay"
|
14
17
|
require "chan_pay/api/query_order"
|
18
|
+
require "chan_pay/api/query_balance"
|
15
19
|
require "chan_pay/client"
|
16
20
|
|
17
21
|
module ChanPay
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chan_pay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tony
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,8 +71,12 @@ files:
|
|
71
71
|
- bin/setup
|
72
72
|
- chan_pay.gemspec
|
73
73
|
- lib/chan_pay.rb
|
74
|
+
- lib/chan_pay/api/query_balance.rb
|
74
75
|
- lib/chan_pay/api/query_order.rb
|
75
76
|
- lib/chan_pay/api/quick_pay.rb
|
77
|
+
- lib/chan_pay/api/sms_pay_confirm.rb
|
78
|
+
- lib/chan_pay/api/sms_pay_request.rb
|
79
|
+
- lib/chan_pay/api/sms_pay_resend.rb
|
76
80
|
- lib/chan_pay/client.rb
|
77
81
|
- lib/chan_pay/encrypt/rsa.rb
|
78
82
|
- lib/chan_pay/http/communicate.rb
|