reapal 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/lib/reapal.rb +2 -0
  4. data/lib/reapal/api/asset/tender_all_cancel.rb +64 -0
  5. data/lib/reapal/api/asset/tender_apply.rb +81 -0
  6. data/lib/reapal/api/asset/tender_auth_cancel.rb +66 -0
  7. data/lib/reapal/api/asset/tender_auth_query.rb +64 -0
  8. data/lib/reapal/api/asset/tender_finish.rb +78 -0
  9. data/lib/reapal/api/asset/tender_repayment_complete.rb +75 -0
  10. data/lib/reapal/api/asset/tender_repayment_project.rb +70 -0
  11. data/lib/reapal/api/error_codes.rb +46 -0
  12. data/lib/reapal/api/money/.keep +0 -0
  13. data/lib/reapal/api/order/.keep +0 -0
  14. data/lib/reapal/api/user/balance_query.rb +61 -0
  15. data/lib/reapal/api/user/bank_card_add_sms.rb +71 -0
  16. data/lib/reapal/api/user/bank_card_add_sms_again.rb +62 -0
  17. data/lib/reapal/api/user/bank_card_add_sms_confirm.rb +61 -0
  18. data/lib/reapal/api/user/bind_card_query.rb +67 -0
  19. data/lib/reapal/api/user/contract_query.rb +18 -0
  20. data/lib/reapal/api/user/mobile_query.rb +56 -0
  21. data/lib/reapal/api/{trust → user}/onekey_batch_contract.rb +8 -26
  22. data/lib/reapal/api/user/onekey_contract.rb +61 -0
  23. data/lib/reapal/api/user/undo_bind_bank_card.rb +60 -0
  24. data/lib/reapal/client.rb +6 -0
  25. data/lib/reapal/form/business_auth_form.rb +61 -0
  26. data/lib/reapal/form/find_trade_password_form.rb +48 -0
  27. data/lib/reapal/form/mobile_modify_form.rb +50 -0
  28. data/lib/reapal/form/signle_tender_transfer_form.rb +72 -0
  29. data/lib/reapal/form/tender_invest_form.rb +62 -0
  30. data/lib/reapal/form/tender_refund_form.rb +84 -0
  31. data/lib/reapal/form/withdraw_apply_form.rb +54 -0
  32. data/lib/reapal/http/communicate.rb +45 -20
  33. data/lib/reapal/http/response.rb +21 -0
  34. data/lib/reapal/utils.rb +16 -0
  35. data/lib/reapal/version.rb +1 -1
  36. metadata +29 -9
  37. data/lib/reapal/api/trust/balance_query.rb +0 -58
  38. data/lib/reapal/api/trust/contract_query.rb +0 -35
  39. data/lib/reapal/api/trust/find_trade_password.rb +0 -41
  40. data/lib/reapal/api/trust/mobile_modify.rb +0 -42
  41. data/lib/reapal/api/trust/onekey_contract.rb +0 -77
  42. data/lib/reapal/api/trust/withdraw_apply.rb +0 -44
