veritrans 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.idea/.gitignore +8 -0
  4. data/.rubocop.yml +1 -1
  5. data/.travis.yml +2 -1
  6. data/CHANGELOG.md +13 -0
  7. data/Gemfile +2 -11
  8. data/Gemfile.lock +116 -145
  9. data/Maintaining.MD +8 -0
  10. data/README.md +247 -278
  11. data/api_reference.md +482 -173
  12. data/example/coreapi/core_api_credit_card_example.rb +66 -0
  13. data/example/coreapi/readme.md +4 -0
  14. data/example/sinatra/Gemfile +7 -0
  15. data/example/sinatra/README.md +4 -6
  16. data/example/sinatra/index.erb +180 -192
  17. data/example/sinatra/response.erb +1 -40
  18. data/example/sinatra/snap.erb +33 -0
  19. data/example/sinatra/snap_redirect.erb +10 -0
  20. data/example/sinatra/webapp.rb +113 -0
  21. data/example/snap/readme.md +4 -0
  22. data/example/snap/snap_example.rb +39 -0
  23. data/lib/test/all.rb +1 -0
  24. data/lib/test/api_test.rb +319 -0
  25. data/lib/test/config_test.rb +26 -0
  26. data/lib/test/gopay_tokenization_test.rb +80 -0
  27. data/lib/test/snap_test.rb +79 -0
  28. data/lib/test/subscription_test.rb +116 -0
  29. data/lib/test/transaction_test.rb +160 -0
  30. data/lib/veritrans/api.rb +105 -8
  31. data/lib/veritrans/client.rb +40 -7
  32. data/lib/veritrans/config.rb +26 -3
  33. data/lib/veritrans/midtrans_error.rb +15 -0
  34. data/lib/veritrans/version.rb +1 -1
  35. data/lib/veritrans.rb +5 -6
  36. data/veritrans.gemspec +1 -2
  37. metadata +25 -248
  38. data/.rspec +0 -2
  39. data/Procfile +0 -1
  40. data/Rakefile +0 -16
  41. data/bin/midtrans +0 -3
  42. data/bin/veritrans +0 -68
  43. data/example/rails/cable/Gemfile +0 -48
  44. data/example/rails/cable/Gemfile.lock +0 -184
  45. data/example/rails/cable/README.md +0 -29
  46. data/example/rails/cable/Rakefile +0 -6
  47. data/example/rails/cable/app/assets/config/manifest.js +0 -3
  48. data/example/rails/cable/app/assets/images/.keep +0 -0
  49. data/example/rails/cable/app/assets/javascripts/application.js +0 -15
  50. data/example/rails/cable/app/assets/javascripts/cable.js +0 -13
  51. data/example/rails/cable/app/assets/javascripts/channels/.keep +0 -0
  52. data/example/rails/cable/app/assets/javascripts/chats.js +0 -39
  53. data/example/rails/cable/app/assets/javascripts/rooms.js +0 -55
  54. data/example/rails/cable/app/assets/stylesheets/application.css +0 -16
  55. data/example/rails/cable/app/assets/stylesheets/chatbox.scss +0 -31
  56. data/example/rails/cable/app/assets/stylesheets/peoplebox.scss +0 -6
  57. data/example/rails/cable/app/channels/application_cable/channel.rb +0 -4
  58. data/example/rails/cable/app/channels/application_cable/connection.rb +0 -4
  59. data/example/rails/cable/app/channels/rooms_texting_channel.rb +0 -13
  60. data/example/rails/cable/app/controllers/application_controller.rb +0 -3
  61. data/example/rails/cable/app/controllers/chats_controller.rb +0 -18
  62. data/example/rails/cable/app/controllers/concerns/.keep +0 -0
  63. data/example/rails/cable/app/controllers/pays_controller.rb +0 -28
  64. data/example/rails/cable/app/controllers/rooms_controller.rb +0 -4
  65. data/example/rails/cable/app/helpers/application_helper.rb +0 -2
  66. data/example/rails/cable/app/helpers/chats_helper.rb +0 -2
  67. data/example/rails/cable/app/helpers/rooms_helper.rb +0 -5
  68. data/example/rails/cable/app/jobs/application_job.rb +0 -2
  69. data/example/rails/cable/app/jobs/chat_broadcaster_job.rb +0 -15
  70. data/example/rails/cable/app/mailers/application_mailer.rb +0 -4
  71. data/example/rails/cable/app/models/application_record.rb +0 -3
  72. data/example/rails/cable/app/models/chat.rb +0 -41
  73. data/example/rails/cable/app/models/concerns/.keep +0 -0
  74. data/example/rails/cable/app/models/order.rb +0 -2
  75. data/example/rails/cable/app/models/user.rb +0 -2
  76. data/example/rails/cable/app/views/chats/_chat.html.erb +0 -18
  77. data/example/rails/cable/app/views/layouts/application.html.erb +0 -19
  78. data/example/rails/cable/app/views/layouts/mailer.html.erb +0 -13
  79. data/example/rails/cable/app/views/layouts/mailer.text.erb +0 -1
  80. data/example/rails/cable/app/views/rooms/_chatbox.html.erb +0 -13
  81. data/example/rails/cable/app/views/rooms/_online_people.html.erb +0 -53
  82. data/example/rails/cable/app/views/rooms/index.html.erb +0 -9
  83. data/example/rails/cable/bin/bundle +0 -3
  84. data/example/rails/cable/bin/rails +0 -9
  85. data/example/rails/cable/bin/rake +0 -9
  86. data/example/rails/cable/bin/setup +0 -34
  87. data/example/rails/cable/bin/spring +0 -16
  88. data/example/rails/cable/bin/update +0 -29
  89. data/example/rails/cable/config/application.rb +0 -16
  90. data/example/rails/cable/config/boot.rb +0 -3
  91. data/example/rails/cable/config/cable.yml +0 -9
  92. data/example/rails/cable/config/database.yml +0 -20
  93. data/example/rails/cable/config/environment.rb +0 -5
  94. data/example/rails/cable/config/environments/development.rb +0 -57
  95. data/example/rails/cable/config/environments/production.rb +0 -86
  96. data/example/rails/cable/config/environments/test.rb +0 -42
  97. data/example/rails/cable/config/initializers/application_controller_renderer.rb +0 -6
  98. data/example/rails/cable/config/initializers/assets.rb +0 -11
  99. data/example/rails/cable/config/initializers/backtrace_silencers.rb +0 -7
  100. data/example/rails/cable/config/initializers/cookies_serializer.rb +0 -5
  101. data/example/rails/cable/config/initializers/filter_parameter_logging.rb +0 -4
  102. data/example/rails/cable/config/initializers/inflections.rb +0 -16
  103. data/example/rails/cable/config/initializers/mime_types.rb +0 -4
  104. data/example/rails/cable/config/initializers/new_framework_defaults.rb +0 -24
  105. data/example/rails/cable/config/initializers/session_store.rb +0 -3
  106. data/example/rails/cable/config/initializers/sidekiq.rb +0 -2
  107. data/example/rails/cable/config/initializers/veritrans.rb +0 -46
  108. data/example/rails/cable/config/initializers/wrap_parameters.rb +0 -14
  109. data/example/rails/cable/config/locales/en.yml +0 -23
  110. data/example/rails/cable/config/puma.rb +0 -47
  111. data/example/rails/cable/config/routes.rb +0 -18
  112. data/example/rails/cable/config/secrets.yml +0 -22
  113. data/example/rails/cable/config/spring.rb +0 -6
  114. data/example/rails/cable/config/veritrans.yml +0 -13
  115. data/example/rails/cable/config.ru +0 -5
  116. data/example/rails/cable/db/development.sqlite3 +0 -0
  117. data/example/rails/cable/db/migrate/20161215070044_create_chats.rb +0 -10
  118. data/example/rails/cable/db/migrate/20161215072021_create_users.rb +0 -10
  119. data/example/rails/cable/db/migrate/20161219110219_create_orders.rb +0 -11
  120. data/example/rails/cable/db/schema.rb +0 -37
  121. data/example/rails/cable/db/seeds.rb +0 -41
  122. data/example/rails/cable/db/test.sqlite3 +0 -0
  123. data/example/rails/cable/lib/assets/.keep +0 -0
  124. data/example/rails/cable/lib/tasks/.keep +0 -0
  125. data/example/rails/cable/log/.keep +0 -0
  126. data/example/rails/cable/public/404.html +0 -67
  127. data/example/rails/cable/public/422.html +0 -67
  128. data/example/rails/cable/public/500.html +0 -66
  129. data/example/rails/cable/public/apple-touch-icon-precomposed.png +0 -0
  130. data/example/rails/cable/public/apple-touch-icon.png +0 -0
  131. data/example/rails/cable/public/favicon.ico +0 -0
  132. data/example/rails/cable/public/images/avatar1.jpg +0 -0
  133. data/example/rails/cable/public/images/avatar2.jpg +0 -0
  134. data/example/rails/cable/public/images/avatar3.jpg +0 -0
  135. data/example/rails/cable/public/images/avatar4.jpg +0 -0
  136. data/example/rails/cable/public/images/avatar5.jpg +0 -0
  137. data/example/rails/cable/public/images/avatar6.jpg +0 -0
  138. data/example/rails/cable/public/robots.txt +0 -5
  139. data/example/rails/cable/vendor/assets/javascripts/.keep +0 -0
  140. data/example/rails/cable/vendor/assets/stylesheets/.keep +0 -0
  141. data/example/rails/cable/vendor/assets/stylesheets/photon.css +0 -2333
  142. data/example/rails/simplepay/Gemfile +0 -54
  143. data/example/rails/simplepay/Gemfile.lock +0 -178
  144. data/example/rails/simplepay/README.md +0 -30
  145. data/example/rails/simplepay/Rakefile +0 -6
  146. data/example/rails/simplepay/app/assets/config/manifest.js +0 -3
  147. data/example/rails/simplepay/app/assets/images/.keep +0 -0
  148. data/example/rails/simplepay/app/assets/javascripts/application.js +0 -16
  149. data/example/rails/simplepay/app/assets/javascripts/cable.js +0 -13
  150. data/example/rails/simplepay/app/assets/javascripts/channels/.keep +0 -0
  151. data/example/rails/simplepay/app/assets/javascripts/pay.js +0 -18
  152. data/example/rails/simplepay/app/assets/stylesheets/application.css +0 -15
  153. data/example/rails/simplepay/app/assets/stylesheets/style.css +0 -254
  154. data/example/rails/simplepay/app/channels/application_cable/channel.rb +0 -4
  155. data/example/rails/simplepay/app/channels/application_cable/connection.rb +0 -4
  156. data/example/rails/simplepay/app/controllers/application_controller.rb +0 -3
  157. data/example/rails/simplepay/app/controllers/concerns/.keep +0 -0
  158. data/example/rails/simplepay/app/controllers/home_controller.rb +0 -16
  159. data/example/rails/simplepay/app/controllers/pay_controller.rb +0 -10
  160. data/example/rails/simplepay/app/helpers/application_helper.rb +0 -2
  161. data/example/rails/simplepay/app/helpers/pay_helper.rb +0 -2
  162. data/example/rails/simplepay/app/jobs/application_job.rb +0 -2
  163. data/example/rails/simplepay/app/mailers/application_mailer.rb +0 -4
  164. data/example/rails/simplepay/app/models/application_record.rb +0 -3
  165. data/example/rails/simplepay/app/models/concerns/.keep +0 -0
  166. data/example/rails/simplepay/app/models/order.rb +0 -2
  167. data/example/rails/simplepay/app/views/home/index.html.erb +0 -19
  168. data/example/rails/simplepay/app/views/layouts/application.html.erb +0 -15
  169. data/example/rails/simplepay/app/views/layouts/mailer.html.erb +0 -13
  170. data/example/rails/simplepay/app/views/layouts/mailer.text.erb +0 -1
  171. data/example/rails/simplepay/app/views/pay/notify.html.erb +0 -2
  172. data/example/rails/simplepay/bin/bundle +0 -3
  173. data/example/rails/simplepay/bin/rails +0 -9
  174. data/example/rails/simplepay/bin/rake +0 -9
  175. data/example/rails/simplepay/bin/setup +0 -34
  176. data/example/rails/simplepay/bin/spring +0 -16
  177. data/example/rails/simplepay/bin/update +0 -29
  178. data/example/rails/simplepay/config/application.rb +0 -15
  179. data/example/rails/simplepay/config/boot.rb +0 -3
  180. data/example/rails/simplepay/config/cable.yml +0 -9
  181. data/example/rails/simplepay/config/database.yml +0 -25
  182. data/example/rails/simplepay/config/environment.rb +0 -5
  183. data/example/rails/simplepay/config/environments/development.rb +0 -57
  184. data/example/rails/simplepay/config/environments/production.rb +0 -86
  185. data/example/rails/simplepay/config/environments/test.rb +0 -42
  186. data/example/rails/simplepay/config/initializers/application_controller_renderer.rb +0 -6
  187. data/example/rails/simplepay/config/initializers/assets.rb +0 -11
  188. data/example/rails/simplepay/config/initializers/backtrace_silencers.rb +0 -7
  189. data/example/rails/simplepay/config/initializers/cookies_serializer.rb +0 -5
  190. data/example/rails/simplepay/config/initializers/filter_parameter_logging.rb +0 -4
  191. data/example/rails/simplepay/config/initializers/inflections.rb +0 -16
  192. data/example/rails/simplepay/config/initializers/mime_types.rb +0 -4
  193. data/example/rails/simplepay/config/initializers/new_framework_defaults.rb +0 -24
  194. data/example/rails/simplepay/config/initializers/session_store.rb +0 -3
  195. data/example/rails/simplepay/config/initializers/veritrans.rb +0 -46
  196. data/example/rails/simplepay/config/initializers/wrap_parameters.rb +0 -14
  197. data/example/rails/simplepay/config/locales/en.yml +0 -23
  198. data/example/rails/simplepay/config/puma.rb +0 -47
  199. data/example/rails/simplepay/config/routes.rb +0 -5
  200. data/example/rails/simplepay/config/secrets.yml +0 -22
  201. data/example/rails/simplepay/config/spring.rb +0 -6
  202. data/example/rails/simplepay/config/veritrans.yml +0 -18
  203. data/example/rails/simplepay/config.ru +0 -5
  204. data/example/rails/simplepay/db/development.sqlite3 +0 -0
  205. data/example/rails/simplepay/db/migrate/20161221090855_create_orders.rb +0 -10
  206. data/example/rails/simplepay/db/schema.rb +0 -22
  207. data/example/rails/simplepay/db/seeds.rb +0 -7
  208. data/example/rails/simplepay/db/test.sqlite3 +0 -0
  209. data/example/rails/simplepay/lib/assets/.keep +0 -0
  210. data/example/rails/simplepay/lib/tasks/.keep +0 -0
  211. data/example/rails/simplepay/log/.keep +0 -0
  212. data/example/rails/simplepay/public/404.html +0 -67
  213. data/example/rails/simplepay/public/422.html +0 -67
  214. data/example/rails/simplepay/public/500.html +0 -66
  215. data/example/rails/simplepay/public/apple-touch-icon-precomposed.png +0 -0
  216. data/example/rails/simplepay/public/apple-touch-icon.png +0 -0
  217. data/example/rails/simplepay/public/favicon.ico +0 -0
  218. data/example/rails/simplepay/public/robots.txt +0 -5
  219. data/example/rails/simplepay/vendor/assets/javascripts/.keep +0 -0
  220. data/example/rails/simplepay/vendor/assets/stylesheets/.keep +0 -0
  221. data/example/sinatra/config.ru +0 -9
  222. data/example/sinatra/localization.erb +0 -249
  223. data/example/sinatra/points.erb +0 -188
  224. data/example/sinatra/recurring.erb +0 -201
  225. data/example/sinatra/sinatra.rb +0 -194
  226. data/example/sinatra/style.css +0 -137
  227. data/example/sinatra/veritrans.yml +0 -11
  228. data/example/sinatra/widget.erb +0 -63
  229. data/lib/generators/templates/assets/credit_card_form.js +0 -57
  230. data/lib/generators/templates/payments_controller.rb +0 -85
  231. data/lib/generators/templates/veritrans.rb +0 -46
  232. data/lib/generators/templates/veritrans.yml +0 -18
  233. data/lib/generators/templates/views/_credit_card_form.erb +0 -42
  234. data/lib/generators/templates/views/_veritrans_include.erb +0 -10
  235. data/lib/generators/templates/views/payments/create.erb +0 -15
  236. data/lib/generators/templates/views/payments/new.erb +0 -6
  237. data/lib/generators/veritrans/install_generator.rb +0 -32
  238. data/lib/generators/veritrans/payment_form_generator.rb +0 -45
  239. data/lib/veritrans/cli.rb +0 -161
  240. data/lib/veritrans/testing.rb +0 -156
  241. data/spec/cli_spec.rb +0 -83
  242. data/spec/configs/real_key.yml +0 -4
  243. data/spec/configs/veritrans.yml +0 -7
  244. data/spec/configs/veritrans_flat.yml +0 -2
  245. data/spec/configs/veritrans_with_erb.yml +0 -2
  246. data/spec/fixtures/approve_failed.yml +0 -48
  247. data/spec/fixtures/cancel_failed.yml +0 -48
  248. data/spec/fixtures/cancel_success.yml +0 -126
  249. data/spec/fixtures/capture_failed.yml +0 -48
  250. data/spec/fixtures/charge.yml +0 -50
  251. data/spec/fixtures/charge_direct.yml +0 -56
  252. data/spec/fixtures/charge_vtweb.yml +0 -50
  253. data/spec/fixtures/cli_test_1111-not-exists.yml +0 -45
  254. data/spec/fixtures/cli_test_not_exists.yml +0 -45
  255. data/spec/fixtures/cli_test_real_txn.yml +0 -55
  256. data/spec/fixtures/cli_test_unauthorized.yml +0 -47
  257. data/spec/fixtures/deny_failed.yml +0 -144
  258. data/spec/fixtures/events_test_real_txn.yml +0 -55
  259. data/spec/fixtures/expire_failed.yml +0 -50
  260. data/spec/fixtures/expire_success.yml +0 -56
  261. data/spec/fixtures/midtrans_status.yml +0 -117
  262. data/spec/fixtures/refund_failed.yml +0 -54
  263. data/spec/fixtures/status_fail.yml +0 -48
  264. data/spec/fixtures/status_success.yml +0 -128
  265. data/spec/fixtures/test_token.yml +0 -49
  266. data/spec/midtrans_rename_spec.rb +0 -27
  267. data/spec/rails_plugin_spec.rb +0 -317
  268. data/spec/spec_helper.rb +0 -71
  269. data/spec/veritrans_client_spec.rb +0 -235
  270. data/spec/veritrans_config_spec.rb +0 -70
  271. data/spec/veritrans_events_spec.rb +0 -72
  272. data/spec/veritrans_logger_spec.rb +0 -46
  273. data/spec/veritrans_snap_spec.rb +0 -54
  274. data/spec/veritrans_testing_spec.rb +0 -184
  275. data/testing_webhooks.md +0 -78
