jyt_pay 0.1.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.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +72 -0
  9. data/Rakefile +16 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/doc/JytPay/Api/AuthCard.html +375 -0
  13. data/doc/JytPay/Api/QueryBalance.html +299 -0
  14. data/doc/JytPay/Api/QueryOrder.html +372 -0
  15. data/doc/JytPay/Api/QuickDraw.html +433 -0
  16. data/doc/JytPay/Api/QuickPay.html +435 -0
  17. data/doc/JytPay/Api.html +117 -0
  18. data/doc/JytPay/Client.html +323 -0
  19. data/doc/JytPay/Encrypt/Des.html +258 -0
  20. data/doc/JytPay/Encrypt/Rsa.html +232 -0
  21. data/doc/JytPay/Encrypt.html +127 -0
  22. data/doc/JytPay/Http/RetCode.html +391 -0
  23. data/doc/JytPay/Http.html +242 -0
  24. data/doc/JytPay/Sign/Rsa.html +178 -0
  25. data/doc/JytPay/Sign.html +115 -0
  26. data/doc/JytPay/Utils.html +358 -0
  27. data/doc/JytPay/Xml/MyPrecious.html +220 -0
  28. data/doc/JytPay/Xml.html +210 -0
  29. data/doc/JytPay.html +140 -0
  30. data/doc/_index.html +317 -0
  31. data/doc/class_list.html +51 -0
  32. data/doc/css/common.css +1 -0
  33. data/doc/css/full_list.css +58 -0
  34. data/doc/css/style.css +492 -0
  35. data/doc/file.README.html +150 -0
  36. data/doc/file_list.html +56 -0
  37. data/doc/frames.html +17 -0
  38. data/doc/index.html +150 -0
  39. data/doc/js/app.js +248 -0
  40. data/doc/js/full_list.js +216 -0
  41. data/doc/js/jquery.js +4 -0
  42. data/doc/method_list.html +203 -0
  43. data/doc/top-level-namespace.html +110 -0
  44. data/jyt_pay.gemspec +34 -0
  45. data/lib/jyt_pay/api/auth_card.rb +60 -0
  46. data/lib/jyt_pay/api/query_balance.rb +50 -0
  47. data/lib/jyt_pay/api/query_order.rb +71 -0
  48. data/lib/jyt_pay/api/quick_draw.rb +75 -0
  49. data/lib/jyt_pay/api/quick_pay.rb +76 -0
  50. data/lib/jyt_pay/client.rb +37 -0
  51. data/lib/jyt_pay/encrypt/des.rb +30 -0
  52. data/lib/jyt_pay/encrypt/encrypt.rb +7 -0
  53. data/lib/jyt_pay/encrypt/rsa.rb +20 -0
  54. data/lib/jyt_pay/http/communicate.rb +77 -0
  55. data/lib/jyt_pay/http/ret_code.rb +60 -0
  56. data/lib/jyt_pay/sign/rsa.rb +14 -0
  57. data/lib/jyt_pay/utils.rb +42 -0
  58. data/lib/jyt_pay/version.rb +3 -0
  59. data/lib/jyt_pay/xml/xml.rb +74 -0
  60. data/lib/jyt_pay.rb +32 -0
  61. metadata +166 -0