@@ -0,0 +1,62 @@
1
+ # coding: utf-8
2
+
3
+ module Reapal
4
+ module Api
5
+ module Form
6
+ module TenderInvestForm
7
+
8
+ # 3.2 投标(Form)(PC端)
9
+ #
10
+ # @param order_no [ String ] 投标订单号
11
+ # @param tender_no [ String ] 投标的标号
12
+ # @param amount [ BigDecimal ] 金额
13
+ # @param coupon_amt [ BigDecimal ] 红包/抵用券
14
+ # @param busway [ String ] 设备通道 00:PC端;01:手机端;02:Pad端;03:其它
15
+ # @param return_url [ String ] 回调 URL
16
+ # @param notify_url [ String ] 通知 URL
17
+ # @param remark [ String ] 备注
18
+ #
19
+ # @return [ Hash ] 结果集
20
+ # * form_method [ Hash ]
21
+ # * url [ String ]
22
+ # * method [ String ]
23
+ # * form_data [ Hash ]
24
+ # * :merchant_id
25
+ # * :encryptkey
26
+ # * :data
27
+ #
28
+ def find_trade_password(order_no, tender_no, amount, coupon_amt, busway='01', return_url, notify_url, remark)
29
+ service = 'reapal.trust.tenderInvest'
30
+ post_path = '/reagw/tender/rest.htm'
31
+
32
+ params = {
33
+ order_no: contracts,
34
+ tender_no: tender_no,
35
+ amount: amount,
36
+ coupon_amt: coupon_amt,
37
+ busway: busway,
38
+ return_url: return_url,
39
+ notify_url: notify_url,
40
+ remark: remark,
41
+ applyTime: Time.now.strftime('%Y-%m-%d %H:%M:%S'),
42
+ }
43
+
44
+ request = Http.get_body(service, params, @config)
45
+
46
+ {
47
+ form_method: {
48
+ :url => config[:server_url] + post_path,
49
+ :method => :post,
50
+ },
51
+ form_data: {
52
+ :merchant_id => request[:merchant_id],
53
+ :encryptkey => request[:encryptkey],
54
+ :data => request[:data]
55
+ },
56
+ }
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,84 @@
1
+ # coding: utf-8
2
+
3
+ module Reapal
4
+ module Api
5
+ module Form
6
+ module TenderRefund
7
+
8
+ # 3.9 还款(Form)
9
+ #
10
+ # @param flow_id [String] 还款订单号
11
+ # @param tender_no [String] 标的号
12
+ # @param debit_contrats [String] 借款方协议号
13
+ # @param debit_detail [JSON] 借款方还款
14
+ # *seria_no [String] 还款流水号
15
+ # *payee_contracts [String] 收款方协议号
16
+ # *amount [String] 金额
17
+ # *remark [String] 备注
18
+ # @param invest_detail [JSON] 投资方分账
19
+ # *seria_no [String] 还款分账流水号
20
+ # *invest_contracts [String] 投资方协议号
21
+ # *payee_contracts [String] 收款方协议号
22
+ # *amount [String] 金额
23
+ # *remark [String] 备注
24
+ # @param busway [String] '00':PC端;'01':手机端(默认);'02':Pad端;'03':其它
25
+ # @param return_url [String] 回调 url
26
+ # @param notify_url [String] 通知 url
27
+
28
+
29
+ # @return [ Hash ] 结果集
30
+ # * form_method
31
+ # * url
32
+ # * method
33
+ # * form_data
34
+ # * :merchant_id
35
+ # * :encryptkeyÍ
36
+ # * :data
37
+ #
38
+ def tender_refund_form(flow_id, tender_no, debit_contrats, debit_detail,
39
+ invest_details, busway='01', return_url, notify_url )
40
+
41
+ service = 'reapal.trust.tenderRefund'
42
+ post_path = '/reagw/tender/rest.htm'
43
+
44
+ debit_details[:serialNo] = debit_detail[:seria_no]
45
+ debit_details[:payeeContracts] = debit_detail[:payee_contracts]
46
+ debit_details[:amount] = debit_detail[:amount]
47
+ debit_details[:remark] = debit_detail[:remark]
48
+
49
+ invest_details[:seriaNo] = invest_detail[:seria_no]
50
+ invest_details[:investContracts] = invest_detail[:invest_contracts]
51
+ invest_details[:payeeContracts] = invest_detail[:payee_contracts]
52
+ invest_details[:amount] = invest_detail[:amount]
53
+ invest_details[:mark] = invest_detail[:mark]
54
+
55
+
56
+ params = {
57
+ orderNo: flow_id,
58
+ tenderNo: tender_no,
59
+ debitContracts: debit_contrats,
60
+ debitDetails: debit_details,
61
+ investDetails: invest_details,
62
+ busway: busway,
63
+ returnUrl: return_url,
64
+ notifyUrl: notify_url,
65
+ applyTime: Time.now.strftime('%Y-%m-%d %H:%M:%S')
66
+ }
67
+
68
+ request = Http.get_body(service, params, @config)
69
+
70
+ {
71
+ form_method: {
72
+ :url => config[:server_url] + post_path,
73
+ :method => :post,
74
+ },
75
+ form_data: request
76
+
77
+ }
78
+
79
+ end
80
+
81
+ end #TenderRefund
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,54 @@
1
+ # coding: utf-8
2
+
3
+ module Reapal
4
+ module Form
5
+ module WithdrawApplyForm
6
+
7
+ # 2.7 提现申请
8
+ #
9
+ # @param contract [String] 用户协议
10
+ # @param flow_id [String] 订单号
11
+ # @param money [Number] 提现金额,2位小数
12
+ # @param charge [Number] 手续费,2位小数
13
+ # @param return_url [String] 回调 url
14
+ # @param notify_url [String] 通知 url
15
+ # @param buyway [String] 设备通道,默认手机端。00:PC端;01:手机端;02:Pad端;03:其它
16
+ #
17
+ # @return [ Hash ] 结果集
18
+ # * :form_method
19
+ # * :method
20
+ # * :url
21
+ # * :form_data
22
+ # * :merchant_id
23
+ # * :encryptkey
24
+ # * :data
25
+ #
26
+ def withdraw_apply_form(contract, flow_id, money, charge, return_url, notify_url, busway='01')
27
+ service = 'reapal.trust.withdrawApply'
28
+ post_path = '/reagw/service/withdraw.htm'
29
+
30
+ params = {
31
+ orderNo: flow_id,
32
+ contracts: contract,
33
+ amount: money,
34
+ charge: charge,
35
+ busway: busway,
36
+ returnUrl: return_url,
37
+ notifyUrl: notify_url,
38
+ applyTime: Time.now.strftime('%Y-%m-%d %H:%M:%S'),
39
+ }
40
+
41
+ form_data = Http.get_body(service, params, @config)
42
+
43
+ {
44
+ form_method: {
45
+ method: :post,
46
+ url: config[:server_url] + post_path,
47
+ },
48
+ form_data: form_data
49
+ }
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -5,20 +5,20 @@ module Reapal
5
5
  SIGN_TYPE = '0' # 0 表示 md5