@@ -0,0 +1,116 @@
1
+ require 'veritrans'
2
+ require 'minitest/autorun'
3
+
4
+ class TestVeritrans < Minitest::Test
5
+ i_suck_and_my_tests_are_order_dependent!
6
+
7
+ def setup
8
+ @mt_test = Veritrans.new(
9
+ server_key: "SB-Mid-server-uQmMImQMeo0Ky3Svl90QTUj2",
10
+ client_key: "SB-Mid-client-ArNfhrh7st9bQKmz",
11
+ api_host: "https://api.sandbox.midtrans.com",
12
+ logger: Logger.new(STDOUT),
13
+ file_logger: Logger.new(STDOUT)
14
+ )
15
+ end
16
+
17
+ def test_create_subscription
18
+ p 1
19
+ param = {
20
+ "name": "MONTHLY_2021",
21
+ "amount": "17000",
22
+ "currency": "IDR",
23
+ "payment_type": "credit_card",
24
+ "token": "dummy",
25
+ "schedule": {
26
+ "interval": 1,
27
+ "interval_unit": "month",
28
+ "max_interval": 12,
29
+ "start_time": "2022-10-10 07:25:01 +0700"
30
+ },
31
+ "metadata": {
32
+ "description": "Recurring payment for A"
33
+ },
34
+ "customer_details": {
35
+ "first_name": "John",
36
+ "last_name": "Doe",
37
+ "email": "johndoe@email.com",
38
+ "phone": "+62812345678"
39
+ }
40
+ }
41
+ result = @mt_test.create_subscription(param)
42
+ assert_equal 200, result.status
43
+ $testsubsid = result.id
44
+ end
45
+
46
+ def test_get_subscription
47
+ p 2
48
+ result = @mt_test.get_subscription($testsubsid)
49
+ assert_equal 200, result.status
50
+ end
51
+
52
+ def test_disable_subscription
53
+ p 3
54
+ result = @mt_test.disable_subscription($testsubsid)
55
+ assert_equal "Subscription is updated.", result.status_message
56
+ end
57
+
58
+ def test_enable_subscription
59
+ p 4
60
+ result = @mt_test.enable_subscription($testsubsid)
61
+ assert_equal "Subscription is updated.", result.status_message
62
+ end
63
+
64
+ def test_update_subscription
65
+ p 5
66
+ param = {
67
+ "name": "MONTHLY_2021",
68
+ "amount": "21000",
69
+ "currency": "IDR",
70
+ "token": "dummy",
71
+ "schedule": {
72
+ "interval": 1
73
+ }
74
+ }
75
+ result = @mt_test.update_subscription($testsubsid, param)
76
+ assert_equal "Subscription is updated.", result.status_message
77
+ end
78
+
79
+ def test_get_subscription_none_acc
80
+ begin
81
+ @mt_test.get_subscription("dummy")
82
+ rescue MidtransError => e
83
+ assert_equal "404", e.status
84
+ assert_match "Subscription doesn't exist.", e.data
85
+ end
86
+ end
87
+
88
+ def test_disable_subscription_none
89
+ begin
90
+ @mt_test.disable_subscription("dummy")
91
+ rescue MidtransError => e
92
+ assert_equal "404", e.status
93
+ assert_match "Subscription doesn't exist.", e.data
94
+ end
95
+ end
96
+
97
+ def test_enable_subscription_none
98
+ begin
99
+ @mt_test.enable_subscription("dummy")
100
+ rescue MidtransError => e
101
+ assert_equal "404", e.status
102
+ assert_match "Subscription doesn't exist.", e.data
103
+ end
104
+ end
105
+
106
+ def test_update_subscription_none
107
+ begin
108
+ param = {}
109
+ @mt_test.update_subscription("dummy", param)
110
+ rescue MidtransError => e
111
+ assert_equal "404", e.status
112
+ assert_match "Subscription doesn't exist.", e.data
113
+ end
114
+ end
115
+
116
+ end
@@ -0,0 +1,160 @@
1
+ require 'veritrans'
2
+ require 'minitest/autorun'
3
+
4
+ class TestVeritrans < Minitest::Test
5
+
6
+ def setup
7
+ @mt_test = Veritrans.new(
8
+ server_key: "SB-Mid-server-uQmMImQMeo0Ky3Svl90QTUj2",
9
+ client_key: "SB-Mid-client-ArNfhrh7st9bQKmz",
10
+ api_host: "https://api.sandbox.midtrans.com",
11
+ logger: Logger.new(STDOUT),
12
+ file_logger: Logger.new(STDOUT)
13
+ )
14
+ end
15
+
16
+ def test_charge_permata_va
17
+ result = @mt_test.charge(
18
+ {
19
+ "payment_type": "bank_transfer",
20
+ "transaction_details": {
21
+ "gross_amount": 10000,
22
+ "order_id": "ruby-lib-test-#{Time.now.to_i}"
23
+ },
24
+ "bank_transfer": {
25
+ "bank": "permata",
26
+ "va_number": "1234567891"
27
+ }
28
+ }
29
+ )
30
+ assert_equal 201, result.status_code
31
+ assert_equal "pending", result.transaction_status
32
+ assert_equal "Success, PERMATA VA transaction is successful", result.status_message
33
+ end
34
+
35
+ def test_cancel_permata_va
36
+ charge = @mt_test.charge(
37
+ {
38
+ "payment_type": "bank_transfer",
39
+ "transaction_details": {
40
+ "gross_amount": 10000,
41
+ "order_id": "ruby-lib-test-#{Time.now.to_i}"
42
+ },
43
+ "bank_transfer": {
44
+ "bank": "permata",
45
+ "va_number": "1234567891"
46
+ }
47
+ }
48
+ )
49
+ cancel = @mt_test.cancel(charge.transaction_id)
50
+ assert_equal 200, cancel.status_code
51
+ assert_equal "cancel", cancel.transaction_status
52
+ end
53
+
54
+ def test_expire_permata_va
55
+ charge = @mt_test.charge(
56
+ {
57
+ "payment_type": "bank_transfer",
58
+ "transaction_details": {
59
+ "gross_amount": 10000,
60
+ "order_id": "ruby-lib-test-#{Time.now.to_i}"
61
+ },
62
+ "bank_transfer": {
63
+ "bank": "permata",
64
+ "va_number": "1234567891"
65
+ }
66
+ }
67
+ )
68
+ expire = @mt_test.expire(charge.transaction_id)
69
+ assert_equal "Success, transaction has expired", expire.status_message
70
+ assert_equal 407, expire.status_code
71
+ assert_equal "expire", expire.transaction_status
72
+ end
73
+
74
+ def test_get_status_transaction
75
+ charge = @mt_test.charge(
76
+ {
77
+ "payment_type": "bank_transfer",
78
+ "transaction_details": {
79
+ "gross_amount": 10000,
80
+ "order_id": "ruby-lib-test-#{Time.now.to_i}"
81
+ },
82
+ "bank_transfer": {
83
+ "bank": "permata",
84
+ "va_number": "1234567891"
85
+ }
86
+ }
87
+ )
88
+ result = @mt_test.status(charge.transaction_id)
89
+ assert_equal 201, result.status_code
90
+ assert_equal "Success, transaction is found", result.status_message
91
+ end
92
+
93
+ def test_approve_transaction
94
+ card = {
95
+ card_number: 5510111111111115,
96
+ card_cvv: 123,
97
+ card_exp_month: 12,
98
+ card_exp_year: 2025
99
+ }
100
+ get_token = @mt_test.test_token(card)
101
+ charge = @mt_test.charge(
102
+ {
103
+ "payment_type": "credit_card",
104
+ "transaction_details": {
105
+ "gross_amount": 10000,
106
+ "order_id": "ruby-lib-test-#{Time.now.to_i}"
107
+ },
108
+ "credit_card": {
109
+ "token_id": "#{get_token.token_id}",
110
+ "authentication": "false"
111
+ }
112
+ }
113
+ )
114
+ result = @mt_test.approve(charge.transaction_id)
115
+ assert_equal "Success, transaction is approved", result.status_message
116
+ assert_equal 200, result.status_code
117
+ assert_equal "accept", result.fraud_status
118
+ end
119
+
120
+ def test_deny_transaction
121
+ card = {
122
+ card_number: 5510111111111115,
123
+ card_cvv: 123,
124
+ card_exp_month: 12,
125
+ card_exp_year: 2025
126
+ }
127
+ get_token = @mt_test.test_token(card)
128
+ charge = @mt_test.charge(
129
+ {
130
+ "payment_type": "credit_card",
131
+ "transaction_details": {
132
+ "gross_amount": 10000,
133
+ "order_id": "ruby-lib-test-#{Time.now.to_i}"
134
+ },
135
+ "credit_card": {
136
+ "token_id": "#{get_token.token_id}",
137
+ "authentication": "false"
138
+ }
139
+ }
140
+ )
141
+ result = @mt_test.deny(charge.transaction_id)
142
+ assert_equal 200, result.status_code
143
+ assert_equal "Success, transaction is denied", result.status_message
144
+ assert_equal "deny", result.fraud_status
145
+ end
146
+
147
+ def test_fail_refund_transaction
148
+ begin
149
+ param = {
150
+ "refund_key": "reference1",
151
+ "amount": 5000,
152
+ "reason": "for some reason"
153
+ }
154
+ @mt_test.refund("dummy-order-id", param)
155
+ rescue MidtransError => e
156
+ assert_equal "404", e.status
157
+ end
158
+ end
159
+
160
+ end
data/lib/veritrans/api.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # Veritrans API methods
2
2
 