@@ -0,0 +1,60 @@
1
+ # coding: utf-8
2
+ # 认证银行卡
3
+ module JytPay
4
+ module Api
5
+ module AuthCard
6
+
7
+ AUTH_CARD_TRAN_CODE = "TR4003"
8
+
9
+ # 四要素认证
10
+ #
11
+ # @param flow_id [ String ] 订单号
12
+ # @param card_id [ String ] 银行卡号
13
+ # @param true_name [ String ] 真实姓名
14
+ # @param identity_id [ String ] 身份证
15
+ # @param phone [ String ] 银行卡预留手机号
16
+ #
17
+ # @return [ Hash ] 结果集
18
+ # * :result [String] 是否成功,`F`, `S`
19
+ # * :bank_name [String] 成功后会返回该卡在 jyt 系统内的中文名
20
+ # * :msg [String] 结果说明
21
+ # * :ret_code [String] 结果 CODE
22
+ # * :flow_id [String] 订单号
23
+ # * :request_body [String] 请求报文
24
+ # * :response_body [String] 响应报文
25
+ #
26
+ def auth_card(flow_id, card_id, true_name, identity_id, phone)
27
+
28
+ params = {
29
+ bank_card_no: card_id,
30
+ id_num: identity_id,
31
+ id_name: true_name,
32
+ terminal_type: '01',
33
+ bank_card_type: 'D',
34
+ phone_no: phone,
35
+ }
36
+
37
+ xml_str = JytPay::Xml.generate(@merchant_id, AUTH_CARD_TRAN_CODE,
38
+ params, flow_id)
39
+
40
+ response = Http.post(@merchant_id, @uris[:auth],
41
+ AUTH_CARD_TRAN_CODE, xml_str,
42
+ @rsa_private_key, @rsa_jyt_public_key)
43
+
44
+ res = {
45
+ result: 'S0000000' == response[:head][:resp_code] ? 'S' : 'F',
46
+ bank_name: response[:body][:bank_name],
47
+ msg: response[:head][:resp_desc],
48
+ ret_code: response[:head][:resp_code],
49
+ flow_id: flow_id,
50
+ vendor_order_id: nil, # jyt 不会返回他们的订单号
51
+ request_body: xml_str,
52
+ response_body: response[:xml_str],
53
+ }
54
+
55
+ res
56
+ end
57
+
58
+ end # module QuickPay
59
+ end # module Api
60
+ end # module
@@ -0,0 +1,50 @@
1
+ # coding: utf-8
2
+ # 商户余额查询
3
+ module JytPay
4
+ module Api
5
+ module QueryBalance
6
+
7
+ QUERY_BALANCE_TRAN_CODE = "TC2020"
8
+
9
+ # 查询商户当前余额
10
+ #
11
+ # @param flow_id [ String ] 订单号
12
+ #
13
+ # @return [ Hash ] 结果集
14
+ # * :result [String] 是否成功,`F`, `S`, `P`
15
+ # * :msg [String] 结果说明
16
+ # * :balance [Float] 余额
17
+ #
18
+ def query_balance(flow_id)
19
+ params = {
20
+ mer_viral_acct: @mer_viral_acct,
21
+ }
22
+
23
+ xml_str = JytPay::Xml.generate(@merchant_id, QUERY_BALANCE_TRAN_CODE,
24
+ params, flow_id)
25
+
26
+ response = Http.post(@merchant_id, @uris[:query_balance],
27
+ QUERY_BALANCE_TRAN_CODE, xml_str,
28
+ @rsa_private_key, @rsa_jyt_public_key)
29
+
30
+ res = {
31
+ result: 'F',
32
+ msg: response[:head][:resp_desc],
33
+ balance: 0,
34
+ }
35
+
36
+ case response[:head][:resp_code]
37
+ when 'S0000000'
38
+ res = {
39
+ result: 'S',
40
+ msg: response[:head][:resp_desc],
41
+ balance: response[:body][:balance].to_f,
42
+ }
43
+ end
44
+
45
+ res
46
+ end
47
+
48
+ end # module QueryBalance
49
+ end # module Api
50
+ end # module
@@ -0,0 +1,71 @@
1
+ # coding: utf-8
2
+ # 查询代付代收订单
3
+ module JytPay
4
+ module Api
5
+ module QueryOrder
6
+
7
+ QUERY_PAY_TRAN_CODE = "TC2001"
8
+ QUERY_DRAW_TRAN_CODE = "TC2002"
9
+
10
+ # 查询代付代收订单
11
+ #
12
+ # @param flow_id [ String ] 订单号
13
+ # @param ori_flow_id [ String ] 原业务订单号
14
+ # @param tran_type [ String ] 原业务类型:`:pay` or `:draw`
15
+ #
16
+ # @return [ Hash ] 结果集
17
+ # * :result [String] 原业务是否成功,`F`, `S`, `P`
18
+ # * :msg [String] 结果说明
19
+ # * :ret_code [String] 结果 CODE
20
+ # * :flow_id [String] 订单号
21
+ # * :request_body [String] 请求报文
22
+ # * :response_body [String] 响应报文
23
+ #
24
+ def query_order(flow_id, ori_flow_id, tran_type)
25
+ case tran_type.to_sym
26
+ when :pay
27
+ server_uri = @uris[:pay]
28
+ tran_code = QUERY_PAY_TRAN_CODE
29
+ when :draw
30
+ server_uri = @uris[:draw]
31
+ tran_code = QUERY_DRAW_TRAN_CODE
32
+ else
33
+ raise 'unknow query tran code'
34
+ end
35
+
36
+ params = {
37
+ ori_tran_flowid: ori_flow_id
38
+ }
39
+
40
+ xml_str = JytPay::Xml.generate(@merchant_id, tran_code,
41
+ params, flow_id)
42
+
43
+ response = Http.post(@merchant_id, server_uri,
44
+ tran_code, xml_str,
45
+ @rsa_private_key, @rsa_jyt_public_key)
46
+
47
+ res = {
48
+ result: 'P', # 默认 pending
49
+ msg: response[:body][:tran_resp_desc] || response[:head][:resp_desc],
50
+ ret_code: response[:body][:tran_resp_code] || response[:head][:resp_code],
51
+ flow_id: flow_id,
52
+ vendor_order_id: nil, # jyt 不会返回他们的订单号
53
+ request_body: xml_str,
54
+ response_body: response[:xml_str],
55
+ }
56
+
57
+ return res if response[:body][:tran_resp_code].nil?
58
+
59
+ res[:result] = case tran_type.to_sym
60
+ when :pay
61
+ Http::RetCode.pay_result(response[:body][:tran_resp_code], response[:body][:tran_state])
62
+ when :draw
63
+ Http::RetCode.draw_result(response[:body][:tran_resp_code], response[:body][:tran_state])
64
+ end
65
+
66
+ res
67
+ end
68
+
69
+ end # module QueryOrder
70
+ end # module Api
71
+ end # module
@@ -0,0 +1,75 @@
1
+ # coding: utf-8
2
+ # 单笔同步代付
3
+ module JytPay
4
+ module Api
5
+ module QuickDraw
6
+
7
+ QUICK_DRAW_TRAN_CODE = "TC1002"
8
+
9
+ # 单笔同步代付
10
+ #
11
+ # @param flow_id [ String ] 订单号
12
+ # @param money [ Float ] 代付金额(精确到2位)
13
+ # @param bank_business_name [ String ] 银行卡的中文名(在银行卡认证后有返回)
14
+ # @param card_id [ String ] 银行卡号
15
+ # @param true_name [ String ] 真实姓名
16
+ # @param identity_id [ String ] 身份证
17
+ # @param phone [ String ] 银行卡预留手机号
18
+ #
19
+ # @return [ Hash ] 结果集
20
+ # * :result [String] 是否成功,`F`, `S`, `P`
21
+ # * :msg [String] 结果说明
22
+ # * :ret_code [String] 结果 CODE
23
+ # * :flow_id [String] 订单号
24
+ # * :request_body [String] 请求报文
25
+ # * :response_body [String] 响应报文
26
+ #
27
+ def quick_draw(flow_id, money,
28
+ bank_business_name, card_id,
29
+ true_name, identity_id, province, city)
30
+
31
+ params = {
32
+ mer_viral_acct: "",
33
+ agrt_no: "",
34
+ bank_name: bank_business_name,
35
+ account_no: card_id,
36
+ account_name: true_name,
37
+ account_type: "00", #对私
38
+ branch_bank_province: province,
39
+ branch_bank_city: city,
40
+ branch_bank_name: "",
41
+ tran_amt: money, #两位小数
42
+ currency: "CNY",
43
+ bsn_code: "09400", #14900其他费用
44
+ cert_type: "01",
45
+ cert_no: identity_id,
46
+ mobile: "",
47
+ remark: "",
48
+ reserve: "",
49
+ }
50
+
51
+ xml_str = JytPay::Xml.generate(@merchant_id, QUICK_DRAW_TRAN_CODE,
52
+ params, flow_id)
53
+
54
+ response = Http.post(@merchant_id, @uris[:draw],
55
+ QUICK_DRAW_TRAN_CODE, xml_str,
56
+ @rsa_private_key, @rsa_jyt_public_key)
57
+
58
+ res = {
59
+ result: 'P', # 默认 pending
60
+ msg: response[:head][:resp_desc],
61
+ ret_code: response[:head][:resp_code],
62
+ flow_id: flow_id,
63
+ vendor_order_id: nil, # jyt 不会返回他们的订单号
64
+ request_body: xml_str,
65
+ response_body: response[:xml_str],
66
+ }
67
+
68
+ res[:result] = Http::RetCode.draw_result(response[:head][:resp_code], response[:body][:tran_state])
69
+
70
+ res
71
+ end
72
+
73
+ end # module QuickDraw
74
+ end # module Api
75
+ end # module
@@ -0,0 +1,76 @@
1
+ # coding: utf-8
2
+ # 单笔同步代扣
3
+ module JytPay
4
+ module Api
5
+ module QuickPay
6
+
7
+ QUICK_PAY_TRAN_CODE = "TC1001"
8
+
9
+ # 单笔同步代付
10
+ #
11
+ # @param flow_id [ String ] 订单号
12
+ # @param money [ Float ] 代付金额(精确到2位)
13
+ # @param bank_business_name [ String ] 银行卡的中文名(在银行卡认证后有返回)
14
+ # @param card_id [ String ] 银行卡号
15
+ # @param true_name [ String ] 真实姓名
16
+ # @param identity_id [ String ] 身份证
17
+ # @param phone [ String ] 银行卡预留手机号
18
+ #
19
+ # @return [ Hash ] 结果集
20
+ # * :result [String] 是否成功,`F`, `S`, `P`
21
+ # * :msg [String] 结果说明
22
+ # * :ret_code [String] 结果 CODE
23
+ # * :flow_id [String] 订单号
24
+ # * :request_body [String] 请求报文
25
+ # * :response_body [String] 响应报文
26
+ #
27
+ def quick_pay(flow_id, money,
28
+ bank_business_name, card_id,
29
+ true_name, identity_id, phone)
30
+
31
+ params = {
32
+ mer_viral_acct: "",
33
+ agrt_no: "",
34
+ bank_name: bank_business_name,
35
+ account_no: card_id,
36
+ account_name: true_name,
37
+ account_type: "00", #对私
38
+ branch_bank_province: "",
39
+ branch_bank_city: "",
40
+ branch_bank_name: "",
41
+ tran_amt: money, #两位小数
42
+ currency: "CNY",
43
+ bsn_code: "11203", #14900其他费用
44
+ cert_type: "01",
45
+ cert_no: identity_id,
46
+ mobile: phone,
47
+ remark: "",
48
+ reserve: "",
49
+ }
50
+
51
+ xml_str = JytPay::Xml.generate(@merchant_id, QUICK_PAY_TRAN_CODE,
52
+ params, flow_id)
53
+
54
+ response = Http.post(@merchant_id, @uris[:pay],
55
+ QUICK_PAY_TRAN_CODE, xml_str,
56
+ @rsa_private_key, @rsa_jyt_public_key)
57
+
58
+ res = {
59
+ result: 'P', # 默认 pending
60
+ msg: response[:head][:resp_desc],
61
+ ret_code: response[:head][:resp_code],
62
+ flow_id: flow_id,
63
+ vendor_order_id: nil, # jyt 不会返回他们的订单号
64
+ request_body: xml_str,
65
+ response_body: response[:xml_str],
66
+ }
67
+
68
+ res[:result] = Http::RetCode.pay_result(response[:head][:resp_code],
69
+ response[:body][:tran_state])
70
+
71
+ res
72
+ end
73
+
74
+ end # module QuickPay
75
+ end # module Api
76
+ end # module
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+
3
+ # 客户端
4
+
5
+ module JytPay
6
+ class Client
7
+
8
+ # 代付代扣的 api
9
+ include JytPay::Api::QuickPay
10
+ include JytPay::Api::QuickDraw
11
+ include JytPay::Api::QueryOrder
12
+ # 通用 api
13
+ include JytPay::Api::QueryBalance
14
+ # 认证银行卡 api
15
+ include JytPay::Api::AuthCard
16
+
17
+ def initialize(options_arg)
18
+ options = Utils.symbolize_keys(options_arg)
19
+
20
+ @uris = {
21
+ pay: URI(options[:pay_url]),
22
+ draw: URI(options[:draw_url]),
23
+ auth: URI(options[:auth_url]),
24
+ query_balance: URI(options[:query_balance_url]),
25
+ }
26
+
27
+ @merchant_id = options[:merchant_id]
28
+ @mer_viral_acct = options[:mer_viral_acct]
29
+ @private_key = options[:private_key]
30
+ @jyt_public_key = options[:jyt_public_key]
31
+
32
+ @rsa_private_key = OpenSSL::PKey::RSA.new(@private_key)
33
+ @rsa_jyt_public_key = OpenSSL::PKey::RSA.new(@jyt_public_key)
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+
3
+ module JytPay
4
+ module Encrypt
5
+ module Des
6
+
7
+ ALG = 'DES-CBC'
8
+
9
+ def self.encrypt(str, key_arg = Encrypt::DES_KEY)
10
+ des = OpenSSL::Cipher::Cipher.new(ALG)
11
+ des.key = key_arg
12
+ des.iv = key_arg
13
+ des.encrypt
14
+ cipher = des.update(str) + des.final
15
+ cipher.unpack('H*')[0]
16
+ end
17
+
18
+ def self.decrypt(xml_enc, key_str)
19
+ xml_str = [xml_enc].pack 'H*'
20
+
21
+ des = OpenSSL::Cipher::Cipher.new(ALG)
22
+ des.decrypt
23
+ des.key = key_str
24
+ des.iv = key_str
25
+ des.update(xml_str) + des.final
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ # coding: utf-8
2
+
3
+ module JytPay
4
+ module Encrypt
5
+ DES_KEY = "12345678"
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ # coding: utf-8
2
+
3
+ module JytPay
4
+ module Encrypt
5
+ module Rsa
6
+
7
+ def self.encrypt(rsa_public_key, key_arg = Encrypt::DES_KEY)
8
+ data = [key_arg].pack 'H*'
9
+ kenc = rsa_public_key.public_encrypt key_arg
10
+ kenc.unpack('H*')[0]
11
+ end
12
+
13
+ def self.decrypt(key_enc, rsa_private_key)
14
+ ec = [key_enc].pack 'H*'
15
+ rsa_private_key.private_decrypt(ec)
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,77 @@
1
+ # coding: utf-8
2
+ module JytPay
3
+ module Http
4
+
5
+ def self.post(merchant_id, server_uri,
6
+ tran_code, xml_str,
7
+ rsa_private_key, rsa_jyt_public_key)
8
+ body = {
9
+ merchant_id: merchant_id,
10
+ xml_enc: Encrypt::Des.encrypt(xml_str),
11
+ key_enc: Encrypt::Rsa.encrypt(rsa_jyt_public_key),
12
+ sign: Sign::Rsa.sign(rsa_private_key, xml_str)
13
+ }
14
+
15
+ puts "\n[#{tran_code}][#{server_uri}] 发送原始 xml 为:\n#{xml_str}\n"
16
+
17
+ result = {}
18
+
19
+ begin
20
+ response = Net::HTTP.post_form(server_uri, body)
21
+
22
+ if response.is_a?(Net::HTTPSuccess) # 返回 200 才处理
23
+ result = unpack_body(response.body, rsa_private_key)
24
+ else
25
+ # 非 200 请求
26
+ result = Http::RetCode.general_error_response(response.code)
27
+ end
28
+ rescue Net::ReadTimeout # 请求超时
29
+ result = Http::RetCode.general_error_response(0)
30
+ end
31
+
32
+ puts "\n[#{tran_code}][#{server_uri}] 返回结果为:\n#{result}\n\n"
33
+
34
+ result
35
+ end
36
+
37
+ private
38
+
39
+ def self.unpack_body(response_body, rsa_private_key)
40
+ # 把返回的字符串,按键值对组成 hash
41
+ response_result = {}
42
+ response_body.split('&').each{ |key_value_str|
43
+ k, v = key_value_str.split('=')
44
+ response_result[k.to_sym] = v
45
+ }
46
+
47
+ # 解密
48
+ key_str = Encrypt::Rsa.decrypt(response_result[:key_enc], rsa_private_key)
49
+ xml_str = Encrypt::Des.decrypt(response_result[:xml_enc], key_str)
50
+
51
+ # TODO(tony): 好像没有验签啊?
52
+ doc = ::REXML::Document.new xml_str
53
+
54
+ result = {
55
+ head: {},
56
+ body: {},
57
+ xml_str: xml_str,
58
+ }
59
+
60
+ root = doc.root
61
+ if root.elements["head"]
62
+ root.elements["head"].elements.each { |element|
63
+ result[:head][element.name.to_sym] = element.text
64
+ }
65
+ end
66
+
67
+ if root.elements["body"]
68
+ root.elements["body"].elements.each { |element|
69
+ result[:body][element.name.to_sym] = element.text
70
+ }
71
+ end
72
+
73
+ result
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,60 @@
1
+ # coding: utf-8
2
+ module JytPay
3
+ module Http
4
+
5
+ module RetCode
6
+ # 默认的返回值
7
+ def self.general_error_response(http_status)
8
+ result = {
9
+ head: {
10
+ resp_code: 'S0000000',
11
+ resp_desc: "网络错误( http 状态码:#{http_status})"
12
+ },
13
+ body: {
14
+ tran_state: '03',
15
+ },
16
+ xml_str: '',
17
+ }
18
+ end
19
+
20
+ # 支付的结果
21
+ def self.pay_result(resp_code, tran_state)
22
+ case resp_code
23
+ when 'S0000000'
24
+ case tran_state
25
+ when '01'
26
+ return 'S'
27
+ when '03'
28
+ return 'F'
29
+ else
30
+ return 'P'
31
+ end
32
+ when 'E0000000' # jyt 处理中
33
+ return 'P'
34
+ else
35
+ return 'F'
36
+ end
37
+ end # self.pay_result
38
+
39
+ # 提现的结果(目前和支付一样逻辑,但是不知道以后会不会改)
40
+ def self.draw_result(resp_code, tran_state)
41
+ case resp_code
42
+ when 'S0000000'
43
+ case tran_state
44
+ when '01'
45
+ return 'S'
46
+ when '03'
47
+ return 'F'
48
+ else
49
+ return 'P'
50
+ end
51
+ when 'E0000000' # jyt 处理中
52
+ return 'P'
53
+ else
54
+ return 'F'
55
+ end
56
+ end # self.pay_result
57
+
58
+ end
59
+ end # Http
60
+ end # JytPay
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+ module JytPay
3
+ module Sign
4
+ module Rsa
5
+
6
+ def self.sign(rsa_private_key, str)
7
+ digest = OpenSSL::Digest::SHA1.new
8
+ signature_orig = rsa_private_key.sign(digest, str)
9
+ signature_orig.unpack('H*')[0]
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+
3
+ # 通用工具类方法
4
+
5
+ module JytPay
6
+ module Utils
7
+
8
+ # 把 hash 中的 key,都转化为 symbol 类型
9
+ #
10
+ # @param hash [Hash] 需要更改的 hash
11
+ # @return [Hash] 更改后的 hash
12
+ def self.symbolize_keys(hash)
13
+ new_hash = {}
14
+ hash.each do |key, value|
15
+ new_hash[(key.to_sym rescue key) || key] = value
16
+ end
17
+ new_hash
18
+ end
19
+
20
+ # 通过时间,返回唯一一个24位flow id(支持分布)
21
+ # 同一秒,同一台机器,同一个进程,最多可以产生 16777214 个不一样的订单号
22
+ #
23
+ # @example
24
+ # JytPay::Utils.gen_flow_id
25
+ #
26
+ # @param [ Integer ] 时间(默认是 now)
27
+ #
28
+ # @return [ String ] flow id
29
+ #
30
+ def self.gen_flow_id(time=Time.now)
31
+ machine_id = Digest::MD5.digest(::Mac.addr).unpack("N")[0]
32
+ process_id = Process.pid % 0xFFFF
33
+
34
+ @counter ||= 0
35
+ @counter += 1
36
+ count = (@counter) % 0xFFFFFF
37
+
38
+ return [ time.to_i, machine_id, process_id, count << 8 ].pack("N NX lXX NX").unpack("H*")[0].force_encoding('UTF-8')
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module JytPay
2
+ VERSION = "0.1.0"
3
+ end