6
6
  VERSION = '1.0' # 版本号
7
7
 
8
- def self.post(service, params, config, post_path)
9
- post_body = get_body(service, params, config)
8
+ def self.post(service, params, config, post_path, version=VERSION)
9
+ post_body = get_body(service, params, config, version)
10
10
  uri = URI(config[:server_url] + post_path)
11
11
 
12
12
  Reapal.logger.info "[#{service}] 请求内容为:\n#{params}\n"
13
13
  Reapal.logger.info "[#{service}(#{uri})] 最终发送内容为:\n#{post_body}\n"
14
14
 
15
- result = {}
15
+ result = nil
16
16
 
17
17
  begin
18
18
  response = Net::HTTP.post_form(uri, post_body)
19
19
  Reapal.logger.info "[#{service}] 返回的报文为:\n#{response.body}"
20
20
 
21
- if response.is_a?(Net::HTTPSuccess) # 返回 200 才处理
21
+ if response.is_a?(Net::HTTPSuccess)
22
22
  response_raw_body = unpack_body(response.body, config)
23
23
  result = Reapal::Http::Response.new(service: service,
24
24
  flow_id: params[:orderNo],
@@ -27,18 +27,17 @@ module Reapal
27
27
  data: response_raw_body[:resData],
28
28
  data_valid: response_raw_body[:data_valid])
29
29
  else
30
- # 200 请求,结果为 Fail
30
+ # 不成功的不解密, 500, 300, 400
31
31
  result = Reapal::Http::Response.new(service: service,
32
32
  flow_id: params[:orderNo],
33
33
  http_response: response,
34
34
  raw_body: response.body,
35
35
  data_valid: true)
36
36
  end
37
- rescue
38
- # 请求超时等网络原因,结果为 pending,等待下次查询
37
+ rescue Net::ReadTimeout
39
38
  result = Reapal::Http::Response.new(service: service,
40
39
  flow_id: params[:orderNo],
41
- http_response: response,
40
+ http_response: nil,
42
41
  data_valid: true)
43
42
  end
44
43
 
@@ -48,9 +47,9 @@ module Reapal
48
47
  end
49
48
 
50
49
  # 表单的 body