3
- require 'uri'
3
+ require 'erb'
4
4
 
5
5
  class Veritrans
6
6
  module Api
@@ -47,10 +47,13 @@ class Veritrans
47
47
 
48
48
  def test_token(options = {})
49
49
  options[:client_key] = config.client_key
50
- request_with_logging(:get, config.api_host + '/v2/token', options).token_id
50
+ request_with_logging(:get, config.api_host + '/v2/token', options)
51
51
  end
52
52
 
53
+ alias_method :create_card_token, :test_token
54
+
53
55
  # POST https://app.sandbox.midtrans.com/snap/v1/transactions
56
+ # Create Snap payment page, with this version returning full API response
54
57
  def create_snap_token(options = {})
55
58
  result = request_with_logging(:post, config.api_host.sub('//api.', '//app.') + "/snap/v1/transactions", options)
56
59
  Veritrans::SnapResult.new(result.response, result.url, result.request_options, result.time)
@@ -59,6 +62,20 @@ class Veritrans
59
62
  alias_method :create_widget_token, :create_snap_token
60
63
  alias_method :create_snap_redirect_url, :create_snap_token
61
64
 
65
+ # POST https://app.sandbox.midtrans.com/snap/v1/transactions
66
+ # Create Snap payment page, with this version returning token
67
+ def create_snap_token_string(options = {})
68
+ result = create_snap_token(options)
69
+ result.token
70
+ end
71
+
72
+ # POST https://app.sandbox.midtrans.com/snap/v1/transactions
73
+ # Create Snap payment page, with this version returning redirect url
74
+ def create_snap_redirect_url_str(options = {})
75
+ result = create_snap_token(options)
76
+ result.redirect_url
77
+ end
78
+
62
79
  # POST /v2/{id}/cancel
