allinpay 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 19b0dd054a0b1c2d9649eee3914ce54e9aa5059f
4
- data.tar.gz: f0bbb5215e09e201dd1c118264edaa9dd0c50c9a
3
+ metadata.gz: a084b8c15c36cbc55fff5ed3918ec51f191cba20
4
+ data.tar.gz: bb451c938351c648250923c878570b0aad9d567b
5
5
  SHA512:
6
- metadata.gz: 9e31f2c609d3eea074782c21eda2abd9f158a118b1827797d4df3953bacdc9eb137f2b124e640c9eedb0cab1c27aae853445c79cf02c48488caf4b7893e7f82e
7
- data.tar.gz: c08c10e3d229171b96e5c86a02de665c372cbaa2d1b737b787c6ccea4a96ae32839425e20749a6adb102d1903a31495d2fe30165a2370e91aa0d6b2b77048821
6
+ metadata.gz: e7b87b109da3b588b57c30761664d9c989e189fcf6b3ade61117c315cf78b901d57c8de52aab368a1583c04299a334d0e510e2d6d948895060665d9b02428a49
7
+ data.tar.gz: 3647485074150a7d673c3f6f4aa951d0e2957dc4fe4d6d41ef8f89d7a2448cfcbc4c9ee0dbd187c14f389da3f9efdec84df1343a3452f7af766a6bb8092f9511
@@ -0,0 +1 @@
1
+ --plugin activesupport-concern
data/Gemfile CHANGED
@@ -2,5 +2,7 @@ source "https://rubygems.org"
2
2
 
3
3
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
+ gem 'yard'
6
+ gem 'yard-activesupport-concern'
5
7
  # Specify your gem's dependencies in allinpay.gemspec
6
8
  gemspec