51
- def self.get_body(service, params, config)
50
+ def self.get_body(service, params, config, version=VERSION)
52
51
  data = {
53
- version: VERSION,
52
+ version: version,
54
53
  service: service,
55
54
  partner: config[:partner_id],
56
55
  sign: Sign::MD5.sign(params.to_json, config[:md5_key]),
@@ -66,24 +65,27 @@ module Reapal
66
65
  }
67
66
  end
68
67
 
69
- private
70
-
71
- def self.unpack_body(body_string, config)
72
- # 返回是 json 字符串格式
73
- body = Utils.symbolize_keys(JSON.parse(body_string))
68
+ def self.decode_data(encryptkey, data, config)
69
+ if encryptkey.nil? || data.nil? || encryptkey.empty? || data.empty?
70
+ return {
71
+ resData: {
72
+ errorCode: 'error_decode_params',
73
+ errorMsg: '解密参数不正确'
74
+ },
75
+ data_valid: true,
76
+ }
77
+ end
74
78
 
75
79
  # 1. 拿到用来加密的16位随机字符串
76
- random_key = Encrypt::RSA.decrypt(body[:encryptkey],
77
- config[:private_key])
80
+ random_key = Encrypt::RSA.decrypt(encryptkey, config[:private_key])
78
81
 
79
82
  # 2. 用16位随机字符串解密返回的数据
80
- data_string = Encrypt::AES.decrypt(body[:data], random_key)
83
+ data_string = Encrypt::AES.decrypt(data, random_key)
81
84
  data = parse_data_string(data_string)
82
85
  data[:resData] = Utils.symbolize_keys(JSON.parse(data[:resData]))
83
86
 
84
87
  # 3. 验签,错误时候 sign 是没有值的
85
- if (data[:sign].nil? && data[:resData][:errorCode]) \
86
- || (data[:sign] && Sign::MD5.verify?(data[:resData].to_json, config[:md5_key], data[:sign]))
88
+ if data[:resData][:errorCode] || (data[:sign] && Sign::MD5.verify?(data[:resData].to_json, config[:md5_key], data[:sign]))
87
89
  data[:data_valid] = true
88
90
  else
89
91
  data[:data_valid] = false
@@ -92,6 +94,29 @@ module Reapal
92
94
  data
93
95
  end
94
96
 
97
+ private
98
+
99
+ def self.unpack_body(body_string, config)
100
+ begin
101
+ # 返回是 json 字符串格式
102
+ body = Utils.symbolize_keys(JSON.parse(body_string))
103
+ rescue
104
+ body = {}
105
+ end
106
+
107
+ if body[:encryptkey].nil? || body[:data].nil?
108
+ return {
109
+ resData: {
110
+ errorCode: 'error_decode_params',
111
+ errorMsg: '解密参数不正确'
112
+ },
113
+ data_valid: true,
114
+ }
115
+ end
116
+
117
+ self.decode_data(body[:encryptkey], body[:data], config)
118
+ end
119
+
95
120
  # 正确的返回字符串例子:
96
121
  # 'version=1.0&service=reapal.trust.onekeyContract&signType=0&sign=cdab41a05d595d6a5f5a818af2b39398&resData={"contracts":"RB1711167FYG9U29","userName":"王五","userIdentity":"330602198711160034","userMobile":"18357101332","orderNo":"5a0d488fe0c016049a000001","resultCode":"0007","processTime":"2017-11-16 16:13:04"}'
97
122
  #
@@ -13,6 +13,13 @@ module Reapal
13
13
  params.each do |key, value|
14
14
  instance_variable_set("@#{key}", value)
15
15
  end
16
+
17
+ self.data = {} if self.data.nil? # 默认一定要有
18
+
19
+ unless self.data_valid
20
+ self.data[:errorCode] = 'sign_valid_fail'
21
+ self.data[:errorMsg] = '数据签名错误'
22
+ end
16
23
  end
17
24
 
18
25
  def [] key
@@ -28,6 +35,20 @@ module Reapal
28
35
  arr.join("\n")
29
36
  end
30
37
 