63
80
  # Docs https://api-docs.midtrans.com/#cancel-transaction
64
81
  def cancel(payment_id, options = {})
@@ -66,7 +83,7 @@ class Veritrans
66
83
  raise ArgumentError, "parameter payment_id can not be blank (got #{payment_id.class} : #{payment_id.inspect})"
67
84
  end
68
85
 
69
- request_with_logging(:post, config.api_host + "/v2/#{URI.escape(payment_id)}/cancel", options)
86
+ request_with_logging(:post, config.api_host + "/v2/#{ERB::Util.url_encode(payment_id)}/cancel", options)
70
87
  end
71
88
 
72
89
  # POST /v2/{id}/approve
@@ -76,7 +93,7 @@ class Veritrans
76
93
  raise ArgumentError, "parameter payment_id can not be blank (got #{payment_id.class} : #{payment_id.inspect})"
77
94
  end
78
95
 
79
- request_with_logging(:post, config.api_host + "/v2/#{URI.escape(payment_id)}/approve", options)
96
+ request_with_logging(:post, config.api_host + "/v2/#{ERB::Util.url_encode(payment_id)}/approve", options)
80
97
  end
81
98
 
82
99
  # POST /v2/{id}/refund
@@ -96,7 +113,7 @@ class Veritrans
96
113
  raise ArgumentError, "parameter payment_id can not be blank (got #{payment_id.class} : #{payment_id.inspect})"
