activemerchant_patch_for_china 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/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 [nouse]
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.textile ADDED
@@ -0,0 +1,63 @@
1
+ h1. activemerchant_patch_for_china
2
+
3
+ *Please note! This active_merchant patch is written by nouse.*
4
+
5
+ This plugin is an active_merchant patch for china online payment platform, now it supports alipay (支付宝), 99bill (快钱) and tenpay (财付通).
6
+
7
+ **************************************************************************
8
+
9
+ h2. Install
10
+
11
+ install active_merchant plugin first:
12
+ <pre><code>
13
+ script/plugin install git://github.com/Shopify/active_merchant.git
14
+ </code></pre>
15
+
16
+ then, install activemerchant_patch_for_china plugin:
17
+ <pre><code>
18
+ script/plugin install git://github.com/flyerhzm/activemerchant_patch_for_china.git
19
+ </code></pre>
20
+
21
+ **************************************************************************
22
+
23
+ h2. Configuration
24
+
25
+ if you install active_merchant and activemerchant_patch_for_china as rails plugins, then define plugin load order in <code>config/environment.rb</code> to promise activemerchant_patch_for_china is loaded after active_merchant.
26
+ <pre><code>
27
+ config.plugins = [:all, :active_merchant, :activemerchant_patch_for_china]
28
+ </code></pre>
29
+
30
+ define your api key, account and email in development
31
+ <pre><code>
32
+ ActiveMerchant::Billing::Integrations::Alipay::KEY
33
+ ActiveMerchant::Billing::Integrations::Alipay::ACCOUNT
34
+ ActiveMerchant::Billing::Integrations::Alipay::EMAIL
35
+ </code></pre>
36
+
37
+ **************************************************************************
38
+
39
+ h2. Usage
40
+
41
+ <pre><code>
42
+ <% payment_service_for 'payment order', ActiveMerchant::Billing::Integrations::Alipay::ACCOUNT,
43
+ :service => :alipay,
44
+ :html => { :id => 'payment-form', :method => :get } do |service| %>
45
+ <% service.amount '0.01' %>
46
+ <% service.seller :email => ActiveMerchant::Billing::Integrations::Alipay::EMAIL %>
47
+ <% service.notify_url url_for(:only_path => false, :action => 'notify') %>
48
+ <% service.return_url url_for(:only_path => false, :action => 'done') %>
49
+ <% service.show_url url_for(:only_path => false, :action => 'show') %>
50
+ <% service.description 'payment description' %>
51
+ <% service.charset "utf-8" %>
52
+ <% service.service "create_direct_pay_by_user" %>
53
+ <% service.payment_type 1 %>
54
+ <% service.subject 'payment subject' %>
55
+ <% service.sign %>
56
+ <% end %>
57
+ <%= button_to_function "Submit", "document.getElementById('payment-form').submit();" %>
58
+ </code></pre>
59
+
60
+ **************************************************************************
61
+
62
+
63
+ Copyright (c) 2009 [nouse], released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,35 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'jeweler'
5
+
6
+ desc 'Default: run unit tests.'
7
+ task :default => :test
8
+
9
+ desc 'Test the activemerchant_patch_for_china plugin.'
10
+ Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib'
12
+ t.libs << 'test'
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = true
15
+ end
16
+
17
+ desc 'Generate documentation for the activemerchant_patch_for_china plugin.'
18
+ Rake::RDocTask.new(:rdoc) do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'ActivemerchantPatchForChina'
21
+ rdoc.options << '--line-numbers' << '--inline-source'
22
+ rdoc.rdoc_files.include('README')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
25
+
26
+ Jeweler::Tasks.new do |gemspec|
27
+ gemspec.name = "activemerchant_patch_for_china"
28
+ gemspec.summary = "A rails plugin to add an active_merchant patch for china online payment platform"
29
+ gemspec.description = "A rails plugin to add an active_merchant patch for china online payment platform"
30
+ gemspec.email = "flyerhzm@gmail.com"
31
+ gemspec.homepage = "http://github.com/flyerhzm/activemerchant_patch_for_china"
32
+ gemspec.authors = ["Richard Huang"]
33
+ gemspec.add_dependency 'activemerchant', '>= 1.4.2'
34
+ end
35
+ Jeweler::GemcutterTasks.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,41 @@
1
+ require 'cgi'
2
+ require 'digest/md5'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ module Integrations #:nodoc:
7
+ module Alipay
8
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
9
+ mapping :account, 'partner'
10
+ mapping :amount, 'total_fee'
11
+
12
+ mapping :order, 'out_trade_no'
13
+
14
+ mapping :seller, :email => 'seller_email'
15
+
16
+ mapping :notify_url, 'notify_url'
17
+ mapping :return_url, 'return_url'
18
+ mapping :show_url, 'show_url'
19
+ mapping :description, 'body'
20
+
21
+ mapping :charset, '_input_charset'
22
+ mapping :service, 'service'
23
+ mapping :payment_type, 'payment_type'
24
+ mapping :subject, 'subject'
25
+
26
+ def initialize(order, account, options = {})
27
+ super
28
+ end
29
+
30
+ def sign
31
+ add_field('sign',
32
+ Digest::MD5.hexdigest((@fields.sort.collect{|s|s[0]+"="+CGI.unescape(s[1])}).join("&")+KEY)
33
+ )
34
+ add_field('sign_type', 'MD5')
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,88 @@
1
+ require 'net/http'
2
+ require 'active_merchant/billing/integrations/alipay/sign'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ module Integrations #:nodoc:
7
+ module Alipay
8
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
9
+ include Sign
10
+
11
+ def complete?
12
+ if status != "TRADE_FINISHED"
13
+ return false
14
+ end
15
+
16
+ unless verify_sign
17
+ @message = "Alipay Error: ILLEGAL_SIGN"
18
+ return false
19
+ end
20
+
21
+ true
22
+ end
23
+
24
+ def order
25
+ @params["out_trade_no"]
26
+ end
27
+
28
+ def amount
29
+ @params["total_fee"]
30
+ end
31
+
32
+ def message
33
+ @message
34
+ end
35
+
36
+ def item_id
37
+ params['']
38
+ end
39
+
40
+ def transaction_id
41
+ params['']
42
+ end
43
+
44
+ # When was this payment received by the client.
45
+ def received_at
46
+ params['']
47
+ end
48
+
49
+ def payer_email
50
+ params['']
51
+ end
52
+
53
+ def receiver_email
54
+ params['']
55
+ end
56
+
57
+ def security_key
58
+ params['']
59
+ end
60
+
61
+ # the money amount we received in X.2 decimal.
62
+ def gross
63
+ params['']
64
+ end
65
+
66
+ # Was this a test transaction?
67
+ def test?
68
+ params[''] == 'test'
69
+ end
70
+
71
+ def status
72
+ params['trade_status']
73
+ end
74
+ private
75
+
76
+ # Take the posted data and move the relevant data into a hash
77
+ def parse(post)
78
+ @raw = post
79
+ for line in post.split('&')
80
+ key, value = *line.scan( %r{^(\w+)\=(.*)$} ).flatten
81
+ params[key] = value
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,39 @@
1
+ require 'active_merchant/billing/integrations/alipay/sign.rb'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Alipay
7
+ class Return < ActiveMerchant::Billing::Integrations::Return
8
+ include Sign
9
+
10
+ def order
11
+ @params["out_trade_no"]
12
+ end
13
+
14
+ def amount
15
+ @params["total_fee"]
16
+ end
17
+
18
+ def initialize(query_string)
19
+ super
20
+ end
21
+
22
+ def success?
23
+ unless verify_sign
24
+ @message = "Alipay Error: ILLEGAL_SIGN"
25
+ return false
26
+ end
27
+
28
+ true
29
+ end
30
+
31
+ def message
32
+ @message
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,26 @@
1
+ require 'digest/md5'
2
+ require 'cgi'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ module Integrations #:nodoc:
7
+ module Alipay
8
+ module Sign
9
+ def verify_sign
10
+ sign_type = @params.delete("sign_type")
11
+ sign = @params.delete("sign")
12
+
13
+ md5_string = @params.sort.collect do |s|
14
+ unless s[0] == "notify_id"
15
+ s[0]+"="+CGI.unescape(s[1])
16
+ else
17
+ s[0]+"="+s[1]
18
+ end
19
+ end
20
+ Digest::MD5.hexdigest(md5_string.join("&")+KEY) == sign.downcase
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/alipay/helper.rb'
2
+ require File.dirname(__FILE__) + '/alipay/notification.rb'
3
+ require File.dirname(__FILE__) + '/alipay/return.rb'
4
+
5
+ module ActiveMerchant #:nodoc:
6
+ module Billing #:nodoc:
7
+ module Integrations #:nodoc:
8
+ module Alipay
9
+
10
+ mattr_accessor :service_url
11
+ self.service_url = 'https://www.alipay.com/cooperate/gateway.do'
12
+
13
+ def self.notification(post)
14
+ Notification.new(post)
15
+ end
16
+
17
+ def self.return(query_string)
18
+ Return.new(query_string)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Bill99
7
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
8
+ mapping :account, 'merchant_id'
9
+ mapping :amount, 'amount'
10
+ mapping :currency, 'currency'
11
+
12
+ mapping :order, 'orderid'
13
+
14
+ mapping :customer, :name => 'pname',
15
+ :email => 'pemail'
16
+ mapping :pid, 'pid'
17
+
18
+ mapping :return_url, 'merchant_url'
19
+ mapping :description, 'commodity_info'
20
+ mapping :support_des, 'isSupportDES'
21
+ mapping :attach, 'merchant_param'
22
+
23
+ def sign
24
+ add_field('mac',
25
+ Digest::MD5.hexdigest("merchant_id=#{ACCOUNT}&orderid=#{order}&amount=#{amount}&merchant_url=#{return_url}" +
26
+ "&merchant_key=#{KEY}").upcase
27
+ )
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,55 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Bill99
7
+ class Return < ActiveMerchant::Billing::Integrations::Return
8
+
9
+ def account
10
+ @params["merchant_id"]
11
+ end
12
+
13
+ def order
14
+ @params["orderid"]
15
+ end
16
+
17
+ def amount
18
+ @params['amount']
19
+ end
20
+
21
+ def sign
22
+ @params['mac']
23
+ end
24
+
25
+ def success?
26
+ unless @params['succeed'] == "Y"
27
+ @message = "Bill99 Error: FALSE_RETURN"
28
+ return false
29
+ end
30
+ unless account == ACCOUNT
31
+ @message = "Bill99 Error: INCORRECT_ACCOUNT"
32
+ return false
33
+ end
34
+
35
+ hash_keys = %w(merchant_id orderid amount date succeed)
36
+
37
+ md5_string = hash_keys.inject([]){|array, key| array << "#{key}=#{@params[key]}"}.join("&")
38
+
39
+ unless Digest::MD5.hexdigest(md5_string+"&merchant_key=#{KEY}") == sign.downcase
40
+ @message = "Bill99 Error: ILLEGAL_SIGN"
41
+ return false
42
+ end
43
+
44
+ return true
45
+ end
46
+
47
+ def message
48
+ @message
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/bill99/helper.rb'
2
+ require File.dirname(__FILE__) + '/bill99/return.rb'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ module Integrations #:nodoc:
7
+ module Bill99
8
+
9
+ mattr_accessor :service_url
10
+ self.service_url = 'https://www.99bill.com/gateway/receiveMerchantInfoAction.do'
11
+
12
+ def self.notification(post)
13
+ Notification.new(post)
14
+ end
15
+
16
+ def self.return(query_string)
17
+ Return.new(query_string)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,38 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Tenpay
7
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
8
+ # Replace with the real mapping
9
+ mapping :account, 'bargainor_id'
10
+ mapping :amount, 'total_fee'
11
+
12
+ mapping :order, 'sp_billno'
13
+
14
+ mapping :cmdno, 'cmdno'
15
+ mapping :return_url, 'return_url'
16
+ mapping :description, 'desc'
17
+ mapping :attach, 'attach'
18
+ mapping :date, 'date'
19
+ mapping :currency, 'fee_type'
20
+ mapping :transaction_id, 'transaction_id'
21
+
22
+ def initialize(order, account, options = {})
23
+ super
24
+ add_field('bank_type', 0)
25
+ end
26
+
27
+ def sign
28
+ add_field('sign',
29
+ Digest::MD5.hexdigest("cmdno=#{cmdno}&date=#{date}&bargainor_id=#{account}" +
30
+ "&transaction_id=#{transaction_id}&sp_billno=#{order}&total_fee=#{amount}" +
31
+ "&fee_type=#{currency}&return_url=#{return_url}&attach=#{attach}&key=#{KEY}"))
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,48 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Tenpay
7
+ class Return < ActiveMerchant::Billing::Integrations::Return
8
+
9
+ def account
10
+ @params["bargainor_id"]
11
+ end
12
+
13
+ def order
14
+ @params["sp_billno"]
15
+ end
16
+
17
+ def amount
18
+ @params["total_fee"]
19
+ end
20
+
21
+ def success?
22
+ return false unless @params["pay_info"] == "OK" && @params["pay_result"] == "0"
23
+ unless account == ACCOUNT
24
+ @message = "Tenpay Error: INCORRECT_ACCOUNT"
25
+ return false
26
+ end
27
+
28
+ hash_keys = %w(cmdno pay_result date transaction_id sp_billno total_fee fee_type attach)
29
+
30
+ md5_string = hash_keys.inject([]){|array, key| array << "#{key}=#{@params[key]}"}.join("&")
31
+
32
+ unless Digest::MD5.hexdigest(md5_string+"&key=#{KEY}") == @params["sign"].downcase
33
+ @message = "Tenpay Error: ILLEGAL_SIGN"
34
+ return false
35
+ end
36
+
37
+ return true
38
+ end
39
+
40
+ def message
41
+ @message || @params['pay_info']
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,18 @@
1
+ require File.dirname(__FILE__) + '/tenpay/helper.rb'
2
+ require File.dirname(__FILE__) + '/tenpay/return.rb'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ module Integrations #:nodoc:
7
+ module Tenpay
8
+
9
+ mattr_accessor :service_url
10
+ self.service_url = 'https://www.tenpay.com/cgi-bin/v1.0/pay_gate.cgi'
11
+
12
+ def self.return(query_string)
13
+ Return.new(query_string)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ # ActivemerchantPatchForChina
2
+ require 'integrations_helper'
3
+ require 'active_merchant/billing/integrations/alipay'
4
+ require 'active_merchant/billing/integrations/bill99'
5
+ require 'active_merchant/billing/integrations/tenpay'
@@ -0,0 +1,11 @@
1
+ ActiveMerchant::Billing::Integrations::Helper.class_eval do
2
+ alias_method :origin_add_field, :add_field
3
+
4
+ def add_field(name, value)
5
+ if ![Array, Hash].include?(name.class) and value.nil?
6
+ @fields[name.to_s]
7
+ else
8
+ origin_add_field(name, value)
9
+ end
10
+ end
11
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ # Include hook code here
2
+ require 'activemerchant_patch_for_china'
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class ActivemerchantPatchForChinaTest < ActiveSupport::TestCase
4
+ # Replace this with your real tests.
5
+ test "the truth" do
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'active_support'
3
+ require 'active_support/test_case'
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activemerchant_patch_for_china
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Richard Huang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-24 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activemerchant
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.4.2
24
+ version:
25
+ description: A rails plugin to add an active_merchant patch for china online payment platform
26
+ email: flyerhzm@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.textile
33
+ files:
34
+ - MIT-LICENSE
35
+ - README.textile
36
+ - Rakefile
37
+ - VERSION
38
+ - lib/active_merchant/billing/integrations/alipay.rb
39
+ - lib/active_merchant/billing/integrations/alipay/helper.rb
40
+ - lib/active_merchant/billing/integrations/alipay/notification.rb
41
+ - lib/active_merchant/billing/integrations/alipay/return.rb
42
+ - lib/active_merchant/billing/integrations/alipay/sign.rb
43
+ - lib/active_merchant/billing/integrations/bill99.rb
44
+ - lib/active_merchant/billing/integrations/bill99/helper.rb
45
+ - lib/active_merchant/billing/integrations/bill99/return.rb
46
+ - lib/active_merchant/billing/integrations/tenpay.rb
47
+ - lib/active_merchant/billing/integrations/tenpay/helper.rb
48
+ - lib/active_merchant/billing/integrations/tenpay/return.rb
49
+ - lib/activemerchant_patch_for_china.rb
50
+ - lib/integrations_helper.rb
51
+ - rails/init.rb
52
+ - test/activemerchant_patch_for_china_test.rb
53
+ - test/test_helper.rb
54
+ has_rdoc: true
55
+ homepage: http://github.com/flyerhzm/activemerchant_patch_for_china
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options:
60
+ - --charset=UTF-8
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.5
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: A rails plugin to add an active_merchant patch for china online payment platform
82
+ test_files:
83
+ - test/activemerchant_patch_for_china_test.rb
84
+ - test/test_helper.rb