reapal 0.2.1 → 0.2.2

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.
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