97
114
  end
98
115
 
99
- get(config.api_host + "/v2/#{URI.escape(payment_id)}/status")
116
+ get(config.api_host + "/v2/#{ERB::Util.url_encode(payment_id)}/status")
100
117
  end
101
118
 
102
119
  # POST /v2/capture
@@ -126,7 +143,7 @@ class Veritrans
126
143
  raise ArgumentError, "parameter payment_id can not be blank (got #{payment_id.class} : #{payment_id.inspect})"
127
144
  end
128
145
 
129
- request_with_logging(:post, config.api_host + "/v2/#{URI.escape(payment_id)}/expire", nil)
146
+ request_with_logging(:post, config.api_host + "/v2/#{ERB::Util.url_encode(payment_id)}/expire", nil)
130
147
  end
131
148
 
132
149
  # POST /v2/charge { payment_type: "vtlink" }
@@ -138,7 +155,7 @@ class Veritrans
138
155
 
139
156
  # DELETE /v2/vtlink/{id}
140
157
  def delete_vtlink(id, options)
141
- request_with_logging(:delete, config.api_host + "/v2/vtlink/#{URI.escape(id)}", options)
158
+ request_with_logging(:delete, config.api_host + "/v2/vtlink/#{ERB::Util.url_encode(id)}", options)
142
159
  end
