tenpay 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.
- data/.gitignore +3 -0
- data/MIT-LICENSE +20 -0
- data/README +57 -0
- data/Rakefile +29 -0
- data/VERSION +1 -0
- data/lib/generators/tenpay/templates/tenpay.yml +9 -0
- data/lib/generators/tenpay/tenpay_generator.rb +11 -0
- data/lib/tenpay.rb +5 -0
- data/lib/tenpay/config.rb +18 -0
- data/lib/tenpay/query.rb +54 -0
- data/lib/tenpay/query_response.rb +65 -0
- data/lib/tenpay/request.rb +64 -0
- data/lib/tenpay/response.rb +41 -0
- data/spec/query_spec.rb +80 -0
- data/spec/request_spec.rb +33 -0
- data/spec/response_spec.rb +26 -0
- metadata +76 -0
data/.gitignore
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 [name of plugin creator]
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
Tenpay
|
2
|
+
======
|
3
|
+
|
4
|
+
A Ruby on Rails plugin for Tenpay(财付通).
|
5
|
+
|
6
|
+
使用
|
7
|
+
=======
|
8
|
+
|
9
|
+
1. 修改Gemfile:
|
10
|
+
|
11
|
+
gem "tenpay"
|
12
|
+
|
13
|
+
2. 生成配置文件:
|
14
|
+
|
15
|
+
$ script/rails g tenpay
|
16
|
+
|
17
|
+
这个命令会在你的应用的config目录创建一个tenpay.yml文件,默认是快钱提供的测试帐号(关于测试帐号的使用方法请参看测试章节)
|
18
|
+
将tenpay.yml中的商户ID和密钥替换为财付通提供给你的真实ID和密钥然后进行下一步。
|
19
|
+
|
20
|
+
3. 下面的代码会创建一笔新订单:
|
21
|
+
|
22
|
+
@request = Tenpay::Request.new(
|
23
|
+
'test product', # 产品名称
|
24
|
+
1, # 订单编号,必须保持唯一
|
25
|
+
Time.now, # 订单生成时间
|
26
|
+
4500, # 订单价格,以分为单位
|
27
|
+
'http://return', # 完成支付后的回调地址
|
28
|
+
request.remote_ip, # 用于IP验证,开发模式可忽略
|
29
|
+
'attach data') # 自定义数据
|
30
|
+
redirect_to @request.url
|
31
|
+
|
32
|
+
上面的代码会将用户重定向到财付通的支付页面。
|
33
|
+
|
34
|
+
4. 在用户完成支付后,财付通会调用你在支付请求中提供的返回URL:
|
35
|
+
|
36
|
+
@response = Tenpay::Response.new(params)
|
37
|
+
if @response.successful?
|
38
|
+
# 支付成功
|
39
|
+
else
|
40
|
+
# 失败
|
41
|
+
end
|
42
|
+
|
43
|
+
注意,快钱可能会多次调用你的返回URL,并将结果展现给用户,因此你的代码要考虑多次执行后的输出对用户的有好度。
|
44
|
+
|
45
|
+
查询
|
46
|
+
========
|
47
|
+
|
48
|
+
如果需要查询订单支付状态,可以使用下面的接口:
|
49
|
+
|
50
|
+
@query = Tenpay::Query.new(1, # 订单id
|
51
|
+
Time.now) # 订单日期
|
52
|
+
@query.response.successful? # true => 已支付, false => 未支付
|
53
|
+
|
54
|
+
----------------
|
55
|
+
如果在使用中遇到任何的问题或者建议,欢迎和我联系: zhangyuanyi@gmail.com
|
56
|
+
|
57
|
+
Copyright (c) 2009 Yuanyi Zhang, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
|
4
|
+
desc 'Default: run specs.'
|
5
|
+
task :default => :spec
|
6
|
+
|
7
|
+
desc 'Generate documentation for the tenpay plugin.'
|
8
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
9
|
+
rdoc.rdoc_dir = 'rdoc'
|
10
|
+
rdoc.title = 'Tenpay'
|
11
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
12
|
+
rdoc.rdoc_files.include('README')
|
13
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
14
|
+
end
|
15
|
+
|
16
|
+
begin
|
17
|
+
require 'jeweler'
|
18
|
+
Jeweler::Tasks.new do |s|
|
19
|
+
s.name = "tenpay"
|
20
|
+
s.summary = "A Ruby wrapper of Tenpay(财付通) Payment API"
|
21
|
+
s.email = "zhangyuanyi@gmail.com"
|
22
|
+
s.homepage = "http://github.com/yzhang/tenpay"
|
23
|
+
s.description = "A Ruby wrapper of Tenpay(财付通) Payment API"
|
24
|
+
s.authors = ["Yuanyi Zhang"]
|
25
|
+
s.files = FileList["[A-Z]*", "{lib}/**/*", '.gitignore']
|
26
|
+
end
|
27
|
+
rescue LoadError
|
28
|
+
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
29
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/tenpay.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Tenpay
|
2
|
+
class Config
|
3
|
+
class << self
|
4
|
+
def spid; config['spid']; end
|
5
|
+
def key; config['key']; end
|
6
|
+
|
7
|
+
def config
|
8
|
+
@@config ||= lambda do
|
9
|
+
require 'yaml'
|
10
|
+
filename = "#{Rails.root}/config/tenpay.yml"
|
11
|
+
file = File.open(filename)
|
12
|
+
yaml = YAML.load(file)
|
13
|
+
return yaml[Rails.env]
|
14
|
+
end.call
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/tenpay/query.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'cgi'
|
3
|
+
require 'iconv'
|
4
|
+
require 'net/http'
|
5
|
+
require 'uri'
|
6
|
+
require 'hpricot'
|
7
|
+
|
8
|
+
module Tenpay
|
9
|
+
class Query
|
10
|
+
GATEWAY_URL = "http://mch.tenpay.com/cgi-bin/cfbi_query_order_v3.cgi"
|
11
|
+
|
12
|
+
def initialize(order_id, date, attach=nil, charset='UTF-8')
|
13
|
+
@cmdno = 1
|
14
|
+
@date = date.strftime("%Y%m%d")
|
15
|
+
@spid = Tenpay::Config.spid
|
16
|
+
@key = Tenpay::Config.key
|
17
|
+
|
18
|
+
@order_id = order_id.to_i
|
19
|
+
@attach = attach || 'nil'
|
20
|
+
@charset = charset
|
21
|
+
end
|
22
|
+
|
23
|
+
def response
|
24
|
+
@response ||= QueryResponse.new(Net::HTTP.get(URI.parse("#{GATEWAY_URL}?#{params}")))
|
25
|
+
end
|
26
|
+
|
27
|
+
def transaction_id
|
28
|
+
@transaction_id ||= "%s%s%010d" % [@spid, @date, @order_id]
|
29
|
+
end
|
30
|
+
|
31
|
+
def sign
|
32
|
+
@sign ||= Digest::MD5.hexdigest(sign_params).upcase
|
33
|
+
end
|
34
|
+
|
35
|
+
def sign_params
|
36
|
+
@sign_params ||= generate_sign_params
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def params
|
41
|
+
@params ||= generate_params
|
42
|
+
end
|
43
|
+
|
44
|
+
def generate_params
|
45
|
+
"cmdno=2&date=#{@date}&bargainor_id=#{@spid}&transaction_id=#{transaction_id}&sp_billno=#{@order_id}&attach=#{@attach}&" +
|
46
|
+
"output_xml=1&charset=#{@charset}&sign=#{sign}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def generate_sign_params
|
50
|
+
"attach=#{@attach}&bargainor_id=#{@spid}&charset=#{@charset}&cmdno=2&date=#{@date}&output_xml=1&" +
|
51
|
+
"sp_billno=#{@order_id}&transaction_id=#{transaction_id}&key=#{@key}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Tenpay
|
2
|
+
class QueryResponse
|
3
|
+
def initialize(response)
|
4
|
+
@body = response
|
5
|
+
end
|
6
|
+
|
7
|
+
def valid?
|
8
|
+
sign == Digest::MD5.hexdigest(sign_params).upcase
|
9
|
+
end
|
10
|
+
|
11
|
+
def successful?
|
12
|
+
valid? && pay_result == '0'
|
13
|
+
end
|
14
|
+
|
15
|
+
def doc
|
16
|
+
@doc ||= Hpricot(@body)
|
17
|
+
end
|
18
|
+
|
19
|
+
def attach
|
20
|
+
@attach ||= (doc / 'attach').inner_text
|
21
|
+
end
|
22
|
+
|
23
|
+
def cmdno
|
24
|
+
@cmdno ||= (doc / 'cmdno').inner_text
|
25
|
+
end
|
26
|
+
|
27
|
+
def date
|
28
|
+
@date ||= (doc / 'date').inner_text
|
29
|
+
end
|
30
|
+
|
31
|
+
def fee_type
|
32
|
+
@fee_type ||= (doc / 'fee_type').inner_text
|
33
|
+
end
|
34
|
+
|
35
|
+
def pay_info
|
36
|
+
@pay_info ||= (doc / 'pay_info').inner_text
|
37
|
+
end
|
38
|
+
|
39
|
+
def pay_result
|
40
|
+
@pay_result ||= (doc / 'pay_result').inner_text
|
41
|
+
end
|
42
|
+
|
43
|
+
def order_id
|
44
|
+
@order_id ||= (doc / 'sp_billno').inner_text
|
45
|
+
end
|
46
|
+
|
47
|
+
def total_fee
|
48
|
+
@total_fee ||= (doc / 'total_fee').inner_text
|
49
|
+
end
|
50
|
+
|
51
|
+
def transaction_id
|
52
|
+
@transaction_id ||= (doc / 'transaction_id').inner_text
|
53
|
+
end
|
54
|
+
|
55
|
+
def sign
|
56
|
+
@sign ||= (doc / 'sign').inner_text
|
57
|
+
end
|
58
|
+
private
|
59
|
+
def sign_params
|
60
|
+
"attach=#{attach}&bargainor_id=#{Tenpay::Config.spid}&cmdno=#{cmdno}&date=#{date}&fee_type=#{fee_type}" +
|
61
|
+
"&pay_info=#{pay_info}&pay_result=#{pay_result}&sp_billno=#{order_id}&total_fee=#{total_fee}&" +
|
62
|
+
"transaction_id=#{transaction_id}&key=#{Tenpay::Config.key}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'cgi'
|
3
|
+
require 'iconv'
|
4
|
+
|
5
|
+
module Tenpay
|
6
|
+
class Request
|
7
|
+
GATEWAY_URL = "https://www.tenpay.com/cgi-bin/v1.0/pay_gate.cgi"
|
8
|
+
|
9
|
+
def initialize(description, order_id, created_at, total_fee,
|
10
|
+
return_url, purchaser_ip='', attach=nil)
|
11
|
+
@cmdno = 1
|
12
|
+
@date = created_at.strftime("%Y%m%d")
|
13
|
+
@bank_type = 0
|
14
|
+
@fee_type = 1
|
15
|
+
|
16
|
+
@desc = Iconv.iconv('gbk', 'utf-8', description).join
|
17
|
+
@spid = Tenpay::Config.spid
|
18
|
+
@key = Tenpay::Config.key
|
19
|
+
|
20
|
+
@order_id = order_id.to_i
|
21
|
+
@total_fee = total_fee.to_i
|
22
|
+
@return_url = return_url
|
23
|
+
@attach = attach || 'nil'
|
24
|
+
|
25
|
+
@purchaser_ip = (RAILS_ENV == 'production' ? purchaser_ip : '')
|
26
|
+
end
|
27
|
+
|
28
|
+
def transaction_id
|
29
|
+
@transaction_id ||= "%s%s%010d" % [@spid, @date, @order_id]
|
30
|
+
end
|
31
|
+
|
32
|
+
def sign
|
33
|
+
@sign ||= Digest::MD5.hexdigest(sign_params).upcase
|
34
|
+
end
|
35
|
+
|
36
|
+
def sign_params
|
37
|
+
@sign_params ||= generate_sign_params
|
38
|
+
end
|
39
|
+
|
40
|
+
def params
|
41
|
+
@params ||= generate_params
|
42
|
+
end
|
43
|
+
|
44
|
+
def url
|
45
|
+
"#{GATEWAY_URL}?#{params}&sign=#{sign}"
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def generate_params
|
50
|
+
params = "cmdno=#{@cmdno}&date=#{@date}&bargainor_id=#{@spid}&transaction_id=#{transaction_id}" +
|
51
|
+
"&sp_billno=#{@order_id}&total_fee=#{@total_fee}&fee_type=#{@fee_type}" +
|
52
|
+
"&return_url=#{@return_url}&attach=#{CGI.escape(@attach)}&desc=#{CGI.escape(@desc)}"
|
53
|
+
params << "&spbill_create_ip=#{@purchaser_ip}" unless @purchaser_ip.nil? || @purchaser_ip == ''
|
54
|
+
params
|
55
|
+
end
|
56
|
+
def generate_sign_params
|
57
|
+
sign_params = "cmdno=#{@cmdno}&date=#{@date}&bargainor_id=#{@spid}&transaction_id=#{transaction_id}" +
|
58
|
+
"&sp_billno=#{@order_id}&total_fee=#{@total_fee}&fee_type=#{@fee_type}" +
|
59
|
+
"&return_url=#{@return_url}&attach=#{CGI.escape(@attach)}"
|
60
|
+
sign_params << "&spbill_create_ip=#{@purchaser_ip}" unless @purchaser_ip.nil? || @purchaser_ip == ''
|
61
|
+
sign_params << "&key=#{@key}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'cgi'
|
3
|
+
require 'iconv'
|
4
|
+
|
5
|
+
module Tenpay
|
6
|
+
class Response
|
7
|
+
attr_reader :order_id, :total_fee, :attach, :pay_time
|
8
|
+
|
9
|
+
def initialize(params)
|
10
|
+
@cmdno = params[:cmdno] || ''
|
11
|
+
@date = params[:date] || ''
|
12
|
+
@fee_type = params[:fee_type] || ''
|
13
|
+
@pay_info = params[:pay_info] || ''
|
14
|
+
@pay_result = params[:pay_result] || ''
|
15
|
+
@pay_time = Time.at((params[:pay_time] || '0').to_i)
|
16
|
+
@sign = params[:sign] || ''
|
17
|
+
@order_id = (params[:sp_billno] || '').to_i
|
18
|
+
@transaction_id = params[:transaction_id] || ''
|
19
|
+
@total_fee = params[:total_fee] || ''
|
20
|
+
@attach = params[:attach] || ''
|
21
|
+
|
22
|
+
@spid = Tenpay::Config.spid
|
23
|
+
@key = Tenpay::Config.key
|
24
|
+
end
|
25
|
+
|
26
|
+
def successful?
|
27
|
+
@pay_info == 'OK' && @pay_result == '0' && valid_sign?
|
28
|
+
end
|
29
|
+
|
30
|
+
def valid_sign?
|
31
|
+
@sign == Digest::MD5.hexdigest(sign_params).upcase
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def sign_params
|
36
|
+
@sign_params ||= "cmdno=#{@cmdno}&pay_result=#{@pay_result}&date=#{@date}&transaction_id=#{@transaction_id}" +
|
37
|
+
"&sp_billno=#{@order_id}&total_fee=#{@total_fee}&fee_type=#{@fee_type}" +
|
38
|
+
"&attach=#{CGI.escape(@attach)}&key=#{@key}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/spec/query_spec.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
require 'spec'
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment")
|
4
|
+
require "tenpay"
|
5
|
+
require 'net/http'
|
6
|
+
|
7
|
+
describe Tenpay::Request do
|
8
|
+
before do
|
9
|
+
@query = Tenpay::Query.new(1, Date.new(2009, 9, 12))
|
10
|
+
@sign_params = "attach=nil&bargainor_id=1900000109&charset=UTF-8&cmdno=2&date=20090912&output_xml=1&" +
|
11
|
+
"sp_billno=1&transaction_id=1900000109200909120000000001&key=8934e7d15453e97507ef794cf7b0519d"
|
12
|
+
@sign = Digest::MD5.hexdigest(@sign_params).upcase
|
13
|
+
@params = "cmdno=2&date=20090912&bargainor_id=1900000109&transaction_id=1900000109200909120000000001" +
|
14
|
+
"&sp_billno=1&attach=nil&output_xml=1&charset=UTF-8&sign=#{@sign}"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return a Query Response object." do
|
18
|
+
@uri = mock('uri')
|
19
|
+
URI.should_receive(:parse).with("#{Tenpay::Query::GATEWAY_URL}?#{@params}").and_return(@uri)
|
20
|
+
Net::HTTP.should_receive(:get).with(@uri)
|
21
|
+
Tenpay::QueryResponse.stub!(:new).and_return(mock('response'))
|
22
|
+
@query.response
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should construct sign params properly." do
|
26
|
+
@query.sign_params.should == @sign_params
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe Tenpay::QueryResponse do
|
31
|
+
before do
|
32
|
+
@valid_response = VALID_XML
|
33
|
+
@invalid_response = ''
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be invalid with invalid response" do
|
37
|
+
@response = Tenpay::QueryResponse.new(@invalid_response)
|
38
|
+
@response.should_not be_valid
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should be valid with valid response" do
|
42
|
+
@response = Tenpay::QueryResponse.new(@valid_response)
|
43
|
+
@response.attach.should == 'a'
|
44
|
+
@response.cmdno.should == '2'
|
45
|
+
@response.date.should == '20090315'
|
46
|
+
@response.fee_type.should == '1'
|
47
|
+
@response.pay_info.should == 'test'
|
48
|
+
@response.pay_result.should == '2006'
|
49
|
+
@response.order_id.should == '56212087'
|
50
|
+
@response.total_fee.should == '3000'
|
51
|
+
@response.transaction_id.should == '1900000108200903150056212087'
|
52
|
+
@response.sign.should == 'A8D50F1DC2E2E4CC83191AE39C702C27'
|
53
|
+
|
54
|
+
@response.should be_valid
|
55
|
+
end
|
56
|
+
|
57
|
+
VALID_XML = %(<?xml version="1.0" encoding="GB2312" ?>
|
58
|
+
<root>
|
59
|
+
<attach>a</attach>
|
60
|
+
<bank_type />
|
61
|
+
<bargainor_id>1900000108</bargainor_id>
|
62
|
+
<bill_no />
|
63
|
+
<charset>GB2312</charset>
|
64
|
+
<cmdno>2</cmdno>
|
65
|
+
<date>20090315</date>
|
66
|
+
<dump_html_file />
|
67
|
+
<fee_type>1</fee_type>
|
68
|
+
<output_xml>1</output_xml>
|
69
|
+
<pay_info>test</pay_info>
|
70
|
+
<pay_result>2006</pay_result>
|
71
|
+
<retcode>00</retcode>
|
72
|
+
<retmsg>交易成功</retmsg>
|
73
|
+
<return_url>http://192.168.1.129/bank/cft_return.aspx</return_url>
|
74
|
+
<sign>A8D50F1DC2E2E4CC83191AE39C702C27</sign>
|
75
|
+
<sp_billno>56212087</sp_billno>
|
76
|
+
<total_fee>3000</total_fee>
|
77
|
+
<transaction_id>1900000108200903150056212087</transaction_id>
|
78
|
+
</root>
|
79
|
+
)
|
80
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
require 'spec'
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment")
|
4
|
+
require "tenpay"
|
5
|
+
|
6
|
+
describe Tenpay::Request do
|
7
|
+
before do
|
8
|
+
@request = Tenpay::Request.new('test product', 1,
|
9
|
+
4500, 'http://return', '', 'order_id=1')
|
10
|
+
today = Date.today
|
11
|
+
@date = "%d%02d%02d" % [today.year, today.month, today.day]
|
12
|
+
@params = "cmdno=1&date=#{@date}&bargainor_id=1900000109&" +
|
13
|
+
"transaction_id=1900000109#{@date}0000000001&sp_billno=1&total_fee=4500&fee_type=1" +
|
14
|
+
"&return_url=#{'http://return'}&attach=#{CGI.escape('order_id=1')}"
|
15
|
+
@sign = Digest::MD5.hexdigest("#{@params}&key=8934e7d15453e97507ef794cf7b0519d").upcase
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should construct transaction correctly." do
|
19
|
+
@request.transaction_id.should == "1900000109#{@date}0000000001"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should construct params correctly." do
|
23
|
+
@request.params.should == "#{@params}&desc=test product"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should sign the params" do
|
27
|
+
@request.sign.should == @sign
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should generate url for user paying" do
|
31
|
+
@request.url.should == "https://www.tenpay.com/cgi-bin/v1.0/pay_gate.cgi?#{@params}&desc=test product&sign=#{@sign}"
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
ENV["RAILS_ENV"] = "test"
|
2
|
+
require 'spec'
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment")
|
4
|
+
require "tenpay"
|
5
|
+
|
6
|
+
describe Tenpay::Response do
|
7
|
+
before do
|
8
|
+
@valid_params = {:cmdno => '1', :date => '20090818',
|
9
|
+
:fee_type => '1', :pay_info => 'OK', :pay_result => '0',
|
10
|
+
:pay_time => '1250554120',
|
11
|
+
:sign => 'D2171C4319EE7A7A8008F1A4479C8C93',
|
12
|
+
:sp_billno => '2',
|
13
|
+
:transaction_id => '1900000109200908180000000002',
|
14
|
+
:total_fee => '1',
|
15
|
+
:attach => 'nil'}
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be successful with valid params and key" do
|
19
|
+
Tenpay::Response.new(@valid_params).should be_successful
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should not be successful with invalid params and key" do
|
23
|
+
@valid_params[:date] = '20100912'
|
24
|
+
Tenpay::Response.new(@valid_params).should_not be_successful
|
25
|
+
end
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tenpay
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Yuanyi Zhang
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-07-06 00:00:00 +08:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: "A Ruby wrapper of Tenpay(\xE8\xB4\xA2\xE4\xBB\x98\xE9\x80\x9A) Payment API"
|
22
|
+
email: zhangyuanyi@gmail.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- README
|
29
|
+
files:
|
30
|
+
- .gitignore
|
31
|
+
- MIT-LICENSE
|
32
|
+
- README
|
33
|
+
- Rakefile
|
34
|
+
- VERSION
|
35
|
+
- lib/generators/tenpay/templates/tenpay.yml
|
36
|
+
- lib/generators/tenpay/tenpay_generator.rb
|
37
|
+
- lib/tenpay.rb
|
38
|
+
- lib/tenpay/config.rb
|
39
|
+
- lib/tenpay/query.rb
|
40
|
+
- lib/tenpay/query_response.rb
|
41
|
+
- lib/tenpay/request.rb
|
42
|
+
- lib/tenpay/response.rb
|
43
|
+
has_rdoc: true
|
44
|
+
homepage: http://github.com/yzhang/tenpay
|
45
|
+
licenses: []
|
46
|
+
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options:
|
49
|
+
- --charset=UTF-8
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
version: "0"
|
66
|
+
requirements: []
|
67
|
+
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.3.6
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: "A Ruby wrapper of Tenpay(\xE8\xB4\xA2\xE4\xBB\x98\xE9\x80\x9A) Payment API"
|
73
|
+
test_files:
|
74
|
+
- spec/query_spec.rb
|
75
|
+
- spec/request_spec.rb
|
76
|
+
- spec/response_spec.rb
|