38
+ def http_success?
39
+ http_response && http_response.is_a?(Net::HTTPSuccess)
40
+ end
41
+
42
+ def http_fail?
43
+ # 而 400 错误一般都是地址不存在或者没有权限,都当成错误处理
44
+ http_response && http_response.code.to_s == '404'
45
+ end
46
+
47
+ def http_pending?
48
+ # nil 的时候是超时,非 404 的其他错误都是 pending
49
+ http_response.nil? || (!http_success? && !http_fail?)
50
+ end
51
+
31
52
  end
32
53
 
33
54
  end
@@ -43,5 +43,21 @@ module Reapal
43
43
  ((0..9).to_a + ('a'..'z').to_a + ('A'..'Z').to_a).sample(size).join()
44
44
  end
45
45
 
46
+ # api 通用返回数据结构
47
+ # @param request_params [Object] 请求参数
48
+ # @param response [Object] 响应对象
49
+ # @return [Object]
50
+ def self.api_result(request_params, response)
51
+ {
52
+ result: 'P', # 默认
53
+ request_params: request_params,
54
+ response: response,
55
+ flow_id: response.nil? ? nil : response.flow_id,
56
+ error_code: response.nil? ? nil : response.data[:errorCode],
57
+ error_msg: response.nil? ? nil : response.data[:errorMsg],
58
+ data: response.nil? ? nil : response.data,
59
+ }
60
+ end
61
+
46
62
  end
47
63
  end
@@ -1,3 +1,3 @@
1
1
  module Reapal
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reapal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - tony
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-23 00:00:00.000000000 Z
11
+ date: 2017-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -124,17 +124,37 @@ files:
124
124
  - bin/console
125
125
  - bin/setup
126
126
  - lib/reapal.rb
127
- - lib/reapal/api/trust/balance_query.rb
128
- - lib/reapal/api/trust/contract_query.rb
129
- - lib/reapal/api/trust/find_trade_password.rb
130
- - lib/reapal/api/trust/mobile_modify.rb
131
- - lib/reapal/api/trust/onekey_batch_contract.rb
132
- - lib/reapal/api/trust/onekey_contract.rb
133
- - lib/reapal/api/trust/withdraw_apply.rb
127
+ - lib/reapal/api/asset/tender_all_cancel.rb
128
+ - lib/reapal/api/asset/tender_apply.rb
129
+ - lib/reapal/api/asset/tender_auth_cancel.rb
130
+ - lib/reapal/api/asset/tender_auth_query.rb
131
+ - lib/reapal/api/asset/tender_finish.rb
132
+ - lib/reapal/api/asset/tender_repayment_complete.rb
133
+ - lib/reapal/api/asset/tender_repayment_project.rb
134
+ - lib/reapal/api/error_codes.rb
135
+ - lib/reapal/api/money/.keep
136
+ - lib/reapal/api/order/.keep
137
+ - lib/reapal/api/user/balance_query.rb
138
+ - lib/reapal/api/user/bank_card_add_sms.rb
139
+ - lib/reapal/api/user/bank_card_add_sms_again.rb
140
+ - lib/reapal/api/user/bank_card_add_sms_confirm.rb
141
+ - lib/reapal/api/user/bind_card_query.rb
142
+ - lib/reapal/api/user/contract_query.rb
143
+ - lib/reapal/api/user/mobile_query.rb
144
+ - lib/reapal/api/user/onekey_batch_contract.rb
145
+ - lib/reapal/api/user/onekey_contract.rb
146
+ - lib/reapal/api/user/undo_bind_bank_card.rb
134
147
  - lib/reapal/client.rb
135
148
  - lib/reapal/encrypt/aes.rb
136
149
  - lib/reapal/encrypt/rsa.rb
137
150
  - lib/reapal/extensions.rb
151
+ - lib/reapal/form/business_auth_form.rb
152
+ - lib/reapal/form/find_trade_password_form.rb
153
+ - lib/reapal/form/mobile_modify_form.rb
154
+ - lib/reapal/form/signle_tender_transfer_form.rb
155
+ - lib/reapal/form/tender_invest_form.rb
156
+ - lib/reapal/form/tender_refund_form.rb
157
+ - lib/reapal/form/withdraw_apply_form.rb
138
158
  - lib/reapal/http/communicate.rb
139
159
  - lib/reapal/http/response.rb
140
160
  - lib/reapal/railtie.rb