143
160
 
144
161
  # GET /v2/point_inquiry/{token_id}
@@ -152,5 +169,85 @@ class Veritrans
152
169
 
153
170
  alias_method :point_inquiry, :inquiry_points
154
171
 
155
- end
172
+ # POST /v2/pay/account
173
+ # param create pay account request (more params detail refer to: https://api-docs.midtrans.com/#create-pay-account)
174
+ def link_payment_account(param)
175
+ if param == nil
176
+ raise ArgumentError, "parameter Payment_type gopay cannot be blank"
177
+ end
178
+
179
+ request_with_logging(:post, config.api_host + "/v2/pay/account", param)
180
+ end
181
+
182
+ # GET /v2/pay/account/{account_id}
183
+ # account_id (more params detail refer to: https://api-docs.midtrans.com/#get-pay-account)
184
+ def get_payment_account(account_id)
185
+ if account_id == nil || account_id == ''
186
+ raise ArgumentError, "account_id cannot be blank"
187
+ end
188
+
189
+ request_with_logging(:get, config.api_host + "/v2/pay/account/#{account_id}", {})
190
+ end
191
+
192
+ # POST /v2/pay/account/{account_id}/unbind
193
+ # account_id (more params detail refer to: https://api-docs.midtrans.com/#unbind-pay-account)
194
+ def unlink_payment_account(account_id)
195
+ if account_id == nil || account_id == ''
196
+ raise ArgumentError, "parameter account_id cannot be blank"
197
+ end
198
+
199
+ request_with_logging(:post, config.api_host + "/v2/pay/account/#{account_id}/unbind", {})
200
+ end
201
+
202
+ # POST /v1/subscription
203
+ # param create subscription request (more params detail refer to: https://api-docs.midtrans.com/#create-subscription)
204
+ def create_subscription(param)
205
+ if param == nil
206
+ raise ArgumentError, "parameter subscription cannot be blank"
207
+ end
208
+
209
+ request_with_logging(:post, config.api_host + "/v1/subscriptions", param)
210
+ end
211
+
212
+ # GET /v1/subscription/{subscription_id}
213
+ # get subscription request (more params detail refer to: https://api-docs.midtrans.com/#get-subscription)
214
+ def get_subscription(subscription_id)
215
+ if subscription_id == nil || subscription_id == ''
216
+ raise ArgumentError, "subscription_id cannot be blank"
217
+ end
218
+
219
+ request_with_logging(:get, config.api_host + "/v1/subscriptions/#{subscription_id}", {})
220
+ end
221
+
222
+ # POST /v1/subscription/{subscription_id}/disable
223
+ # disable subscription request (more params detail refer to: https://api-docs.midtrans.com/#disable-subscription)
224
+ def disable_subscription(subscription_id)
225
+ if subscription_id == nil || subscription_id == ''
226
+ raise ArgumentError, "subscription_id cannot be blank"
227
+ end
228
+
229
+ request_with_logging(:post, config.api_host + "/v1/subscriptions/#{subscription_id}/disable", {})
230
+ end
231
+
232
+ # POST /v1/subscription/{subscription_id}/disable
233
+ # enable subscription request (more params detail refer to: https://api-docs.midtrans.com/#enable-subscription)
234
+ def enable_subscription(subscription_id)
235
+ if subscription_id == nil || subscription_id == ''
236
+ raise ArgumentError, "subscription_id cannot be blank"
237
+ end
238
+
239
+ request_with_logging(:post, config.api_host + "/v1/subscriptions/#{subscription_id}/enable", {})
240
+ end
241
+
242
+ # PATCH /v1/subscription/{subscription_id}
243
+ # update subscription request (more params detail refer to: https://api-docs.midtrans.com/#update-subscription)
244
+ def update_subscription(subscription_id, param)
245
+ if subscription_id && param == nil || subscription_id && param == ''
246
+ raise ArgumentError, "subscription_id and param cannot be blank"
247
+ end
248
+
249
+ request_with_logging(:patch, config.api_host + "/v1/subscriptions/#{subscription_id}", param)
250
+ end
251
+ end
252
+
156
253
  end