data/README.md CHANGED
@@ -1,35 +1,39 @@
1
- # Allinpay
1
+ [![Gem Version](https://badge.fury.io/rb/allinpay.svg)](https://badge.fury.io/rb/allinpay)
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/allinpay`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ ## 通联支付Ruby接口
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ ### 安装
6
6
 
7
- ## Installation
8
-
9
- Add this line to your application's Gemfile:
7
+ 将以下代码添加到 Gemfile:
10
8
 
11
9
  ```ruby
12
10
  gem 'allinpay'
13
11
  ```
14
12
 
15
- And then execute:
13
+ 然后执行
16
14
 
17
15
  $ bundle
18
16
 
19
- Or install it yourself as:
17
+ 或者直接运行以下命令安装:
20
18
 
21
19
  $ gem install allinpay
22
20
 
23
- ## Usage
24
-
25
- TODO: Write usage instructions here
26
-
27
- ## Development
28
-
29
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
21
+ ### 使用
30
22
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
23
+ 在Rails中使用, 需要将以下代码添加到config/initializers/allinpay.rb
32
24
 
33
- ## Contributing
34
-
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/allinpay.
25
+ ```ruby
26
+ require 'allinpay'
27
+
28
+ options = {
29
+ merchant: '商户号',
30
+ username: '用户名: 商户号 + 02',
31
+ password: '登录密码',
32
+ env: '使用环境',
33
+ private_path: '私钥文件',
34
+ private_password: '私钥密码',
35
+ public_path: '公钥文件'
36
+ }
37
+
38
+ $allinpay_client = Allinpay::Client.new(options)
39
+ ```
@@ -5,7 +5,6 @@ require 'active_support/concern'
5
5
  require 'faraday'
6
6
 
7
7
  module Allinpay
8
- # Your code goes here...
9
8
  autoload :Client, 'allinpay/client'
10
9
  autoload :Signature, 'allinpay/signature'
11
10
  autoload :Service, 'allinpay/service'
@@ -1,19 +1,24 @@
1
- ###
2
- # 财务接口
3
- # 1. 账户充值
4
- #
5
- ###
6
-
7
1
  module Allinpay
2
+ # 通联支付 账户查询接口
3
+ #
4
+ # 具体文档请查看 http://113.108.182.3:8282/techsp/helper/interapi/tlt/interapi1.html
5
+ #
6
+ # @todo
7
+ # * 添加历史余额查询
8
+ # * 账户提现
8
9
  module Account
9
10
  extend ActiveSupport::Concern
10
11
  included do
11
12
 
12
- # 询商户在通联的虚拟账户基本信息
13
+ # 账户信息查询 交易代码:300000
14
+ # 查询商户在通联的虚拟账户基本信息
15
+ #
16
+ # @param account_number [String] 账户号码
13
17
  #
18
+ # @return [Hash] (see Allinpay::Client#result_wrap)
14
19
 
15
20
  def account(account_number = nil)
16
- params = set_infomation('300000',{ REQTIME: timestamps, LEVEL: 9 })
21
+ params = set_infomation('300000', { REQTIME: timestamps, LEVEL: 9 })
17
22
  params[:ACQUERYREQ] = { ACCTNO: account_number} if account_number
18
23
  res = conn.request(params)
19
24
  return result_wrap(:fail, res, params) if res["INFO"]["RET_CODE"] != "0000"
@@ -22,17 +27,17 @@ module Allinpay
22
27
 
23
28
  # 账户充值接口
24
29
  #
25
- # Paramters:
30
+ # @param bank_account [String] 银行账户
31
+ # @param amount [Integer] 充值金额
32
+ # @param business_code [String] 业务代码 默认 100005
33
+ # @param options [Hash] 其它
34
+ # @option options [String] :summary 银行交易2
35
+ # @option options [String] :remark 商户交易备注
26
36
  #
27
- # bank_account 银行账户
28
- # amount 充值金额
29
- # business_code 业务代码 默认 100005
30
- # options
31
- # summary 网银交易备注
32
- # remark 商户交易备注
37
+ # @return [Hash] (see Allinpay::Client#result_wrap)
33
38
 
34
39
  def charge(bank_account, amount, business_code = '19900', options = {})
35
- params = set_infomation('300006',{ REQTIME: timestamps, LEVEL: 9 })
40
+ params = set_infomation('300006', { REQTIME: timestamps, LEVEL: 9 })
36
41
  charge_info = {
37
42
  BUSINESS_CODE: business_code,
38
43
  BANKACCT: bank_account,
@@ -1,4 +1,14 @@
1
1
  module Allinpay
2
+ # 通联支付
3
+ # @attr merchant [String] 通联支付商户号
4
+ # @attr username [String] 通联支付用户名
5
+ # @attr password [String] 通联支付密码
6
+ # @attr public_path [String] 公共证书位置
7
+ # @attr private_path [String] 私密证书位置
8
+ # @attr private_password [String] 私密证书密码
9
+ # @attr conn [Request] 请求信息
10
+
11
+
2
12
  class Client
3
13
  attr_accessor :merchant, :username, :password, :conn
4
14
 
@@ -6,6 +16,17 @@ module Allinpay
6
16
  attr_accessor :private_path, :public_path, :private_password
7
17
  end
8
18
 
19
+ # 初始化通联支付
20
+ #
21
+ # @param options [Hash] 交易信息
22
+ # @option options [String] :merchant 通联支付商户号
23
+ # @option options [String] :username 通联支付用户名
24
+ # @option options [String] :password 通联支付密码
25
+ # @option options [String] :env 设置环境
26
+ # @option options [String] :public_path 公共证书位置
27
+ # @option options [String] :private_path 私密证书位置
28
+ # @option options [String] :private_password 私密证书密码
29
+
9
30
  def initialize(options)
10
31
  @merchant = options[:merchant]
11
32
  @username = options[:username]
@@ -16,6 +37,13 @@ module Allinpay
16
37
 
17
38
  private
18
39
 
40
+ # 设置基本信息
41
+ #
42
+ # @param code [String] 交易代码
43
+ # @param options [Hash] 其它信息
44
+ #
45
+ # return [Hash]
46
+
19
47
  def set_infomation(code, options = {})
20
48
  info = {
21
49
  TRX_CODE: code,
@@ -28,14 +56,23 @@ module Allinpay
28
56
  return { INFO: info }
29
57
  end
30
58
 
59
+ # 生成交易序号
60
+
31
61
  def req_sn
32
62
  merchant + timestamps + rand(1000).to_s.ljust(4, '0')
33
63
  end
34
64
 
65
+ # 生成时间
66
+
35
67
  def timestamps
36
68
  Time.now.strftime('%Y%m%d%H%M%S')
37
69
  end
38
70
 
71
+ # 将结果重新包装
72
+ # @param status [String] 返回状态
73
+ # @param data [String, Hash, Array, nil] 包装数据
74
+ # @param request [Hash] 请求数据
75
+
39
76
  def result_wrap(status, data, request = nil)
40
77
  return { "status" => status.to_s, "data" => data, "request" => request }
41
78
  end
@@ -1,16 +1,22 @@
1
- ###
2
- # 交易接口
3
- # 1. 单笔实时支付
4
- #
5
- ###
6
-
7
-
8
1
  module Allinpay
2
+ # 通联支付 支付接口
3
+ #
4
+ # 具体文档请查看 http://113.108.182.3:8282/techsp/helper/interapi/tlt/interapi0.html
9
5
  module Payment
10
6
  extend ActiveSupport::Concern
11
7
  included do
12
8
 
13
- # 通联支付单笔实时支付
9
+ # 单笔实时付款 交易代码:100014
10
+ #
11
+ # @param tran [Hash] 交易信息
12
+ # @option tran [String] :bank_code 银行代码,存折必须填写
13
+ # @option tran [String] :account_number 银行卡或存折号码
14
+ # @option tran [String] :account_name 银行卡或存折上的所有人姓名
15
+ # @option tran [String] :account_prop 账号属性 0私人,1公司。不填时,默认为私人0
16
+ # @param options [Hash] 其它信息 具体参考http://113.108.182.3:8282/techsp/helper/filedetail/tlt/filedetail743.html
17
+ #
18
+ # @return [Hash] (see Allinpay::Client#result_wrap)
19
+
14
20
  def pay(tran, options = {})
15
21
  params = set_infomation('100014')
16
22
  tran_body = {
@@ -30,7 +36,17 @@ module Allinpay
30
36
  return result_wrap(:success, res, params)
31
37
  end
32
38
 
33
- # 通联支付批量付款
39
+ # 批量代付 交易代码:100002
40
+ #
41
+ # @param trans [Array<Hash>] 交易信息
42
+ # @option trans [String] :bank_code 银行代码,存折必须填写
43
+ # @option trans [String] :account_number 银行卡或存折号码
44
+ # @option trans [String] :account_name 银行卡或存折上的所有人姓名
45
+ # @option trans [String] :account_prop 账号属性 0私人,1公司。不填时,默认为私人0
46
+ # @param options [Hash] 其它信息 具体参考http://113.108.182.3:8282/techsp/helper/filedetail/tlt/filedetail131.html
47
+ #
48
+ # @return [Hash] (see Allinpay::Client#result_wrap)
49
+
34
50
  def batch_pay(trans, options = {})
35
51
  params = set_infomation('100002', {LEVEL: 9})
36
52
  details = []
@@ -10,12 +10,14 @@ module Allinpay
10
10
  extend ActiveSupport::Concern
11
11
  included do
12
12
 
13
- # 支付交易结果查询
13
+ # 交易结果查询 交易代码:200004
14
14
  #
15
- # Paramters:
16
- #
17
- # sn: 交易序号
18
- # options:
15
+ # @param sn [String] 要查询的交易流水, 若不填时间必填
16
+ # @param options [Hash] 其它信息
17
+ # @option options [String] :type 查询类型, 如果使用0查询,未完成交易将查不到
18
+ # @option options [String] :status 状态, 如果开始时间和结束时间不为空,该字段生效,不可为空
19
+ # @option options [String] :start_day 开始时间, 若不填QUERY_SN则必填
20
+ # @option options [String] :end_day 结束时间, 填了开始时间必填
19
21
 
20
22
  def query_batch_pay(sn, options = {})
21
23
  params = set_infomation('200004')
@@ -1,5 +1,9 @@
1
1
  module Allinpay
2
2
  module Service
3
+ # 网关信息处理
4
+ # @param env [String] 所在环境
5
+ # @param options [Hash] (see #set_signature_infomation)
6
+
3
7
  def self.connection(env, options)
4
8
  set_signature_infomation(options)
5
9
  ssl_options = {}
@@ -17,6 +21,10 @@ module Allinpay
17
21
  end.new(env, ssl_options)
18
22
  end
19
23
 
24
+ # 处理请求
25
+ # @param params [Hash] 将参数发送服务器
26
+ #
27
+ # @return [Hash] 将处理后的结果转换成Hash
20
28
  def request(params)
21
29
  params[:INFO][:SIGNED_MSG] = Signature.generate(parse_xml(params)).unpack('H*').first
22
30
  body = parse_xml(params)
@@ -33,18 +41,37 @@ module Allinpay
33
41
 
34
42
  private
35
43
 
44
+ # 验证服务器返回结果
45
+ #
46
+ # @param res [String] 服务返回body信息
47
+ # @param result [Hash] 返回xml转换后的信息
48
+ #
49
+ # return [Boolean] 验证结果
50
+
36
51
  def verify_signature?(res, result)
37
52
  signed = result["AIPG"]["INFO"]["SIGNED_MSG"]
38
53
  xml_body = res.encode('utf-8', 'gbk').gsub(/<SIGNED_MSG>.*<\/SIGNED_MSG>/, '')
39
54
  Signature.verify?(xml_body.encode('gbk', 'utf-8'), [signed].pack("H*"))
40
55
  end
41
56
 
57
+ # 将数据转换成XML
58
+ #
59
+ # @param data [String] 待装换信息
60
+ # @param indent [Integer] 开始位置, 默认为0
61
+ #
62
+ # @return [String] xml信息
63
+
42
64
  def parse_xml(data, indent = 0)
43
65
  data_xml = data.to_xml(root: 'AIPG', skip_types: true, dasherize: false, indent: indent).sub('UTF-8', 'GBK')
44
66
  data_xml.encode! 'gbk','utf-8'
45
67
  data_xml
46
68
  end
47
69
 
70
+ # 设置支付网关
71
+ #
72
+ # @param env [String] 所在环境
73
+ # @return [String] 网关链接
74
+
48
75
  def set_gateway_url(env)
49
76
  if env.to_s == "development" || env.to_s == "test"
50
77
  return 'https://113.108.182.3/aipg/ProcessServlet'
@@ -53,6 +80,10 @@ module Allinpay
53
80
  end
54
81
  end
55
82
 
83
+ # 设置加密信息以及检查证书是否存在
84
+ #
85
+ # @param options [Hash](see Allinpay::Client#new)
86
+
56
87
  def self.set_signature_infomation(options)
57
88
  raise "Allinpay private key not exists" if !File.exists?(options[:private_path])
58
89
  raise "Allinpay public key not exists" if !File.exists?(options[:public_path])
@@ -1,7 +1,13 @@
1
1
  require 'openssl'
2
2
 
3
3
  module Allinpay
4
+
4
5
  class Signature
6
+ # 通联支付 参数加密
7
+ #
8
+ # @param str [String] 待加密参数
9
+ #
10
+ # @return [String] 加密后信息
5
11
  def self.generate(str)
6
12
  private_file = File.open(Allinpay::Client.private_path)
7
13
  private_key= OpenSSL::PKCS12.new(private_file, Allinpay::Client.private_password).key.export
@@ -9,6 +15,12 @@ module Allinpay
9
15
  rsa.sign("sha1", str.force_encoding("GBK"))
10
16
  end
11
17
 
18
+ # 通联支付 信息验证
19
+ #
20
+ # @param str [String] 待加密信息
21
+ # @param sign [String] 签名
22
+ #
23
+ # @return [Boolean] 验证后信息
12
24
  def self.verify?(str, sign)
13
25
  public_file = File.open(Allinpay::Client.public_path)
14
26
  public_key = OpenSSL::X509::Certificate.new(public_file).public_key.export
@@ -1,3 +1,3 @@
1
1
  module Allinpay
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: allinpay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ye.li
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-30 00:00:00.000000000 Z
11
+ date: 2017-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -60,6 +60,7 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - ".gitignore"
63
+ - ".yardopts"
63
64
  - Gemfile
64
65
  - README.md
65
66
  - Rakefile