veritrans 2.3.0 → 2.4.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.
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,66 @@
1
+ require 'veritrans'
2
+
3
+ # This is just for very basic implementation reference, in production, you should validate the incoming requests and implement your backend more securely.
4
+
5
+ # Set Midtrans config
6
+ # You can find it in Merchant Portal -> Settings -> Access keys
7
+ Midtrans.config.server_key = "SB-Mid-server-uQmMImQMeo0Ky3Svl90QTUj2"
8
+ Midtrans.config.client_key = "SB-Mid-client-ArNfhrh7st9bQKmz"
9
+ Midtrans.config.api_host = "https://api.sandbox.midtrans.com"
10
+
11
+ # IMPORTANT NOTE: You should do credit card get token via frontend using `midtrans-new-3ds.min.js`, to avoid card data breach risks on your backend
12
+ # ( refer to: https://docs.midtrans.com/en/core-api/credit-card?id=_1-getting-the-card-token )
13
+ # For full example on Credit Card 3DS transaction refer to:
14
+ # (/example/sinatra) that implement Snap & Core Api
15
+
16
+ # prepare CORE API parameter to get credit card token
17
+ # another sample of card number can refer to https://docs.midtrans.com/en/technical-reference/sandbox-test?id=card-payments
18
+ begin
19
+ card = {
20
+ card_number: 5211111111111117,
21
+ card_cvv: 123,
22
+ card_exp_month: 12,
23
+ card_exp_year: 2025
24
+ }
25
+ get_token = Midtrans.create_card_token(card)
26
+
27
+ # prepare CORE API parameter to charge credit card ( refer to: https://docs.midtrans.com/en/core-api/credit-card?id=_2-sending-transaction-data-to-charge-api )
28
+ result = Midtrans.charge(
29
+ {
30
+ "payment_type": "credit_card",
31
+ "transaction_details": {
32
+ "gross_amount": 10000,
33
+ "order_id": "ruby-example-coreapi-creditcard-#{Time.now.to_i}"
34
+ },
35
+ "credit_card": {
36
+ "token_id": "#{get_token.token_id}"
37
+ }
38
+ }
39
+ )
40
+ puts "charge result : #{result.data}"
41
+ rescue MidtransError => e
42
+ puts e.message # Basic message error
43
+ puts e.http_status_code # HTTP status code e.g: 400, 401, etc.
44
+ puts e.api_response # API response body in String
45
+ puts e.raw_http_client_data # Raw HTTP client response
46
+ end
47
+
48
+ # result.data this will be Hash representation of the API JSON response, of example:
49
+ # {
50
+ # : status_code => "200",
51
+ # : status_message => "Success, Credit Card transaction is successful",
52
+ # : channel_response_code => "00",
53
+ # : channel_response_message => "Approved",
54
+ # : bank => "bni",
55
+ # : transaction_id => "21386a6e-6e26-4191-9d05-877aa6063c08",
56
+ # : order_id => "ruby-example-coreapi-creditcard-1634014338",
57
+ # : merchant_id => "G686051436",: gross_amount => "10000.00",
58
+ # : currency => "IDR",
59
+ # : payment_type => "credit_card",
60
+ # : transaction_time => "2021-10-12 11:52:18",
61
+ # : transaction_status => "capture",
62
+ # : fraud_status => "accept",
63
+ # : approval_code => "1634014339258",
64
+ # : masked_card => "521111-1117",
65
+ # : card_type => "debit"
66
+ # }
@@ -0,0 +1,4 @@
1
+ How to run core_api_credit_card_example:
2
+
3
+ 1. Install dependencies: `gem install veritrans`
4
+ 2. Run the file: `ruby core_api_credit_card_example.rb`
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+ gem 'sinatra'
3
+ gem 'veritrans', path: "./../../" # install from local path, for testing purpose
4
+
5
+ # @NOTE: in real usage scenario, for your project dependency you should only require
6
+ # gem 'veritrans'
7
+ # so the gem will be installed directly from rubygem repo. No need the `, path: "./../../"`
@@ -1,8 +1,6 @@
1
- To run examples:
1
+ How to run sinatra example:
2
2
 