@@ -68,27 +68,38 @@ class Veritrans
68
68
  make_request(:post, url, params)
69
69
  end
70
70
 
71
+ def patch(url, params)
72
+ make_request(:patch, url, params)
73
+ end
74
+
71
75
  def make_request(method, url, params, auth_header = nil)
72
76
  if !config.server_key || config.server_key == ''
73
- raise "Please add server_key to config/veritrans.yml"
77
+ raise "Please configure your server key"
74
78
  end
75
79
 
76
80
  method = method.to_s.upcase
77
- logger.info "Veritrans: #{method} #{url} #{_json_encode(params)}"
81
+ logger.info "Midtrans: #{method} #{url} #{_json_encode(params)}"
78
82
  #logger.info "Veritrans: Using server key: #{config.server_key}"
79
83
  #puts "Veritrans: #{method} #{url} #{_json_encode(params)}"
80
84
 
81
85
  default_options = config.http_options || {}
82
86
 
87
+ idempotency_key = config.idempotency_key
88
+ append_notif_url = config.append_notif_url
89
+ override_notif_url = config.override_notif_url
90
+
83
91
  # Add authentication and content type
84
92
  # Docs https://api-docs.midtrans.com/#http-s-header
85
93
  request_options = {
86
94
  :path => URI.parse(url).path,
87
95
  :headers => {
88
- :Authorization => auth_header || basic_auth_header(config.server_key),
89
- :Accept => "application/json",
90
- :"Content-Type" => "application/json",
91
- :"User-Agent" => "Veritrans ruby gem #{Veritrans::VERSION}"
96
+ "Authorization" => auth_header || basic_auth_header(config.server_key),
97
+ "Accept" => "application/json",
98
+ "Content-Type" => "application/json",
99
+ "User-Agent" => "Veritrans ruby gem #{Veritrans::VERSION}",
100
+ "Idempotency-Key" => "#{idempotency_key}",
101
+ "X-Append-Notification" => "#{append_notif_url}",
102
+ "X-Override-Notification" => "#{override_notif_url}"
92
103
  }
93
104
  }
94
105
 
@@ -109,7 +120,29 @@ class Veritrans
109
120
 
110
121
  response = request.send(method.downcase.to_sym, request_options)
111
122
 
