veritrans 1.0.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/bin/veritrans ADDED
@@ -0,0 +1,79 @@
1
+ require File.expand_path(
2
+ File.join(File.dirname(__FILE__),%w[.. lib veritrans]))
3
+ wpath= File.dirname(__FILE__).gsub(/bin$/,'')
4
+
5
+ def howto_veritrans
6
+ puts <<END
7
+
8
+ How to Veritrans:
9
+ ~~~~~~~~~~~~~~~~~~~~~~~
10
+ syntax:
11
+ veritrans -irb
12
+
13
+ example:
14
+ veritrans -irb #=> Start IRB
15
+
16
+ Enjoy...
17
+ END
18
+
19
+ end
20
+
21
+ arg = ARGV
22
+ if arg.size==0
23
+ howto_veritrans
24
+ exit
25
+ end
26
+
27
+ if arg.select{|x|x=='-irb'} != []
28
+ ARGV.reject!{|x|x=='-irb'}
29
+
30
+ require 'irb'
31
+ puts <<EOF
32
+ example:
33
+ require 'veritrans'
34
+
35
+ client = Veritrans::Client.new
36
+ client.order_id = "#{(0...4).map{65.+(rand(25))}.join}"
37
+ client.session_id = "#{(0...4).map{65.+(rand(25))}.join}"
38
+ client.gross_amount = "10"
39
+ client.commodity = [
40
+ {"COMMODITY_ID" => "IDxx1", "COMMODITY_UNIT" => "10", "COMMODITY_NUM" => "1", "COMMODITY_NAME1" => "Waterbotle", "COMMODITY_NAME2" => "Waterbottle in Indonesian"}
41
+ ]
42
+ client.shipping_flag = "1"
43
+ client.shipping_first_name = "Sam"
44
+ client.shipping_last_name = "Anthony"
45
+ client.shipping_address1 = "Buaran I"
46
+ client.shipping_address2 = "Pulogadung"
47
+ client.shipping_city = "Jakarta"
48
+ client.shipping_country_code = "IDN"
49
+ client.shipping_postal_code = "16954"
50
+ client.shipping_phone = "0123456789123"
51
+ client.shipping_method = "N"
52
+ client.get_keys
53
+ client
54
+
55
+ OR
56
+
57
+ client = Veritrans::Client.new do |me|
58
+ me.order_id = "dummy#{(0...12).map{65.+(rand(25))}.join}"
59
+ me.session_id = "session#{(0...12).map{65.+(rand(25))}.join}"
60
+ me.gross_amount = "10"
61
+ me.commodity = [
62
+ {"COMMODITY_ID" => "IDxx1", "COMMODITY_UNIT" => "10", "COMMODITY_NUM" => "1", "COMMODITY_NAME1" => "Waterbotle", "COMMODITY_NAME2" => "Waterbottle in Indonesian"}
63
+ ]
64
+ me.shipping_flag = "1"
65
+ me.shipping_first_name = "Sam"
66
+ me.shipping_last_name = "Anthony"
67
+ me.shipping_address1 = "Buaran I"
68
+ me.shipping_address2 = "Pulogadung"
69
+ me.shipping_city = "Jakarta"
70
+ me.shipping_country_code = "IDN"
71
+ me.shipping_postal_code = "16954"
72
+ me.shipping_phone = "0123456789123"
73
+ me.shipping_method = "N"
74
+ end
75
+
76
+ EOF
77
+
78
+ IRB.start
79
+ end
@@ -0,0 +1,15 @@
1
+ development:
2
+ merchant_id: "test_id"
3
+ merchant_hash_key: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789012345678901"
4
+ finish_payment_return_url: "http://localhost/finish"
5
+ unfinish_payment_return_url: "http://localhost/cancel"
6
+ error_payment_return_url: "http://localhost/error"
7
+ # server_host: "http://192.168.10.250:80"
8
+
9
+ production:
10
+ merchant_id: "production_id"
11
+ merchant_hash_key: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789012345678901"
12
+ finish_payment_return_url: "http://mydomain/finish"
13
+ unfinish_payment_return_url: "http://mydomain/cancel"
14
+ error_payment_return_url: "http://mydomain/error"
15
+ # server_host: "http://192.168.10.250:80"
@@ -0,0 +1,61 @@
1
+ if ::Object.const_defined?(:Rails)
2
+
3
+ require 'rails/generators'
4
+
5
+ module Veritrans
6
+ module Generators
7
+ class InstallGenerator < ::Rails::Generators::Base
8
+
9
+ desc <<DESC
10
+ Description:
11
+ Copy templates need for veritrans weblinktype payment:
12
+ 0. app/controllers/merchant_controller.rb + views
13
+ 1. app/controllers/veritrans_controller.rb + views
14
+ 2. config/veritrans.yml
15
+ 3. config/routes.rb
16
+ DESC
17
+ def create_controller_file
18
+ acts = "app/controllers/"
19
+ path = __FILE__.sub(__FILE__.split('/').pop,"templates/#{acts}")
20
+ create_file("#{acts}merchant_controller.rb", IO.read("#{path}merchant_controller.rb"))
21
+ create_file("#{acts}veritrans_controller.rb",IO.read("#{path}veritrans_controller.rb"))
22
+ end
23
+
24
+ def create_view_files
25
+ acts = "app/views/layouts/"
26
+ path = __FILE__.sub(__FILE__.split('/').pop,"templates/#{acts}")
27
+ create_file("#{acts}layout_auto_post.html.erb",IO.read("#{path}layout_auto_post.html.erb" ))
28
+
29
+ acts = "app/views/merchant/"
30
+ path = __FILE__.sub(__FILE__.split('/').pop,"templates/#{acts}")
31
+ create_file("#{acts}checkout.html.erb",IO.read("#{path}checkout.html.erb" ))
32
+
33
+ acts = "app/views/veritrans/"
34
+ path = __FILE__.sub(__FILE__.split('/').pop,"templates/#{acts}")
35
+ create_file("#{acts}confirm.html.erb", IO.read("#{path}confirm.html.erb"))
36
+ create_file("#{acts}cancel.html.erb", IO.read("#{path}cancel.html.erb" ))
37
+ create_file("#{acts}pay.html.erb", IO.read("#{path}pay.html.erb" ))
38
+ create_file("#{acts}finish.html.erb", IO.read("#{path}finish.html.erb" ))
39
+ create_file("#{acts}error.html.erb", IO.read("#{path}error.html.erb" ))
40
+ end
41
+
42
+ def create_or_update_config_files
43
+ path = __FILE__.sub(__FILE__.split('/').pop,'templates/config/')
44
+ create_file("config/veritrans.yml",IO.read("#{path}veritrans.yml"))
45
+ end
46
+
47
+ def update_routes
48
+ route("match 'checkout' => 'merchant#checkout', :via => :get # show checkout form")
49
+ route("match 'confirm' => 'veritrans#confirm', :via => :post # pay-confirmation autosubmit to veritrans server")
50
+ route("match 'cancel' => 'veritrans#cancel', :via => :post # canceling transaction redirect back to merchant-web")
51
+ route("match 'pay' => 'veritrans#pay', :via => :post # server to server pay-notification to merchant-web")
52
+ route("match 'finish' => 'veritrans#finish', :via => :post # successfull transaction redirect back to merchant-web")
53
+ route("match 'error' => 'veritrans#error', :via => :post # error transaction redirect back to merchant-web")
54
+ end
55
+
56
+ hook_for :test_framework
57
+ end
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,7 @@
1
+ class MerchantController < ApplicationController
2
+
3
+ # show checkout-form
4
+ def checkout
5
+ end
6
+
7
+ end
@@ -0,0 +1,110 @@
1
+ class VeritransController < ApplicationController
2
+
3
+ # post action after user submit checkout-form
4
+ # Ex POST:
5
+ # {"gross_amount" => "7000000",
6
+ # "commodity"=>[
7
+ # {
8
+ # "COMMODITY_ID" => "Espirit",
9
+ # "COMMODITY_UNIT" => "500000",
10
+ # "COMMODITY_NUM" => "4",
11
+ # "COMMODITY_NAME1" => "Espirit"
12
+ # },
13
+ # {
14
+ # "COMMODITY_ID" => "Tablet",
15
+ # "COMMODITY_UNIT" => "2500000",
16
+ # "COMMODITY_NUM" => "2",
17
+ # "COMMODITY_NAME1" => "Tablet"
18
+ # }]}
19
+ # Return from get_keys:
20
+ # TOKEN_MERCHANT = dYWRjRr2ZbJEqMQaqDLIaWeoLl1Tuk3g7g3T1gKGrE5ibYJoZ4
21
+ # TOKEN_BROWSER = lh4TxpAyB2NhrKTlqGbW1LRPoA6RgyI6roJ2EIII6J29j7gYoP
22
+ def confirm
23
+ puts params.inspect
24
+ client = ::Veritrans::Client.new
25
+ client.order_id = "dummy#{(0...12).map{65.+(rand(25))}.join}"
26
+ client.session_id = "session#{(0...12).map{65.+(rand(25))}.join}"
27
+ client.gross_amount = params["gross_amount"]
28
+ client.commodity = params["commodity"]
29
+
30
+ client.customer_specification_flag = "1" #'1':Different Address with shipping
31
+ client.shipping_flag = "0" #'0':Not required shipping address
32
+
33
+ client.first_name = "Sam"
34
+ client.last_name = "Anthony"
35
+ client.address1 = "Buaran I"
36
+ client.address2 = "Pulogadung"
37
+ client.city = "Jakarta"
38
+ client.country_code = "IDN"
39
+ client.postal_code = "16954"
40
+ client.phone = "0123456789123"
41
+ client.email = "sam.anthony@gmail.com" # pay-notification email
42
+
43
+ client.get_keys
44
+ @client = client
45
+
46
+ puts client.inspect
47
+ # puts params.inspect
48
+
49
+ render :layout => 'layout_auto_post'
50
+ end
51
+
52
+ # post-redirection from Veritrans to Merchants Web
53
+ # Ex: {"orderId" =>"dummy877684698685878869896765",
54
+ # "sessionId"=>"session837985748788668181718189"}
55
+ def cancel
56
+ # logic after user cancel the transaction
57
+
58
+ puts "cccccccccccccc"
59
+ puts params.inspect
60
+
61
+ render :text => "CANCEL_PAY"
62
+ end
63
+
64
+ # Server to Server post-notification(action) from Veritrans to Merchants Server
65
+ # Ex: {"mErrMsg"=>"",
66
+ # "mStatus"=>"success",
67
+ # "TOKEN_MERCHANT"=>"dYWRjRr2ZbJEqMQaqDLIaWeoLl1Tuk3g7g3T1gKGrE5ibYJoZ4",
68
+ # "vResultCode"=>"C001000000000000",
69
+ # "orderId"=>"dummy877684698685878869896765"}
70
+ def pay
71
+ # logic to check:
72
+ # 1.validate request
73
+ # 2.update db if valid
74
+
75
+ puts "vvvvvvvvvvvvvv"
76
+ puts params.inspect
77
+
78
+ render :text => "OK"
79
+ end
80
+
81
+ # post-redirection from Veritrans to Merchants Web
82
+ # Ex: {"orderId"=>"dummy877684698685878869896765",
83
+ # "mStatus"=>"success",
84
+ # "vResultCode"=>"C001000000000000",
85
+ # "sessionId"=>"session837985748788668181718189"}
86
+ def finish
87
+ # logic after success transaction occured
88
+
89
+ puts "ffffffffffffff"
90
+ puts params.inspect
91
+
92
+ render :text => "FINISH"
93
+ end
94
+
95
+ # need scenario that could be try
96
+ # post-redirection from Veritrans to Merchants Web
97
+ # Ex: {"orderId"=>"dummy877684698685878869896765",
98
+ # "mStatus"=>"failure",
99
+ # "vResultCode"=>"NH13000000000000",
100
+ # "sessionId"=>"session837985748788668181718189"}
101
+ def error
102
+ # logic after error transaction occured
103
+
104
+ puts "eeeeeeeeeeeeee"
105
+ puts params.inspect
106
+
107
+ render :text => "ERROR"
108
+ end
109
+
110
+ end
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <script language="javascript" type="text/javascript">
5
+ <!--
6
+ function onloadEvent() {
7
+ document.form_auto_post.submit();
8
+ }
9
+ //-->
10
+ </script>
11
+ </head>
12
+ <body onload="onloadEvent();">
13
+ <%= yield %>
14
+ </body>
15
+ </html>
@@ -0,0 +1,46 @@
1
+ <%= form_tag('/confirm', :id =>"cart_form") do -%>
2
+ <table border=1>
3
+ <tbody>
4
+ <tr>
5
+ <th>Product Image</th>
6
+ <th>Product Info</th>
7
+ <th>Price</th>
8
+ <th align="center">Qty</th>
9
+ <th>Total Price</th>
10
+ </tr>
11
+ <tr>
12
+ <td><img src="/assets/esprit.png" title="Esprit"></td>
13
+ <td>Red Esprint</td>
14
+ <td align="right">Rp 500,000</td>
15
+ <td align="center">4</td>
16
+ <td align="right">Rp 2,000,000</td>
17
+ </tr>
18
+ <tr>
19
+ <td><img src="/assets/tablet.jpg" title="Tablet"></td>
20
+ <td>Android Tablet</td>
21
+ <td align="right">Rp 2,500,000</td>
22
+ <td align="center">2</td>
23
+ <td align="right">Rp 5,000,000</td>
24
+ </tr>
25
+ <tr class="subtotal">
26
+ <td colspan="3">
27
+ <input class="checkout" name="commit" type="submit" value="Checkout">
28
+ </td>
29
+ <td><strong>Subtotal:</strong></td>
30
+ <td align="right"><strong>Rp 7,000,000</strong></td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+
35
+ <input type="hidden" name="commodity[][COMMODITY_ID]" value="Espirit"/>
36
+ <input type="hidden" name="commodity[][COMMODITY_UNIT]" value="500000"/>
37
+ <input type="hidden" name="commodity[][COMMODITY_NUM]" value="4"/>
38
+ <input type="hidden" name="commodity[][COMMODITY_NAME1]" value="Espirit"/>
39
+
40
+ <input type="hidden" name="commodity[][COMMODITY_ID]" value="Tablet"/>
41
+ <input type="hidden" name="commodity[][COMMODITY_UNIT]" value="2500000"/>
42
+ <input type="hidden" name="commodity[][COMMODITY_NUM]" value="2"/>
43
+ <input type="hidden" name="commodity[][COMMODITY_NAME1]" value="Tablet"/>
44
+
45
+ <input type="hidden" name="gross_amount" value="7000000"/>
46
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h1>Veritrans#unfinish</h1>
2
+ <p>Find me in app/views/veritrans/unfinish.html.erb</p>
@@ -0,0 +1,13 @@
1
+ <h1 align="center">Go to select payment options</h1>
2
+
3
+ <%= form_tag(@client.redirect_url, :name => "form_auto_post") do -%>
4
+ <input type="hidden" name="MERCHANT_ID" value="<%= @client.merchant_id %>">
5
+ <input type="hidden" name="ORDER_ID" value="<%= @client.order_id %>">
6
+ <input type="hidden" name="TOKEN_BROWSER" value="<%= @client.token["TOKEN_BROWSER"] %>">
7
+ <table border="1" align="center" width="80%" cellpadding="10" bgcolor="#FFFFCC">
8
+ </table>
9
+ <br><br>
10
+ <div align="center">
11
+ <input type="submit" value="submit">
12
+ </div>
13
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h1>Veritrans#error</h1>
2
+ <p>Find me in app/views/veritrans/error.html.erb</p>
@@ -0,0 +1,2 @@
1
+ <h1>Veritrans#finish</h1>
2
+ <p>Find me in app/views/veritrans/finish.html.erb</p>
@@ -0,0 +1,2 @@
1
+ <h1>Veritrans#postvtw</h1>
2
+ <p>Find me in app/views/veritrans/postvtw.html.erb</p>
@@ -0,0 +1,15 @@
1
+ development:
2
+ merchant_id: "test_id"
3
+ merchant_hash_key: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789012345678901"
4
+ unfinish_payment_return_url: "http://localhost/cancel"
5
+ finish_payment_return_url: "http://localhost/finish"
6
+ error_payment_return_url: "http://localhost/error"
7
+ # server_host: "http://192.168.10.250:80"
8
+
9
+ production:
10
+ merchant_id: "production_id"
11
+ merchant_hash_key: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789012345678901"
12
+ unfinish_payment_return_url: "http://mydomain/cancel"
13
+ finish_payment_return_url: "http://mydomain/finish"
14
+ error_payment_return_url: "http://mydomain/error"
15
+ # server_host: "http://192.168.10.250:80"
data/lib/veritrans.rb ADDED
@@ -0,0 +1,18 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ # Required gems
4
+ require 'rubygems'
5
+ require 'digest/sha2'
6
+ require "addressable/uri"
7
+ require 'faraday'
8
+
9
+ # root namespace
10
+ module Veritrans
11
+ end
12
+
13
+ require 'veritrans/hash_generator'
14
+ require 'veritrans/post_data'
15
+ require 'veritrans/version'
16
+ require 'veritrans/config'
17
+ require 'veritrans/client'
18
+ require 'generators/install_generator.rb'
@@ -0,0 +1,156 @@
1
+ # :nodoc:
2
+ module Veritrans
3
+
4
+ # :nodoc:
5
+ class Client
6
+ include Config
7
+
8
+ # constructor to create instance of Veritrans::Client
9
+ def initialize(&block)
10
+ class <<self
11
+ self
12
+ end.class_eval do
13
+ attr_accessor(:commodity, *PostData::PostParam)
14
+ end
15
+
16
+ # return-back to merchant-web
17
+ self.customer_specification_flag = Config::CUSTOMER_SPECIFICATION_FLAG
18
+ self.settlement_type = Config::SETTLEMENT_TYPE_CARD
19
+
20
+ if block_given?
21
+ yield(self) #self.instance_eval(&block)
22
+ return self.get_keys
23
+ end
24
+ end
25
+
26
+ #
27
+ # Example:
28
+ #
29
+ # client = Veritrans::Client.new
30
+ # client.order_id = "dummy#{(0...12).map{65.+(rand(25))}.join}"
31
+ # client.session_id = "session#{(0...12).map{65.+(rand(25))}.join}"
32
+ # client.gross_amount = "10"
33
+ # client.commodity = [{
34
+ # "COMMODITY_ID" => "IDxx1",
35
+ # "COMMODITY_UNIT" => "10",
36
+ # "COMMODITY_NUM" => "1",
37
+ # "COMMODITY_NAME1" => "Waterbotle",
38
+ # "COMMODITY_NAME2" => "Waterbottle in Indonesian"}]
39
+ # client.get_keys
40
+ #
41
+ def get_keys
42
+ init_instance
43
+
44
+ params = prepare_params(PostData::ServerParam,PostData::PostParam)
45
+
46
+ if @commodity.class == Array
47
+ commodity = @commodity.collect do |data|
48
+ uri = Addressable::URI.new
49
+ uri.query_values = data
50
+ uri.query
51
+ end
52
+ end
53
+
54
+ uri = Addressable::URI.new
55
+ uri.query_values = params
56
+ query_string = "#{uri.query}&REPEAT_LINE=#{@commodity.length}&#{commodity.join('&')}"
57
+ # puts query_string
58
+
59
+ conn = Faraday.new(:url => server_host)
60
+ @resp = conn.post do |req|
61
+ req.url(Config::REQUEST_KEY_URL)
62
+ req.body = query_string
63
+ end.env
64
+ # puts query_string
65
+
66
+ delete_keys
67
+ @resp[:url] = @resp[:url].to_s
68
+
69
+ @token = parse_body(@resp[:body])
70
+ end
71
+
72
+ # :nodoc:
73
+ def server_host
74
+ return Client.config["server_host"] ? Client.config["server_host"] : Config::SERVER_HOST
75
+ end
76
+
77
+ def redirect_url
78
+ "#{server_host}/web1/paymentStart.action"
79
+ end
80
+
81
+ # :nodoc:
82
+ def merchant_id
83
+ return Client.config["merchant_id"]
84
+ end
85
+
86
+ # :nodoc:
87
+ def merchant_id= new_merchant_id
88
+ Client.config["merchant_id"] = new_merchant_id
89
+ end
90
+
91
+ # :nodoc:
92
+ def merchant_hash_key
93
+ return Client.config["merchant_hash_key"]
94
+ end
95
+
96
+ # :nodoc:
97
+ def merchant_hash_key= new_merchant_hash_key
98
+ Client.config["merchant_hash_key"] = new_merchant_hash_key
99
+ end
100
+
101
+ # :nodoc:
102
+ def error_payment_return_url
103
+ return Client.config["error_payment_return_url"]
104
+ end
105
+
106
+ # :nodoc:
107
+ def finish_payment_return_url
108
+ return Client.config["finish_payment_return_url"]
109
+ end
110
+
111
+ # :nodoc:
112
+ def unfinish_payment_return_url
113
+ return Client.config["unfinish_payment_return_url"]
114
+ end
115
+
116
+ # :nodoc:
117
+ def token
118
+ return @token
119
+ end
120
+
121
+ private
122
+
123
+ def merchanthash
124
+ # Generate merchant hash code
125
+ return HashGenerator::generate(merchant_id, merchant_hash_key, settlement_type, order_id, gross_amount);
126
+ end
127
+
128
+ def parse_body(body)
129
+ arrs = body.split("\r\n")
130
+ arrs = arrs[-2,2] if arrs.length > 1
131
+ return Hash[arrs.collect{|x|x.split("=")}]
132
+ end
133
+
134
+ def init_instance
135
+ @token = nil
136
+ end
137
+
138
+ def prepare_params(*arg)
139
+ params = {}
140
+ arg.flatten.each do |key|
141
+ value = self.send(key)
142
+ params[key.upcase] = value if value
143
+ end
144
+ return params
145
+ end
146
+
147
+ def delete_keys
148
+ @resp.delete(:ssl)
149
+ @resp.delete(:request)
150
+ @resp.delete(:response)
151
+ @resp.delete(:request_headers)
152
+ @resp.delete(:parallel_manager)
153
+ end
154
+
155
+ end
156
+ end
@@ -0,0 +1,46 @@
1
+ require "yaml"
2
+
3
+ # :nodoc:
4
+ module Veritrans
5
+
6
+ # hold constants configuration define in server merchant
7
+ module Config
8
+
9
+ # server Veritrans - defined in gem - no change!
10
+ SERVER_HOST = 'https://payments.veritrans.co.id' #'http://192.168.10.250:80'
11
+
12
+ # Request Key Url - use in #get_keys - defined in gem - no change!
13
+ REQUEST_KEY_URL = "/web1/commodityRegist.action"
14
+
15
+ # Payment Redirect Url - defined in gem - no change!
16
+ PAYMENT_REDIRECT_URL = "/web1/deviceCheck.action"
17
+
18
+ # :nodoc:
19
+ CUSTOMER_SPECIFICATION_FLAG = '0' #Billing same as shipping address '1' Different, manually input in Veritrans-web
20
+
21
+ # Default Settlement method:
22
+ SETTLEMENT_TYPE_CARD = "01" #Paymanet Type
23
+
24
+ # Flag: Sales and Sales Credit, 0: only 1 credit. If not specified, 0
25
+ CARD_CAPTURE_FLAG = "1"
26
+
27
+ def Config.included(mod)
28
+ class <<self
29
+ @@config_env = ::Object.const_defined?(:Rails) ? Rails.env : "development"
30
+ @@config = File.exists?("./config/veritrans.yml") ? YAML.load_file("./config/veritrans.yml") : nil
31
+ end
32
+
33
+ mod.instance_eval <<CODE
34
+
35
+ def self.config_env=(env)
36
+ @@config_env = env
37
+ end
38
+
39
+ def self.config
40
+ @@config[@@config_env]
41
+ end
42
+ CODE
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,19 @@
1
+ # :nodoc:
2
+ module Veritrans
3
+
4
+ # :nodoc:
5
+ module HashGenerator
6
+
7
+ # Generate hash using SHA-512.
8
+ #
9
+ # Parameters:
10
+ # * <tt>[String]merchant_id</tt> - Merchant ID
11
+ # * <tt>[String]merchant_hash_key</tt> - Merchant Hash key
12
+ # * <tt>[String]settlement_method</tt> - '01' Credit Card
13
+ # * <tt>[String]order_id</tt>
14
+ # * <tt>[String]amount</tt>
15
+ def self.generate(merchant_id, merchant_hash_key, settlement_method, order_id, amount)
16
+ Digest::SHA512.hexdigest("#{merchant_hash_key},#{merchant_id},#{settlement_method},#{order_id},#{amount}")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,144 @@
1
+ # :nodoc:
2
+ module Veritrans
3
+
4
+ # hold information of "post data" need to pass when server need to get_keys
5
+ module PostData
6
+
7
+ # +:merchant_id,+
8
+ # +:merchant_url,+
9
+ # +:session_id,+
10
+ # +:finish_payment_return_url,+
11
+ # +:unfinish_payment_return_url,+
12
+ # +:error_payment_return_url
13
+ Merchant =[
14
+ :merchant_id,
15
+ :merchant_url,
16
+ :finish_payment_return_url,
17
+ :unfinish_payment_return_url,
18
+ :error_payment_return_url
19
+ ]
20
+
21
+ # +:settlement_type,+
22
+ # +:gross_amount,+
23
+ # +:card_no,+
24
+ # +:card_exp_date,+
25
+ # +:customer_id,+
26
+ # +:previous_customer_flag,+
27
+ # +:customer_status,+
28
+ Payment =[
29
+ :settlement_type,
30
+ :gross_amount,
31
+ :card_no,
32
+ :card_exp_date, # mm/yy
33
+ :customer_id,
34
+ :previous_customer_flag,
35
+ :customer_status,
36
+ ]
37
+
38
+ # +:first_name,+
39
+ # +:last_name,+
40
+ # +:address1,+
41
+ # +:address2,+
42
+ # +:city,+
43
+ # +:country_code,+
44
+ # +:postal_code,+
45
+ # +:phone,+
46
+ # +:email,+
47
+ # customer_specification_flag,
48
+ Personal =[
49
+ :first_name,
50
+ :last_name,
51
+ :address1,
52
+ :address2,
53
+ :city,
54
+ :country_code,
55
+ :postal_code,
56
+ :phone,
57
+ :email,
58
+ :customer_specification_flag
59
+ ]
60
+
61
+ # +:shipping_flag,
62
+ # +:shipping_first_name,
63
+ # +:shipping_last_name,
64
+ # +:shipping_address1,
65
+ # +:shipping_address2,
66
+ # +:shipping_city,
67
+ # +:shipping_country_code,
68
+ # +:shipping_postal_code,
69
+ # +:shipping_phone,
70
+ # +:shipping_method,
71
+ Shipping =[
72
+ :shipping_flag,
73
+ :shipping_first_name,
74
+ :shipping_last_name,
75
+ :shipping_address1,
76
+ :shipping_address2,
77
+ :shipping_city,
78
+ :shipping_country_code,
79
+ :shipping_postal_code,
80
+ :shipping_phone,
81
+ :shipping_method
82
+ ]
83
+
84
+ # +:lang_enable_flag,+
85
+ # +:lang+
86
+ Language =[
87
+ :lang_enable_flag,
88
+ :lang
89
+ ]
90
+
91
+ # +:repeat_line,+
92
+ # +:purchases,+
93
+ Purchases =[
94
+ :repeat_line,
95
+ :purchases
96
+ ]
97
+
98
+ # +:commodity_id,+
99
+ # +:commodity_unit,+
100
+ # +:commodity_num,+
101
+ # +:commodity_name1,+
102
+ # +:commodity_name2+
103
+ PurchaseParam =[
104
+ :commodity_id,
105
+ :commodity_unit,
106
+ :commodity_num,
107
+ :commodity_name1,
108
+ :commodity_name2
109
+ ]
110
+
111
+ # +:order_id,+
112
+ # +:session_id,+
113
+ # +:merchanthash,+
114
+ # +:card_capture_flag+
115
+ OtherParam =[
116
+ :order_id,
117
+ :session_id,
118
+ :merchanthash,
119
+ :card_capture_flag
120
+ ]
121
+
122
+ # +:merchant_id,+
123
+ # +:merchanthash,+
124
+ # +:finish_payment_return_url,+
125
+ # +:unfinish_payment_return_url,+
126
+ # +:error_payment_return_url+
127
+ ServerParam =[
128
+ :merchant_id,
129
+ :merchanthash,
130
+ :finish_payment_return_url,
131
+ :unfinish_payment_return_url,
132
+ :error_payment_return_url
133
+ ]
134
+
135
+ # Params are the combination of this group:
136
+ PostParam = (Merchant + Payment + Personal + Shipping + Language + Purchases + OtherParam) - ServerParam
137
+ end
138
+
139
+ # Sample of Array of purchase commodity
140
+ # [
141
+ # {"COMMODITY_ID" => "1233", "COMMODITY_UNIT" => "1", "COMMODITY_NUM" => "1", "COMMODITY_NAME1" => "BUKU", "COMMODITY_NAME2" => "BOOK"},
142
+ # {"COMMODITY_ID" => "1243", "COMMODITY_UNIT" => "9", "COMMODITY_NUM" => "1", "COMMODITY_NAME1" => "BUKU Sembilan", "COMMODITY_NAME2" => "BOOK NINE"}
143
+ # ]
144
+ end
@@ -0,0 +1,43 @@
1
+ # :nodoc:
2
+ module Veritrans
3
+ # hold version number of this library
4
+ # it use class methods to generate it
5
+ #
6
+ # Example:
7
+ #
8
+ # Veritrans::Version.to_s
9
+ class Version
10
+
11
+ class <<self
12
+
13
+ private
14
+
15
+ # :nodoc:
16
+ def major
17
+ 1
18
+ end
19
+
20
+ # :nodoc:
21
+ def minor
22
+ 0
23
+ end
24
+
25
+ # :nodoc:
26
+ def patch
27
+ 0
28
+ end
29
+
30
+ # :nodoc:
31
+ def pre
32
+ nil
33
+ end
34
+ end
35
+
36
+ # ==== Return:
37
+ #
38
+ # * <tt>String</tt> - version information
39
+ def self.to_s
40
+ [major, minor, patch, pre].compact.join('.')
41
+ end
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: veritrans
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Veritrans Dev Team
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: addressable
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: faraday
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description:
63
+ email:
64
+ - dev@veritrans.co.id
65
+ executables:
66
+ - veritrans
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - config/veritrans.yml
71
+ - bin/veritrans
72
+ - lib/veritrans.rb
73
+ - lib/veritrans/client.rb
74
+ - lib/veritrans/config.rb
75
+ - lib/veritrans/hash_generator.rb
76
+ - lib/veritrans/post_data.rb
77
+ - lib/veritrans/version.rb
78
+ - lib/generators/install_generator.rb
79
+ - lib/generators/templates/app/controllers/merchant_controller.rb
80
+ - lib/generators/templates/app/controllers/veritrans_controller.rb
81
+ - lib/generators/templates/app/views/layouts/layout_auto_post.html.erb
82
+ - lib/generators/templates/app/views/merchant/checkout.html.erb
83
+ - lib/generators/templates/app/views/veritrans/confirm.html.erb
84
+ - lib/generators/templates/app/views/veritrans/error.html.erb
85
+ - lib/generators/templates/app/views/veritrans/finish.html.erb
86
+ - lib/generators/templates/app/views/veritrans/pay.html.erb
87
+ - lib/generators/templates/app/views/veritrans/cancel.html.erb
88
+ - lib/generators/templates/config/veritrans.yml
89
+ homepage: http://veritrans.co.id
90
+ licenses: []
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ segments:
102
+ - 0
103
+ hash: -1916124557783123575
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project: veritrans
112
+ rubygems_version: 1.8.24
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Veritrans Webclient wrapper
116
+ test_files: []