3
- ```
4
- gem install sinatra
5
- ruby sinatra.rb
6
- ```
3
+ 1. Install dependencies: `bundle install`
4
+ 2. Run the sinatra app: `bundle exec ruby webapp.rb`
7
5
 
8
- Or see online demo https://veritrans-ruby-example.herokuapp.com/
6
+ The app will run at port 4567. Open `localhost:4567` from your browser.
@@ -1,214 +1,202 @@
1
1
  <!doctype html>
2
2
  <html>
3
3
  <head>
4
- <title>veritrans-ruby demo</title>
5
- <link rel="icon" type="image/x-icon" href="https://account.midtrans.com/favicon.ico" />
6
- <link rel="stylesheet" href="/style.css">
4
+ <title>Midtrans-Ruby simple demo</title>
5
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/featherlight/1.7.12/featherlight.min.css">
7
6
  </head>
8
7
  <body>
9
8
 
10
9
  <header>
11
- <h3>Midtrans sinatra app</h3>
10
+ <h3>Midtrans sample demo sinatra app</h3>
12
11
  <a href="https://github.com/veritrans/veritrans-ruby" class="github">Source Code</a>
13
12
  </header>
14
13
 
15
14
  <section>
16
- <h4>VT-Web</h4>
17
- <form action="/charge_vtweb" method="GET" id="vtweb_form">
18
- <fieldset>
19
- <p>
20
- <label>Language</label>
21
- <select name="locale">
22
- <option></option>
23
- <option value="id">Indonesian</option>
24
- <option value="en">English</option>
25
- </select>
26
- </p>
27
-
28
- <div class="form-row">
29
- <label>Payment Types</label>
30
- <ul>
31
- <% @payment_types = %w{CREDIT_CARD MANDIRI_CLICKPAY MANDIRI_BILL CIMB_CLICKS INDOMARET BANK_TRANSFER MANDIRI_BILL} %>
32
- <% for type in @payment_types %>
33
- <li>
34
- <label>
35
- <input type="checkbox" name="enabled_payments[]" value="<%= type %>">
36
- <%= type.split("_").map(&:capitalize).join(' ') %>
37
- </label>
38
- </li>
39
- <% end %>
40
- </ul>
41
- <br/>
42
- <small class="types-hint">By default Veritrans will show all available types</small>
43
- </div>
44
-
45
- <p>
46
- <label>Credit Card BIN promo</label>
47
- <input type="text" name="bin_promo" placeholder="411111, 500000, bni, mandiri, 3111">
48
- <br/>
49
- <small class="bins-hint">
50
- <a href="https://api-docs.midtrans.com/#card-features-bin-promo">See documentation</a>
51
- </small>
52
- </p>
53
-
54
- <p>
55
- <label>Credit Card 3D Secure</label>
56
- <select name="credit_card_3d_secure">
57
- <option></option>
58
- <option value="true">Yes</option>
59
- <option value="false">No</option>
60
- </select>
61
- </p>
62
-
63
- <div class="form-row">
64
- <label>Credit Card Installment</label>
65
- <ul>
66
- <li>
67
- <label><input type="checkbox" name="installment[bni]">BNI</label>
68
- </li>
69
- <li>
70
- <label><input type="checkbox" name="installment[mandiri]">Mandiri</label>
71
- </li>
72
- <li>
73
- <label><input type="checkbox" name="installment[bca]">BCA</label>
74
- </li>
75
- </ul>
76
- </div>
77
-
78
- </fieldset>
79
-
80
- <p>
81
- <input type="submit" value="Create payment page">
82
- <p>
83
- </form>
15
+ <h4>Snap Popup</h4>
16
+ <a href="/snap">Click here</a>
84
17
  </section>
85
18
 
86
19
  <section>