112
- logger.info "Veritrans: got #{(Time.now - s_time).round(3)} sec #{response.status} #{response.body}"
123
+ if defined?(response.body)
124
+ response_body = JSON.parse(response.body)
125
+ if response_body.has_key? 'status_code'
126
+ status_code = Integer(response_body["status_code"])
127
+ if status_code >= 400 && status_code != 407
128
+ raise MidtransError.new(
129
+ "Midtrans API is returning API error. HTTP status code: #{status_code}",
130
+ "#{status_code}",
131
+ "#{response_body}",
132
+ "#{response}")
133
+ end
134
+ end
135
+ end
136
+
137
+ if response.status >= 400
138
+ raise MidtransError.new(
139
+ "Midtrans API is returning API error. HTTP status code: #{response.status} API response: #{response.body}",
140
+ "#{response.status}",
141
+ "#{response.body}",
142
+ "#{response}")
143
+ end
144
+
145
+ logger.info "Midtrans: got #{(Time.now - s_time).round(3)} sec #{response.status} #{response.body}"
113
146
 
114
147
  Result.new(response, url, request_options, Time.now - s_time)
115
148
 
@@ -20,7 +20,6 @@ class Veritrans
20
20
  @client_key = value
21
21
  end
22
22
 
23
-
24
23
  def client_key
25
24
  @client_key
26
25
  end
@@ -72,13 +71,37 @@ class Veritrans
72
71
  diff = options.keys.map(&:to_sym) - Excon::VALID_CONNECTION_KEYS
73
72
  if diff.size > 0
74
73
  raise ArgumentError,
75
- "http_options contain unsupported keys: #{diff.inspect}\n" +
76
- "Supported keys are: #{Excon::VALID_CONNECTION_KEYS.inspect}"
74
+ "http_options contain unsupported keys: #{diff.inspect}\n" +
75
+ "Supported keys are: #{Excon::VALID_CONNECTION_KEYS.inspect}"
77
76
  end
78
77
 
79
78
  @http_options = options
80
79
  end
81
80
 
81
+ def idempotency_key=(value)
82
+ @idempotency_key = value
83
+ end
84
+
85
+ def idempotency_key
86
+ @idempotency_key
87
+ end
88
+
89
+ def append_notif_url=(value)
90
+ @append_notif_url = value
91
+ end
92
+
93
+ def append_notif_url
94
+ @append_notif_url
95
+ end
96
+
97
+ def override_notif_url=(value)
98
+ @override_notif_url = value
99
+ end
100
+
101
+ def override_notif_url
102
+ @override_notif_url
103
+ end
104
+
82
105
  def http_options
83
106
  @http_options
84
107
  end
@@ -0,0 +1,15 @@
1
+ class MidtransError < StandardError
2
+ attr_reader :status
3
+ alias_method :http_status_code, :status
4
+ attr_reader :data
5
+ alias_method :api_response, :data
6
+ attr_reader :response
7
+ alias_method :raw_http_client_data, :response
8
+
9
+ def initialize(message, http_status_code = nil, api_response = nil, raw_http_client_data = nil)
10
+ super(message)
11
+ @status = http_status_code
12
+ @data = api_response
13
+ @response = raw_http_client_data
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  class Veritrans
2
- VERSION = "2.3.0"
2
+ VERSION = "2.4.0"
3
3
  end
data/lib/veritrans.rb CHANGED
@@ -3,6 +3,7 @@ require 'veritrans/config'
3
3
  require 'veritrans/client'
4
4
  require 'veritrans/api'
5
5
  require 'veritrans/result'
6
+ require 'veritrans/midtrans_error'
6
7
 
7
8
  if defined?(::Rails)
8
9
  require 'veritrans/events'
@@ -12,18 +13,16 @@ class Veritrans
12
13
  include Veritrans::Client
13
14
  include Veritrans::Api
14
15
 
15
- autoload :Testing, 'veritrans/testing'
16
- autoload :TestingLib, 'veritrans/testing'
17
- autoload :CLI, 'veritrans/cli'
18
16
  autoload :Events, 'veritrans/events'
19
17
 
20
18
  class << self
21
19
  extend Forwardable
22
20
 
23
21
  def_delegators :instance, :logger, :logger=, :config, :setup, :file_logger, :file_logger=
24
- def_delegators :instance, :request_with_logging, :basic_auth_header, :get, :post, :delete, :make_request
25
- def_delegators :instance, :charge, :cancel, :approve, :status, :capture, :expire, :refund, :test_token, :deny
26
- def_delegators :instance, :create_vtlink, :delete_vtlink, :inquiry_points, :create_widget_token, :create_snap_redirect_url, :create_snap_token
22
+ def_delegators :instance, :request_with_logging, :basic_auth_header, :get, :post, :delete, :make_request, :patch
23
+ def_delegators :instance, :charge, :cancel, :approve, :status, :capture, :expire, :refund, :deny
24
+ def_delegators :instance, :create_vtlink, :delete_vtlink, :inquiry_points, :create_widget_token, :create_snap_redirect_url, :create_snap_token, :create_snap_token_string, :create_snap_redirect_url_str, :test_token, :create_card_token
25
+ def_delegators :instance, :link_payment_account, :get_payment_account, :unlink_payment_account, :create_subscription, :get_subscription, :disable_subscription, :enable_subscription, :update_subscription
27
26
  def_delegators :instance, :checksum, :events
28
27
 
29
28
  # Shortcut for Veritrans::Events
data/veritrans.gemspec CHANGED
@@ -14,8 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.files = `git ls-files`.split("\n")
15
15
  s.test_files = []
16
16
 
17
- s.require_paths = ["lib"]
18
- s.executables = ["veritrans", "midtrans"]
17
+ s.require_paths = ["lib"]
19
18
 
20
19
  s.add_runtime_dependency "excon", "~> 0.20"
21
20
  end