veritrans 1.2.6 → 2.0.0beta

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 (73) hide show
  1. checksums.yaml +13 -5
  2. data/.gitignore +4 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +5 -0
  5. data/Gemfile.lock +111 -0
  6. data/README.md +258 -0
  7. data/Rakefile +7 -0
  8. data/api_reference.md +219 -0
  9. data/bin/veritrans +59 -48
  10. data/example/index.erb +118 -0
  11. data/example/response.erb +28 -0
  12. data/example/sinatra.rb +76 -0
  13. data/example/style.css +45 -0
  14. data/example/veritrans.yml +12 -0
  15. data/lib/generators/templates/assets/credit_card_form.js +50 -0
  16. data/lib/generators/templates/payments_controller.rb +81 -0
  17. data/lib/generators/templates/veritrans.rb +43 -0
  18. data/lib/generators/templates/veritrans.yml +13 -0
  19. data/lib/generators/templates/views/_credit_card_form.erb +42 -0
  20. data/lib/generators/templates/views/_veritrans_include.erb +10 -0
  21. data/lib/generators/templates/views/payments/create.erb +15 -0
  22. data/lib/generators/templates/views/payments/new.erb +6 -0
  23. data/lib/generators/veritrans/install_generator.rb +32 -0
  24. data/lib/generators/veritrans/payment_form_generator.rb +45 -0
  25. data/lib/veritrans/api.rb +90 -0
  26. data/lib/veritrans/cli.rb +166 -0
  27. data/lib/veritrans/client.rb +77 -209
  28. data/lib/veritrans/config.rb +48 -62
  29. data/lib/veritrans/events.rb +125 -0
  30. data/lib/veritrans/result.rb +81 -0
  31. data/lib/veritrans/version.rb +1 -41
  32. data/lib/veritrans.rb +79 -15
  33. data/license.txt +202 -0
  34. data/spec/cli_spec.rb +86 -0
  35. data/spec/configs/veritrans.yml +7 -0
  36. data/spec/configs/veritrans_flat.yml +2 -0
  37. data/spec/fixtures/approve_failed.yml +48 -0
  38. data/spec/fixtures/cancel_failed.yml +48 -0
  39. data/spec/fixtures/cancel_success.yml +106 -0
  40. data/spec/fixtures/capture_failed.yml +48 -0
  41. data/spec/fixtures/charge.yml +50 -0
  42. data/spec/fixtures/charge_direct.yml +56 -0
  43. data/spec/fixtures/charge_vtweb.yml +50 -0
  44. data/spec/fixtures/cli_test_1111-not-exists.yml +45 -0
  45. data/spec/fixtures/cli_test_not_exists.yml +45 -0
  46. data/spec/fixtures/cli_test_real_txn.yml +55 -0
  47. data/spec/fixtures/cli_test_unauthorized.yml +47 -0
  48. data/spec/fixtures/events_test_real_txn.yml +55 -0
  49. data/spec/fixtures/status_fail.yml +46 -0
  50. data/spec/fixtures/status_success.yml +109 -0
  51. data/spec/spec_helper.rb +29 -0
  52. data/spec/veritrans_client_spec.rb +83 -0
  53. data/spec/veritrans_config_spec.rb +48 -0
  54. data/spec/veritrans_events_spec.rb +70 -0
  55. data/spec/veritrans_logger_spec.rb +46 -0
  56. data/testing_webhooks.md +80 -0
  57. data/veritrans.gemspec +23 -0
  58. metadata +82 -31
  59. data/config/veritrans.yml +0 -24
  60. data/lib/generators/install_generator.rb +0 -78
  61. data/lib/generators/templates/app/controllers/vtlink/merchant_controller.rb +0 -7
  62. data/lib/generators/templates/app/controllers/vtlink/veritrans_controller.rb +0 -112
  63. data/lib/generators/templates/app/views/layouts/layout_auto_post.html.erb +0 -15
  64. data/lib/generators/templates/app/views/vtlink/merchant/checkout.html.erb +0 -43
  65. data/lib/generators/templates/app/views/vtlink/veritrans/cancel.html.erb +0 -2
  66. data/lib/generators/templates/app/views/vtlink/veritrans/confirm.html.erb +0 -13
  67. data/lib/generators/templates/app/views/vtlink/veritrans/error.html.erb +0 -2
  68. data/lib/generators/templates/app/views/vtlink/veritrans/finish.html.erb +0 -2
  69. data/lib/generators/templates/app/views/vtlink/veritrans/pay.html.erb +0 -2
  70. data/lib/generators/templates/config/veritrans.yml +0 -13
  71. data/lib/veritrans/hash_generator.rb +0 -19
  72. data/lib/veritrans/post_data.rb +0 -163
  73. data/lib/veritrans/v_t_direct.rb +0 -145
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.sandbox.veritrans.co.id/v2/1111-not-exists/status
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Veritrans ruby gem 2.0.0beta
12
+ Authorization:
13
+ - Basic c3BlY19zZXJ2ZXJfa2V5Og==
14
+ Accept:
15
+ - application/json
16
+ Content-Type:
17
+ - application/json
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: ''
22
+ headers:
23
+ Server:
24
+ - nginx
25
+ Date:
26
+ - Mon, 01 Dec 2014 08:12:49 GMT
27
+ Content-Type:
28
+ - application/json
29
+ Content-Length:
30
+ - '132'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Pragma:
36
+ - no-cache
37
+ Expires:
38
+ - Wed, 31 Dec 1969 17:00:00 GMT
39
+ Strict-Transport-Security:
40
+ - max-age=31536000; includeSubdomains;
41
+ body:
42
+ encoding: US-ASCII
43
+ string: ! "{\n \"status_code\" : \"401\",\n \"status_message\" : \"Access
44
+ denied due to unauthorized transaction, please check client or server key\"\n}"
45
+ http_version:
46
+ recorded_at: Mon, 01 Dec 2014 08:13:09 GMT
47
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,55 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.sandbox.veritrans.co.id/v2/testing-0.2703-1415600236/status
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Veritrans ruby gem 2.0.0beta
12
+ Authorization:
13
+ - Basic VlQtc2VydmVyLTlIdGItUnhYa2c3LTdoem5TQ0NqeHZvWTo=
14
+ Accept:
15
+ - application/json
16
+ Content-Type:
17
+ - application/json
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: ''
22
+ headers:
23
+ Server:
24
+ - nginx
25
+ Date:
26
+ - Mon, 01 Dec 2014 08:35:12 GMT
27
+ Content-Type:
28
+ - application/json
29
+ Content-Length:
30
+ - '602'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Pragma:
36
+ - no-cache
37
+ Expires:
38
+ - Wed, 31 Dec 1969 17:00:00 GMT
39
+ Vary:
40
+ - Accept-Encoding, User-Agent
41
+ Strict-Transport-Security:
42
+ - max-age=31536000; includeSubdomains;
43
+ body:
44
+ encoding: US-ASCII
45
+ string: ! "{\n \"status_code\" : \"200\",\n \"status_message\" : \"Success,
46
+ transaction found\",\n \"transaction_id\" : \"b1cbcc66-5608-4af1-a3ed-0f152f9ed871\",\n
47
+ \ \"masked_card\" : \"481111-1114\",\n \"order_id\" : \"testing-0.2703-1415600236\",\n
48
+ \ \"payment_type\" : \"credit_card\",\n \"transaction_time\" : \"2014-11-10
49
+ 13:17:33\",\n \"transaction_status\" : \"settlement\",\n \"fraud_status\"
50
+ : \"accept\",\n \"approval_code\" : \"1415600254322\",\n \"signature_key\"
51
+ : \"90da23d37a4ba8fc717990c35240948ab5a97cad71e46777de77b0fe468ffac8624dc09a80a422671f1f9a56f20956ccbe16c91074327c0ba5a33c8974c8973c\",\n
52
+ \ \"bank\" : \"bni\",\n \"gross_amount\" : \"30000.00\"\n}"
53
+ http_version:
54
+ recorded_at: Mon, 01 Dec 2014 08:35:32 GMT
55
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.sandbox.veritrans.co.id/v2/not-exists/status
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Veritrans ruby gem 2.0.0beta
12
+ Authorization:
13
+ - Basic VlQtc2VydmVyLTlIdGItUnhYa2c3LTdoem5TQ0NqeHZvWTo=
14
+ Accept:
15
+ - application/json
16
+ Content-Type:
17
+ - application/json
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: ''
22
+ headers:
23
+ Server:
24
+ - nginx/1.5.13
25
+ Date:
26
+ - Tue, 04 Nov 2014 14:11:31 GMT
27
+ Content-Type:
28
+ - application/json
29
+ Connection:
30
+ - keep-alive
31
+ Cache-Control:
32
+ - no-cache
33
+ Pragma:
34
+ - no-cache
35
+ Expires:
36
+ - Wed, 31 Dec 1969 17:00:00 GMT
37
+ body:
38
+ encoding: UTF-8
39
+ string: |-
40
+ {
41
+ "status_code" : "404",
42
+ "status_message" : "The requested resource is not found"
43
+ }
44
+ http_version:
45
+ recorded_at: Tue, 04 Nov 2014 14:10:00 GMT
46
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,109 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.sandbox.veritrans.co.id/v2/charge
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"payment_type":"permata","transaction_details":{"order_id":1415110500,"gross_amount":100000}}'
9
+ headers:
10
+ User-Agent:
11
+ - Veritrans ruby gem 2.0.0beta
12
+ Authorization:
13
+ - Basic VlQtc2VydmVyLTlIdGItUnhYa2c3LTdoem5TQ0NqeHZvWTo=
14
+ Accept:
15
+ - application/json
16
+ Content-Type:
17
+ - application/json
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: ''
22
+ headers:
23
+ Server:
24
+ - nginx/1.5.13
25
+ Date:
26
+ - Tue, 04 Nov 2014 14:16:31 GMT
27
+ Content-Type:
28
+ - application/json
29
+ Content-Length:
30
+ - '381'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Pragma:
36
+ - no-cache
37
+ Expires:
38
+ - Wed, 31 Dec 1969 17:00:00 GMT
39
+ body:
40
+ encoding: UTF-8
41
+ string: |-
42
+ {
43
+ "status_code" : "201",
44
+ "status_message" : "Success, PERMATA VA transaction is successful",
45
+ "transaction_id" : "2e008228-43cf-4f49-9299-329fa239e48b",
46
+ "order_id" : "1415110500",
47
+ "payment_type" : "bank_transfer",
48
+ "transaction_time" : "2014-11-04 21:16:51",
49
+ "transaction_status" : "pending",
50
+ "permata_va_number" : "8778990000000021",
51
+ "gross_amount" : "100000.00"
52
+ }
53
+ http_version:
54
+ recorded_at: Tue, 04 Nov 2014 14:15:00 GMT
55
+ - request:
56
+ method: get
57
+ uri: https://api.sandbox.veritrans.co.id/v2/1415110500/status
58
+ body:
59
+ encoding: US-ASCII
60
+ string: ''
61
+ headers:
62
+ User-Agent:
63
+ - Veritrans ruby gem 2.0.0beta
64
+ Authorization:
65
+ - Basic VlQtc2VydmVyLTlIdGItUnhYa2c3LTdoem5TQ0NqeHZvWTo=
66
+ Accept:
67
+ - application/json
68
+ Content-Type:
69
+ - application/json
70
+ response:
71
+ status:
72
+ code: 200
73
+ message: ''
74
+ headers:
75
+ Server:
76
+ - nginx/1.5.13
77
+ Date:
78
+ - Tue, 04 Nov 2014 14:16:32 GMT
79
+ Content-Type:
80
+ - application/json
81
+ Content-Length:
82
+ - '470'
83
+ Connection:
84
+ - keep-alive
85
+ Cache-Control:
86
+ - no-cache
87
+ Pragma:
88
+ - no-cache
89
+ Expires:
90
+ - Wed, 31 Dec 1969 17:00:00 GMT
91
+ Vary:
92
+ - Accept-Encoding, User-Agent
93
+ body:
94
+ encoding: UTF-8
95
+ string: |-
96
+ {
97
+ "status_code" : "201",
98
+ "status_message" : "Success, transaction found",
99
+ "transaction_id" : "2e008228-43cf-4f49-9299-329fa239e48b",
100
+ "order_id" : "1415110500",
101
+ "payment_type" : "bank_transfer",
102
+ "transaction_time" : "2014-11-04 21:16:51",
103
+ "transaction_status" : "pending",
104
+ "signature_key" : "6a79b17ff900a9f991b7b16c693e4a8b00843c65d09657fdf586be77597f87fa573c9b8e9aad78784f3208a1ab61f005cc337ef6f763235e282e975bbbf2e0ce",
105
+ "gross_amount" : "100000.00"
106
+ }
107
+ http_version:
108
+ recorded_at: Tue, 04 Nov 2014 14:15:01 GMT
109
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,29 @@
1
+ require 'bundler/setup'
2
+
3
+ $:.push(File.expand_path("../../lib", __FILE__))
4
+
5
+ require 'rspec'
6
+ require 'veritrans'
7
+ require 'veritrans/cli'
8
+ require 'veritrans/events'
9
+ require 'rails'
10
+ require 'webmock/rspec'
11
+ require 'vcr'
12
+
13
+ VCR.configure do |c|
14
+ c.cassette_library_dir = 'spec/fixtures'
15
+ c.hook_into :webmock # or :fakeweb
16
+ #c.debug_logger = STDOUT
17
+ end
18
+
19
+ RSpec.configure do |config|
20
+ config.mock_with :rspec
21
+
22
+ config.expect_with :rspec do |c|
23
+ c.syntax = [:should, :expect]
24
+ end
25
+
26
+ config.mock_with :rspec do |c|
27
+ c.syntax = [:should, :expect]
28
+ end
29
+ end
@@ -0,0 +1,83 @@
1
+ describe Veritrans do
2
+
3
+ before do
4
+ hide_const("Rails")
5
+ Veritrans.logger = Logger.new("/dev/null")
6
+ Veritrans.setup do
7
+ config.load_config "./example/veritrans.yml#development"
8
+ end
9
+ end
10
+
11
+ it "should send charge vt-web request" do
12
+ VCR.use_cassette('charge_vtweb') do
13
+ result = Veritrans.charge('vtweb', transaction: { order_id: Time.now.to_s, gross_amount: 100_000 } )
14
+
15
+ result.status_message.should == "OK, success do VTWeb transaction, please go to redirect_url"
16
+ result.success?.should == true
17
+ result.redirect_url.should be_present
18
+ end
19
+ end
20
+
21
+ it "should send charge vt-web request" do
22
+ VCR.use_cassette('charge_direct') do
23
+ result = Veritrans.charge("permata", transaction: { order_id: Time.now.to_s, gross_amount: 100_000 })
24
+
25
+ result.status_message.should == "Success, PERMATA VA transaction is successful"
26
+ result.success?.should == true
27
+ result.permata_va_number.should be_present
28
+ end
29
+ end
30
+
31
+ it "should send status request" do
32
+ VCR.use_cassette('status_fail') do
33
+ result = Veritrans.status("not-exists")
34
+ result.success?.should == false
35
+ result.status_message.should == "The requested resource is not found"
36
+ end
37
+ end
38
+
39
+ it "should send status request and get response" do
40
+ VCR.use_cassette('status_success') do
41
+ result_charge = Veritrans.charge('permata', transaction: { order_id: Time.now.to_i, gross_amount: 100_000 } )
42
+ result = Veritrans.status(result_charge.order_id)
43
+ result.success?.should == true
44
+ result.status_message.should == "Success, transaction found"
45
+ result.transaction_status.should == "pending"
46
+ end
47
+ end
48
+
49
+ it "should send status request and get response" do
50
+ VCR.use_cassette('cancel_failed') do
51
+ result = Veritrans.cancel("not-exists")
52
+ result.success?.should == false
53
+ result.status_message.should == "The requested resource is not found"
54
+ end
55
+ end
56
+
57
+ it "should send status request and get response" do
58
+ VCR.use_cassette('cancel_success') do
59
+ result_charge = Veritrans.charge('permata', transaction: { order_id: Time.now.to_i, gross_amount: 100_000 } )
60
+ result = Veritrans.cancel(result_charge.order_id)
61
+ result.success?.should == true
62
+ result.status_message.should == "Success, transaction is canceled"
63
+ result.transaction_status.should == "cancel"
64
+ end
65
+ end
66
+
67
+ it "should send approve request" do
68
+ VCR.use_cassette('approve_failed') do
69
+ result = Veritrans.cancel("not-exists")
70
+ result.success?.should == false
71
+ result.status_message.should == "The requested resource is not found"
72
+ end
73
+ end
74
+
75
+ it "should send capture request" do
76
+ VCR.use_cassette('capture_failed') do
77
+ result = Veritrans.capture("not-exists", 1000)
78
+ result.success?.should == false
79
+ result.status_message.should == "The requested resource is not found"
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,48 @@
1
+ describe Veritrans::Config do
2
+
3
+ before do
4
+ hide_const("Rails")
5
+ end
6
+
7
+ it "should set Veritras as self inside config block" do
8
+ Veritrans.config do
9
+ self.should == Veritrans
10
+ end
11
+ end
12
+
13
+ it "should have sandbox api_host by defualt" do
14
+ Veritrans.config.api_host.should == "https://api.sandbox.veritrans.co.id"
15
+ end
16
+
17
+ it "should set client key and server key" do
18
+ Veritrans.config do
19
+ config.client_key = "kk-1"
20
+ config.server_key = "sk-1"
21
+ end
22
+
23
+ Veritrans.config.client_key.should == "kk-1"
24
+ Veritrans.config.server_key.should == "sk-1"
25
+ end
26
+
27
+ it "should load config" do
28
+ data = Veritrans.config.load_config("./spec/configs/veritrans_flat.yml")
29
+ data.should == {"client_key" => "flat_client_key", "server_key" => "flat_server_key"}
30
+ end
31
+
32
+ it "should load config according to hash" do
33
+ data = Veritrans.config.load_config("./spec/configs/veritrans.yml#development")
34
+ data.should == {"client_key" => "spec_client_key", "server_key" => "spec_server_key"}
35
+ end
36
+
37
+ it "should load config for Rails.env" do
38
+ stub_const("Rails", Class.new {
39
+ def self.env
40
+ "test"
41
+ end
42
+ })
43
+
44
+ data = Veritrans.config.load_config("./spec/configs/veritrans.yml")
45
+ data.should == {"client_key" => "test_client_key", "server_key" => "test_server_key"}
46
+ end
47
+
48
+ end
@@ -0,0 +1,70 @@
1
+ describe Veritrans do
2
+ before do
3
+ stub_const("CONFIG", {})
4
+ Veritrans.logger = Logger.new(STDOUT)
5
+ Veritrans.file_logger = Logger.new(STDOUT)
6
+ Veritrans.setup do
7
+ config.load_yml "./example/veritrans.yml#development"
8
+ end
9
+ end
10
+
11
+ after do
12
+ if Veritrans.events.listeners
13
+ Veritrans.events.listeners.clear
14
+ end
15
+ end
16
+
17
+ JSON_RESPONSE = '{
18
+ "status_code": "200",
19
+ "status_message": "Success, transaction found",
20
+ "transaction_id": "b1cbcc66-5608-4af1-a3ed-0f152f9ed871",
21
+ "order_id": "testing-0.2703-1415600236",
22
+ "payment_type": "credit_card",
23
+ "transaction_time": "2014-11-10 13:17:33",
24
+ "transaction_status": "settlement",
25
+ "gross_amount": "30000.00",
26
+ "masked_card": "481111-1114",
27
+ "fraud_status": "accept",
28
+ "approval_code": "1415600254322",
29
+ "bank": "bni"
30
+ }'
31
+
32
+ DOUBLE_ENCODED_JSON_RESPONSE = JSON.dump(JSON_RESPONSE)
33
+
34
+ def stub_vt_status_response
35
+ stub_request(:any, /.*veritrans.*/).to_return(lambda {|request|
36
+ {status: 200, body: JSON_RESPONSE}
37
+ })
38
+ end
39
+
40
+ it "should work with single encoded json" do
41
+ Veritrans.events.subscribe('payment.success') do |payment|
42
+ @payment = payment
43
+ end
44
+
45
+ stub_vt_status_response
46
+
47
+ handler = Rack::MockRequest.new(Veritrans::Events.new)
48
+ silence_stream(STDOUT) do
49
+ handler.post("http://example.com/", input: JSON_RESPONSE)
50
+ end
51
+
52
+ @payment.order_id.should == "testing-0.2703-1415600236"
53
+ end
54
+
55
+ it "should work with double encoded json" do
56
+ Veritrans.events.subscribe('payment.success') do |payment|
57
+ @payment = payment
58
+ end
59
+
60
+ stub_vt_status_response
61
+
62
+ handler = Rack::MockRequest.new(Veritrans::Events.new)
63
+ silence_stream(STDOUT) do
64
+ handler.post("http://example.com/", input: DOUBLE_ENCODED_JSON_RESPONSE)
65
+ end
66
+
67
+ @payment.order_id.should == "testing-0.2703-1415600236"
68
+ end
69
+
70
+ end
@@ -0,0 +1,46 @@
1
+ describe Veritrans do
2
+
3
+ after do
4
+ Veritrans.logger = nil
5
+ Veritrans.file_logger = nil
6
+ end
7
+
8
+ it "should set logger" do
9
+ Veritrans.logger = :nothing
10
+ Veritrans.logger.should == :nothing
11
+
12
+ Veritrans.file_logger = :nothing2
13
+ Veritrans.file_logger.should == :nothing2
14
+ end
15
+
16
+ describe "widthout rails" do
17
+ before do
18
+ hide_const("Rails")
19
+ end
20
+
21
+ it "should log to stdout when there is no rails" do
22
+ Veritrans.logger.instance_variable_get(:@logdev).dev.should == $stdout
23
+ end
24
+
25
+ it "should set file_logger" do
26
+ Veritrans.file_logger.instance_variable_get(:@logdev).filename.should == "/dev/null"
27
+ end
28
+
29
+ end
30
+
31
+ describe "width rails" do
32
+ before do
33
+ FileUtils.mkdir_p("/tmp/log")
34
+ allow(Rails).to receive(:logger).and_return(Logger.new(STDERR))
35
+ allow(Rails).to receive(:root).and_return(Pathname.new("/tmp"))
36
+ end
37
+
38
+ it "should use rails logger" do
39
+ Veritrans.logger.should == Rails.logger
40
+ end
41
+
42
+ it "should set file_logger" do
43
+ Veritrans.file_logger.instance_variable_get(:@logdev).filename.should == "/tmp/log/veritrans.log"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,80 @@
1
+ # Webhooks
2
+
3
+ For better security we recommend to use webhooks and check status of transaction via api.
4
+
5
+ Webhook is http post request that veritrans send to merchant's server when any transaction change status.
6
+ It can be success transaction, can be failed transaction, and when transaction settled.
7
+
8
+ Now you can set webhook url at https://my.sandbox.veritrans.co.id/settings/vtweb_configuration
9
+
10
+ ## Veritrans command line tool
11
+
12
+ You can send testing request from command line:
13
+
14
+ ```bash
15
+ gem install veritrans
16
+
17
+ # Send default data, payment which not exists
18
+ veritrans testhook http://localhost:3000/vt_events
19
+
20
+ # Get fetch real payment information and send
21
+ veritrans testhook -o my-order-1 -c ~/path/to/veritrans.yml http://localhost:3000/vt_events
22
+ ```
23
+
24
+ ## Test locally
25
+
26
+ Most of computers don't have public ip address, in that case you can't simply receive http requests on your computer.
27
+ If you're using wi-fi router you need to change router settings to make a route from router to your local computer.
28
+ To check if your ip is public, you can open http://www.whatismyip.com/, make some local http server and try to open it.
29
+ For example if your IP address is `117.102.113.10` and you started rails on port 3000, try to open http://117.102.113.10:3000 in your browser;
30
+ if you able to see your application, then your IP is public.
31
+
32
+ There are several tools to accept http requests if you can't do it directly.
33
+
34
+ * npm localtunnel
35
+ * gem [proxylocal](http://proxylocal.com/)
36
+ * https://ngrok.com/
37
+ * gem [ultrahook](http://www.ultrahook.com/)
38
+ * gem [forward](https://forwardhq.com/)
39
+
40
+ Or you can make ssh tunnel to your globally accessible server (if you have one)
41
+
42
+ ssh -N -R 127.0.0.1:13000:localhost:3000 remoteuser@remote-host.com
43
+ # 3000 - port on your local computer
44
+ # 13000 - port witch will be accessible on remote computer
45
+ # remoteuser@remote-host.com - your user and host
46
+
47
+ Also you can collect requests online for further inspection.
48
+
49
+ * http://requestb.in/
50
+ * http://httpi.pe/
51
+ * http://respondto.it/
52
+
53
+
54
+ ## Trigger callback
55
+
56
+ To receive http notification from veritrans you can try to make transaction or use callback tester in merchant portal
57
+
58
+ https://my.sandbox.veritrans.co.id/settings/vtweb_configuration/test_callback
59
+
60
+
61
+ ## Format
62
+
63
+ Veritrans will try to send message in JSON format:
64
+
65
+ ```js
66
+ // Content-Type: application/json
67
+ {
68
+ "status_code": "200",
69
+ "status_message": "Veritrans payment notification",
70
+ "transaction_id": "826acc53-14e0-4ae7-95e2-845bf0311579",
71
+ "order_id": "2014040745",
72
+ "payment_type": "credit_card",
73
+ "transaction_time": "2014-04-07 16:22:36",
74
+ "transaction_status": "capture",
75
+ "fraud_status": "accept",
76
+ "masked_card": "411111-1111",
77
+ "gross_amount": "2700"
78
+ }
79
+
80
+ ```
data/veritrans.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ $:.push(File.expand_path("../lib", __FILE__))
2
+ require 'veritrans/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "veritrans"
6
+ s.version = Veritrans::VERSION
7
+ s.author = ["Veritrans Dev Team"]
8
+ s.email = ["dev@veritrans.co.id"]
9
+ s.homepage = "https://github.com/veritrans/veritrans-ruby"
10
+ s.summary = %q{Veritrans ruby library}
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = []
14
+
15
+ s.require_paths = ["lib"]
16
+ s.executables = ["veritrans"]
17
+
18
+ s.add_runtime_dependency "excon", "~> 0.20"
19
+
20
+ s.add_development_dependency "rspec", ">= 2.9.0"
21
+ s.add_development_dependency "rails"
22
+ s.add_development_dependency 'webmock'
23
+ end