87
- <h4>VT-Direct</h4>
88
-
89
- <form action="/charge_vtdirect" method="post" id="card_form">
90
- <input type="hidden" name="token_id" id="card_token">
91
- <fieldset>
92
- <legend>Credit card</legend>
93
- <p>
94
- <label for="gross_amount">Amount, Rp.</label>
95
- <input type="text" name="gross_amount" id="gross_amount" value="30000">
96
- </p>
97
- <p>
98
- <label for="card_number">Card number</label>
99
- <input type="text" id="card_number" style="width: 150px" value="4811 1111 1111 1114">
100
- <br>
101
- <small style="margin-left: 100px" class="card-numbers">
102
- <a onclick="$('#card_number').val('4811 1111 1111 1114')">success Visa</a>
103
- <a onclick="$('#card_number').val('5810 1111 1111 1112')">success MasterCard</a>
104
- <a onclick="$('#card_number').val('4511 1111 1111 1117')">challenge</a>
105
- <a onclick="$('#card_number').val('4611 1111 1111 1116')">Deny by FDS</a>
106
- <a onclick="$('#card_number').val('4911 1111 1111 1113')">Deny by bank</a>
107
- <a href="https://docs.midtrans.com/en/reference/test.html" target="_blank">documentation</a>
108
- </small>
109
- </p>
110
- <p>
111
- <label for="card_cvc">Security Code</label>
112
- <input type="text" id="card_cvc" style="width: 30px" placeholder="cvc" value="123">
113
- </p>
114
- <p>
115
- <label for="card_exp">Expiration date</label>
116
- <input type="text" id="card_exp" placeholder="MM / YY" value="12 / 18">
117
- </p>
118
-
119
- <p>
120
- <label for="card_secure">3D-secure</label>
121
- <input type="checkbox" id="card_secure">
122
- </p>
123
-
124
- </fieldset>
125
-
126
- <input id="submit_btn" type="submit">
127
- </form>
20
+ <h4>Snap Redirect</h4>
21
+ <a href="/snap_redirect">Click here</a>
128
22
  </section>
23
+ <br>
24
+ <h3>Core API Credit Card</h3>
25
+ <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/picomodal/3.0.0/picoModal.js"></script>
26
+
27
+ <h1>Checkout</h1>
28
+ <form action="/coreapi_card_charge_ajax_handler" method="POST" id="payment-form">
29
+ <fieldset>
30
+ <legend>Checkout</legend>
31
+ <small><strong>Field that may be presented to customer:</strong></small>
32
+ <p>
33
+ <label>Card Number</label>
34
+ <input class="card-number" value="4811 1111 1111 1114" size="23" type="text" autocomplete="off" />
35
+ </p>
36
+ <p>
37
+ <label>Expiration (MM/YYYY)</label>
38
+ <input class="card-expiry-month" value="12" placeholder="MM" size="2" type="text" />
39
+ <span> / </span>
40
+ <input class="card-expiry-year" value="2025" placeholder="YYYY" size="4" type="text" />
41
+ </p>
42
+ <p>
43
+ <label>CVV</label>
44
+ <input class="card-cvv" value="123" size="4" type="password" autocomplete="off" />
45
+ </p>
129
46
 
130
- <section>
131
- <h4>Localization</h4>
132
- Indonesian translation for validation messages
133
- <a href="/localization">Click here</a>
134
- </section>
135
-
136
- <section>
137
- <h4>Recurring</h4>
138
- <a href="/recurring">Click here</a>
139
- </section>
140
-
141
- <section>
142
- <h4>Credit Card Points</h4>
143
- <a href="/points">Click here</a>
144
- </section>
145
-
146
- <section>
147
- <h4>Snap</h4>
148
- <a href="/widget">Click here</a>
149
- </section>
150
-
151
- <script src="https://api.sandbox.midtrans.com/v2/assets/veritrans.js"></script>
152
- <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
153
- <script src="//cdnjs.cloudflare.com/ajax/libs/jquery.payment/1.0.2/jquery.payment.js"></script>
154
- <script src="//cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/0.9.9/jquery.magnific-popup.min.js"></script>
155
- <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/0.9.9/magnific-popup.css">
156
-
47
+ <small><strong>Fields that shouldn't be presented to the customer:</strong></small>
48
+ <p>
49
+ <label>3D Secure</label>
50
+ <input class="authenticate_3ds" type="checkbox" name="authenticate_3ds" value="true" checked>
51
+ </p>
52
+
53
+ <input id="token_id" name="token_id" type="hidden" />
54
+ <button class="submit-button" type="submit">Submit Payment</button>
55
+ </fieldset>
56
+ </form>
57
+
58
+ <code>
59
+ <b>Transaction Result:</b>
60
+ <pre id="result"> Awaiting transactions... </pre>
61
+ <b>Transaction verified status result:</b>
62
+ <pre id="status-result"> Awaiting transactions... </pre>
63
+ <pre>
64
+ <b>Testing cards:</b>
65
+
66
+ <b>For 3D Secure:</b>
67
+ Visa success 4811 1111 1111 1114
68
+ Visa deny by bank 4711 1111 1111 1115
69
+ Visa deny by FDS 4611 1111 1111 1116
70
+
71
+ MasterCard success 5211 1111 1111 1117
72
+ MasterCard deny by bank 5111 1111 1111 1118
73
+ MasterCard deny by FDS 5411 1111 1111 1115
74
+
75
+ Challenge by FDS 4511 1111 1111 1117
76
+ </pre>
77
+ </code>
78
+
79
+ <!-- Import MidtransNew3ds library -->
80
+ <!-- TODO change data-environment to `production` for Production mode -->
81
+ <!-- TODO change data-client-key to your production client key for Production mode -->
82
+ <script id= "midtrans-script" src="https://api.midtrans.com/v2/assets/js/midtrans-new-3ds.min.js" data-environment="sandbox" data-client-key=<%= Midtrans.config.client_key %> type="text/javascript"></script>
83
+
84
+ <!-- Javascript for token generation -->
157
85
  <script type="text/javascript">
158
- // set Veritrans settings
159
- Veritrans.url = "<%= Veritrans.config.api_host %>/v2/token";
160
- Veritrans.client_key = "<%= Veritrans.config.client_key %>";
161
-
162
- function createTokenData() {
163
- return {
164
- // Optional params:
165
- // secure: true
166
- // bank: 'MANDIRI'
167
-
168
- card_number: $('#card_number').val(),
169
- card_cvv: $('#card_cvc').val(),
170
- card_exp_month: $('#card_exp').val().match(/(\d+) \//)[1],
171
- card_exp_year: '20' + $('#card_exp').val().match(/\/ (\d+)/)[1],
172
- gross_amount: $('#gross_amount').val(),
173
- secure: $('#card_secure')[0].checked
86
+ // On Submit button clicked
87
+ document.querySelector(".submit-button").onclick = function (event) {
88
+ console.log("SUBMIT button clicked");
89
+ // prepare cardData
90
+ var cardData = {
91
+ "card_number": document.querySelector(".card-number").value,
92
+ "card_exp_month": document.querySelector(".card-expiry-month").value,
93
+ "card_exp_year": document.querySelector(".card-expiry-year").value,
94
+ "card_cvv": document.querySelector(".card-cvv").value,
95
+ };
96
+ // [1] Use card data to get card token on the callback
97
+ MidtransNew3ds.getCardToken(cardData, getCardTokenCallback);
98
+
99
+ event.preventDefault(); return false;
174
100
  };
175
- }
176
-
177
- $(document).ready(function () {
178
- $('#card_number').payment('formatCardNumber');
179
- $('#card_cvc').payment('formatCardCVC');
180
- $('#card_exp').payment('formatCardExpiry');
181
-
182
- $('#card_form').on('submit', function (event) {
183
- var form = this;
184
- $('#submit_btn').attr('disabled', true).val("Processing ...");
185
- event.preventDefault();
186
-
187
- Veritrans.token(createTokenData, function (data) {
188
- console.log('Token data:', data);
189
- // if we get url then it's 3d-secure transaction
190
- // so we need to open that page
191
- // this callback function will be called again after user confirm 3d-secure
192
- // you can also redirect on server side
193
- if (data.redirect_url) {
194
- $.magnificPopup.open({
195
- items: { type: 'iframe', src: data.redirect_url }
196
- });
197
- $.magnificPopup.instance.content.find('iframe').height(590);
198
- // if no redirect_url and we have token_id then just make charge request
199
- } else if (data.token_id) {
200
- $('#card_token').val(data.token_id);
201
- $.magnificPopup.close();
202
- form.submit();
203
- // if no redirect_url and no token_id, then it should be error
204
- } else {
205
- alert(data.validation_messages ? data.validation_messages.join("\n") : data.status_message);
206
- $('#submit_btn').removeAttr('disabled').removeAttr("value");
101
+
102
+ // getCardTokenCallback triggered when `MidtransNew3ds.getCardToken` completed.
103
+ var getCardTokenCallback = {
104
+ onSuccess: function(response){
105
+ // success to get card token
106
+ // [2] Send AJAX to let backend charge the card using the card token_id
107
+ fetch("/coreapi_card_charge_ajax_handler", {
108
+ method : "POST",
109
+ body: JSON.stringify({
110
+ "token_id" : response.token_id,
111
+ "authenticate_3ds" : document.querySelector('.authenticate_3ds').checked
112
+ }),
113
+ headers: {'Content-Type': 'application/json'},
114
+ })
115
+ .then(function(response) { return response.json(); })
116
+ .then(function(responseObj) {
117
+ console.log("Charge response:",responseObj);
118
+ if (responseObj.status_code == "201"){
119
+ // [3.1] Transaction need 3DS authentication
120
+ MidtransNew3ds.authenticate(responseObj.redirect_url, callback3dsAuthentication);
121
+ } else {
122
+ // Transaction do not need 3DS Authentication, transaction is complete with result
123
+ transactionComplete(responseObj);
124
+ }
125
+ })
126
+ },
127
+ onFailure: function(response){
128
+ // fail to get card token
129
+ transactionComplete(response);
130
+ }
131
+ }
132
+
133
+ var callback3dsAuthentication = {
134
+ performAuthentication: function(redirect_url){
135
+ // [3.2] 3ds authentication redirect_url received, open iframe to display to customer
136
+ popupModal.openPopup(redirect_url);
137
+ },
138
+ // [3.3] When 3DS authentication result received, which contains transaction result
139
+ // it will trigger one of function below, according to status: success/failure/pending
140
+ onSuccess: function(response){
141
+ transactionComplete(response);
142
+ },
143
+ onFailure: function(response){
144
+ transactionComplete(response);
145
+ },
146
+ onPending: function(response){
147
+ transactionComplete(response);
148
+
149
+ }
150
+ }
151
+
152
+ function transactionComplete(responseObj){
153
+ // Close 3DS popup, then display the result (for example)
154
+ console.log("transactionComplete with status: ",responseObj);
155
+ popupModal.closePopup();
156
+
157
+ document.querySelector("#result").innerText = JSON.stringify(responseObj, null, 2);
158
+ document.querySelector("#result").scrollIntoView();
159
+
160
+ if (responseObj.transaction_id){
161
+ // [4] Inform the result to backend update DB status and verify to Midtrans
162
+ fetch('/check_transaction_status', {
163
+ method : "POST",
164
+ body: JSON.stringify({ "transaction_id" : responseObj.transaction_id }),
165
+ headers: {'Content-Type': 'application/json'},
166
+ })
167
+ .then(function(statusResponse) { return statusResponse.json(); } )
168
+ .then(function(statusResponseObj) {
169
+ // Transaction status received after being verified
170
+ console.log("Check transaction response:",statusResponseObj);
171
+ // transactionComplete(statusResponseObj);
172
+ document.querySelector("#status-result").innerText =
173
+ JSON.stringify(statusResponseObj, null, 2);
174
+
175
+ })
176
+ }
177
+ }
178
+
179
+ // helper functions below
180
+ let popupModal = (function(){
181
+ let modal = null;
182
+ return {
183
+ openPopup(url){
184
+ modal = picoModal({
185
+ content:'<iframe frameborder="0" style="height:90vh; width:100%;" src="'+url+'"></iframe>',
186
+ width: "75%",
187
+ closeButton: false,
188
+ overlayClose: false,
189
+ escCloses: false
190
+ }).show();
191
+ },
192
+ closePopup(){
193
+ try{
194
+ modal.close();
195
+ } catch(e) {}
196
+ }
207
197
  }
208
- });
209
- });
210
- });
198
+ }());
211
199
  </script>
212
200
 
213
201
  </body>
214
- </html>
202
+ </html>
@@ -1,40 +1 @@
1
- <link rel="stylesheet" href="/style.css">
2
-
3
- <header>
4
- <h3>
5
- <a href="/">Midtrans sinatra app</a>
6
- </h3>
7
- <a href="https://github.com/veritrans/veritrans-ruby" class="github">Source Code</a>
8
- </header>
9
-
10
- <% if @result.redirect_url %>
11
- <section>
12
- <p>Here's redirect url <a href='<%= @vtweb_url %>'><%= @vtweb_url %></a> </p>
13
- </section>
14
- <% end %>
15
-
16
- <section>
17
- <strong>
18
- Veritrans response:
19
- <% if @result.success? %>
20
- <span style="color: green">success</span>
21
- <% end %>
22
- </strong>
23
-
24
- <code>
25
- <pre>
26
- <%= JSON.pretty_generate(JSON.parse(@result.response.body)) %>
27
- </pre>
28
- </code>
29
-
30
- <% if @cahrge_params %>
31
- <strong>Request Body</strong>
32
- <code>
33
- <pre>
34
- <%= JSON.pretty_generate(@cahrge_params) %>
35
- </pre>
36
- </code>
37
- <% end %>
38
-
39
- <a href="/">Go back</a>
40
- </section>
1
+ <%= @result.response.body %>
@@ -0,0 +1,33 @@
1
+ <!doctype html>
2
+ <html>
3
+
4
+ <body>
5
+ <p>
6
+ <label>Snap Token</label>
7
+ <input type="text" id="token" value="<%= @token %>" readonly size="50">
8
+ </p>
9
+ <button id="pay-button">Pay</button>
10
+ <pre><div id="result-json">JSON result will appear here after payment:<br></div></pre>
11
+
12
+ <!-- TODO: Remove ".sandbox" from script src URL for production environment. Also input your client key in "data-client-key" -->
13
+ <script src="https://app.sandbox.midtrans.com/snap/snap.js" data-client-key=<%= Midtrans.config.client_key %>></script>
14
+ <script type="text/javascript">
15
+ document.getElementById('pay-button').onclick = function(){
16
+ // SnapToken acquired from previous step
17
+ snap.pay('<%= @token %>', {
18
+ // Optional
19
+ onSuccess: function(result){
20
+ /* You may add your own js here, this is just example */ document.getElementById('result-json').innerHTML += JSON.stringify(result, null, 2);
21
+ },
22
+ // Optional
23
+ onPending: function(result){
24
+ /* You may add your own js here, this is just example */ document.getElementById('result-json').innerHTML += JSON.stringify(result, null, 2);
25
+ },
26
+ // Optional
27
+ onError: function(result){
28
+ /* You may add your own js here, this is just example */ document.getElementById('result-json').innerHTML += JSON.stringify(result, null, 2);
29
+ }
30
+ });
31
+ };
32
+ </script>
33
+ </body>
@@ -0,0 +1,10 @@
1
+ <!doctype html>
2
+ <html>
3
+
4
+ <body>
5
+ <p>
6
+ <label>Snap Redirect URL</label>
7
+ <input type="text" id="Redirect URL" value="<%= @redirecturl %>" readonly size="50"><br><br>
8
+ <button onclick="location.href='<%= @redirecturl %>'">Open Snap Redirect URL</button></p>
9
+ </body>
10
+ </html>