activemerchant-payline 0.1.9

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 (74) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +5 -0
  3. data/.gitignore +18 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +57 -0
  8. data/Rakefile +1 -0
  9. data/activemerchant-payline.gemspec +33 -0
  10. data/lib/active_merchant/billing/gateways/payline.rb +57 -0
  11. data/lib/active_merchant/billing/gateways/payline/payline_common.rb +368 -0
  12. data/lib/active_merchant/billing/gateways/payline/payline_constants.rb +83 -0
  13. data/lib/active_merchant/billing/gateways/payline/payline_direct_api.rb +78 -0
  14. data/lib/active_merchant/billing/gateways/payline/payline_management_payment_api.rb +154 -0
  15. data/lib/active_merchant/billing/gateways/payline/payline_status_api.rb +36 -0
  16. data/lib/active_merchant/billing/gateways/payline/payline_wallet_management.rb +249 -0
  17. data/lib/active_merchant/billing/gateways/payline/payline_web_api.rb +186 -0
  18. data/lib/active_merchant/billing/iso_4217_currency_codes.rb +32 -0
  19. data/lib/activemerchant-payline.rb +2 -0
  20. data/test/fixtures.yml +8 -0
  21. data/test/fixtures/vcr_cassettes/test_failed_create_wallet.yml +1820 -0
  22. data/test/fixtures/vcr_cassettes/test_failed_disable_payment_record.yml +1821 -0
  23. data/test/fixtures/vcr_cassettes/test_failed_disable_wallet.yml +1820 -0
  24. data/test/fixtures/vcr_cassettes/test_failed_do_authorization.yml +1956 -0
  25. data/test/fixtures/vcr_cassettes/test_failed_do_capture.yml +1890 -0
  26. data/test/fixtures/vcr_cassettes/test_failed_do_credit.yml +1882 -0
  27. data/test/fixtures/vcr_cassettes/test_failed_do_debit.yml +1981 -0
  28. data/test/fixtures/vcr_cassettes/test_failed_do_recurrent_wallet_payment.yml +2033 -0
  29. data/test/fixtures/vcr_cassettes/test_failed_do_refund.yml +1944 -0
  30. data/test/fixtures/vcr_cassettes/test_failed_do_reset.yml +1820 -0
  31. data/test/fixtures/vcr_cassettes/test_failed_do_scheduled_wallet_payment.yml +1927 -0
  32. data/test/fixtures/vcr_cassettes/test_failed_do_web_payment.yml +1822 -0
  33. data/test/fixtures/vcr_cassettes/test_failed_enable_wallet.yml +1819 -0
  34. data/test/fixtures/vcr_cassettes/test_failed_get_payment_record.yml +1821 -0
  35. data/test/fixtures/vcr_cassettes/test_failed_get_wallet.yml +1819 -0
  36. data/test/fixtures/vcr_cassettes/test_failed_get_web_payment_details.yml +1851 -0
  37. data/test/fixtures/vcr_cassettes/test_failed_immediate_wallet_payment.yml +1938 -0
  38. data/test/fixtures/vcr_cassettes/test_failed_manage_web_wallet.yml +1870 -0
  39. data/test/fixtures/vcr_cassettes/test_failed_update_wallet.yml +1820 -0
  40. data/test/fixtures/vcr_cassettes/test_failed_update_web_wallet.yml +1819 -0
  41. data/test/fixtures/vcr_cassettes/test_get_transaction_details.yml +3711 -0
  42. data/test/fixtures/vcr_cassettes/test_get_web_wallet.yml +1871 -0
  43. data/test/fixtures/vcr_cassettes/test_missing_parameters_create_web_wallet.yml +1870 -0
  44. data/test/fixtures/vcr_cassettes/test_missing_parameters_do_web_payment.yml +1822 -0
  45. data/test/fixtures/vcr_cassettes/test_successful_create_wallet.yml +1826 -0
  46. data/test/fixtures/vcr_cassettes/test_successful_create_web_wallet.yml +1822 -0
  47. data/test/fixtures/vcr_cassettes/test_successful_disable_payment_record.yml +1876 -0
  48. data/test/fixtures/vcr_cassettes/test_successful_disable_wallet.yml +1871 -0
  49. data/test/fixtures/vcr_cassettes/test_successful_do_authorization.yml +1837 -0
  50. data/test/fixtures/vcr_cassettes/test_successful_do_bank_transfer.yml +1826 -0
  51. data/test/fixtures/vcr_cassettes/test_successful_do_capture.yml +1889 -0
  52. data/test/fixtures/vcr_cassettes/test_successful_do_credit.yml +1829 -0
  53. data/test/fixtures/vcr_cassettes/test_successful_do_debit.yml +1834 -0
  54. data/test/fixtures/vcr_cassettes/test_successful_do_immediate_wallet_payment.yml +1875 -0
  55. data/test/fixtures/vcr_cassettes/test_successful_do_recurrent_wallet_payment.yml +1827 -0
  56. data/test/fixtures/vcr_cassettes/test_successful_do_refund.yml +1888 -0
  57. data/test/fixtures/vcr_cassettes/test_successful_do_reset.yml +1892 -0
  58. data/test/fixtures/vcr_cassettes/test_successful_do_scheduled_wallet_payment.yml +1821 -0
  59. data/test/fixtures/vcr_cassettes/test_successful_do_web_payment.yml +1821 -0
  60. data/test/fixtures/vcr_cassettes/test_successful_enable_wallet.yml +1924 -0
  61. data/test/fixtures/vcr_cassettes/test_successful_get_payment_record.yml +1891 -0
  62. data/test/fixtures/vcr_cassettes/test_successful_get_wallet.yml +1894 -0
  63. data/test/fixtures/vcr_cassettes/test_successful_get_web_payment_details.yml +1908 -0
  64. data/test/fixtures/vcr_cassettes/test_successful_manage_web_wallet.yml +1821 -0
  65. data/test/fixtures/vcr_cassettes/test_successful_update_wallet.yml +1825 -0
  66. data/test/fixtures/vcr_cassettes/test_successful_update_web_wallet.yml +1820 -0
  67. data/test/run_test.rb +9 -0
  68. data/test/test_helper.rb +350 -0
  69. data/test/unit/gateways/payline/payline_direct_api_test.rb +122 -0
  70. data/test/unit/gateways/payline/payline_management_payment_api_test.rb +197 -0
  71. data/test/unit/gateways/payline/payline_status_api_test.rb +30 -0
  72. data/test/unit/gateways/payline/payline_wallet_management_api_test.rb +297 -0
  73. data/test/unit/gateways/payline/payline_web_api_test.rb +221 -0
  74. metadata +360 -0
@@ -0,0 +1,9 @@
1
+ base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
2
+ lib_dir = File.join(base_dir, "lib")
3
+ test_dir = File.join(base_dir, "test")
4
+
5
+ $LOAD_PATH.unshift(lib_dir)
6
+
7
+ require 'test/unit'
8
+
9
+ exit Test::Unit::AutoRunner.run(true, test_dir)
@@ -0,0 +1,350 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'dotenv/load'
5
+
6
+ require 'bundler/setup'
7
+
8
+ require 'test/unit'
9
+ require 'mocha/test_unit'
10
+ require 'vcr'
11
+
12
+ require 'yaml'
13
+ require 'json'
14
+ require 'erb'
15
+ require 'active_merchant'
16
+ #require 'comm_stub'
17
+
18
+ require 'active_support/core_ext/integer/time'
19
+ require 'active_support/core_ext/numeric/time'
20
+ require 'active_support/core_ext/time/acts_like'
21
+
22
+ VCR.configure do |config|
23
+ config.cassette_library_dir = "test/fixtures/vcr_cassettes"
24
+ config.hook_into :webmock # or :fakeweb
25
+ end
26
+
27
+ ActiveMerchant::Billing::Base.mode = :test
28
+
29
+ if ENV['DEBUG_ACTIVE_MERCHANT'] == 'true'
30
+ require 'logger'
31
+ ActiveMerchant::Billing::Gateway.logger = Logger.new(STDOUT)
32
+ ActiveMerchant::Billing::Gateway.wiredump_device = STDOUT
33
+ end
34
+
35
+ # Test gateways
36
+ class SimpleTestGateway < ActiveMerchant::Billing::Gateway
37
+ end
38
+
39
+ class SubclassGateway < SimpleTestGateway
40
+ end
41
+
42
+ module ActiveMerchant
43
+ module Assertions
44
+ AssertionClass = defined?(Minitest) ? MiniTest::Assertion : Test::Unit::AssertionFailedError
45
+
46
+ def assert_field(field, value)
47
+ clean_backtrace do
48
+ assert_equal value, @helper.fields[field]
49
+ end
50
+ end
51
+
52
+ # Allows testing of negative assertions:
53
+ #
54
+ # # Instead of
55
+ # assert !something_that_is_false
56
+ #
57
+ # # Do this
58
+ # assert_false something_that_should_be_false
59
+ #
60
+ # An optional +msg+ parameter is available to help you debug.
61
+ def assert_false(boolean, message = nil)
62
+ message = build_message message, '<?> is not false or nil.', boolean
63
+
64
+ clean_backtrace do
65
+ assert_block message do
66
+ not boolean
67
+ end
68
+ end
69
+ end
70
+
71
+ # An assertion of a successful response:
72
+ #
73
+ # # Instead of
74
+ # assert response.success?
75
+ #
76
+ # # DRY that up with
77
+ # assert_success response
78
+ #
79
+ # A message will automatically show the inspection of the response
80
+ # object if things go afoul.
81
+ def assert_success(response, message=nil)
82
+ clean_backtrace do
83
+ assert response.success?, build_message(nil, "#{message + "\n" if message}Response expected to succeed: <?>", response)
84
+ end
85
+ end
86
+
87
+ # The negative of +assert_success+
88
+ def assert_failure(response, message=nil)
89
+ clean_backtrace do
90
+ assert !response.success?, build_message(nil, "#{message + "\n" if message}Response expected to fail: <?>", response)
91
+ end
92
+ end
93
+
94
+ def assert_valid(model, message=nil)
95
+ errors = model.validate
96
+
97
+ clean_backtrace do
98
+ assert_equal({}, errors, (message || "Expected to be valid"))
99
+ end
100
+
101
+ errors
102
+ end
103
+
104
+ def assert_not_valid(model)
105
+ errors = model.validate
106
+
107
+ clean_backtrace do
108
+ assert_not_equal({}, errors, "Expected to not be valid")
109
+ end
110
+
111
+ errors
112
+ end
113
+
114
+ def assert_deprecation_warning(message=nil)
115
+ ActiveMerchant.expects(:deprecated).with(message ? message : anything)
116
+ yield
117
+ end
118
+
119
+ def refute(value, message = nil)
120
+ assert(!value, message)
121
+ end
122
+
123
+ def silence_deprecation_warnings
124
+ ActiveMerchant.stubs(:deprecated)
125
+ yield
126
+ end
127
+
128
+ def assert_no_deprecation_warning
129
+ ActiveMerchant.expects(:deprecated).never
130
+ yield
131
+ end
132
+
133
+ def assert_scrubbed(unexpected_value, transcript)
134
+ regexp = (Regexp === unexpected_value ? unexpected_value : Regexp.new(Regexp.quote(unexpected_value.to_s)))
135
+ refute_match regexp, transcript, "Expected the value to be scrubbed out of the transcript"
136
+ end
137
+
138
+ private
139
+ def clean_backtrace(&block)
140
+ yield
141
+ rescue AssertionClass => e
142
+ path = File.expand_path(__FILE__)
143
+ raise AssertionClass, e.message, e.backtrace.reject { |line| File.expand_path(line) =~ /#{path}/ }
144
+ end
145
+ end
146
+
147
+ module Fixtures
148
+ HOME_DIR = RUBY_PLATFORM =~ /mswin32/ ? ENV['HOMEPATH'] : ENV['HOME'] unless defined?(HOME_DIR)
149
+ LOCAL_CREDENTIALS = File.join(HOME_DIR.to_s, '.active_merchant/fixtures.yml') unless defined?(LOCAL_CREDENTIALS)
150
+ DEFAULT_CREDENTIALS = File.join(File.dirname(__FILE__), 'fixtures.yml') unless defined?(DEFAULT_CREDENTIALS)
151
+
152
+ private
153
+ def default_expiration_date
154
+ @default_expiration_date ||= Date.new((Time.now.year + 1), 9, 30)
155
+ end
156
+
157
+ def formatted_expiration_date(credit_card)
158
+ credit_card.expiry_date.expiration.strftime('%Y-%m')
159
+ end
160
+
161
+ def credit_card(number = '4242424242424242', options = {})
162
+ defaults = {
163
+ :number => number,
164
+ :month => default_expiration_date.month,
165
+ :year => default_expiration_date.year,
166
+ :first_name => 'Longbob',
167
+ :last_name => 'Longsen',
168
+ :verification_value => options[:verification_value] || '123',
169
+ :brand => 'visa'
170
+ }.update(options)
171
+
172
+ Billing::CreditCard.new(defaults)
173
+ end
174
+
175
+ def credit_card_with_track_data(number = '4242424242424242', options = {})
176
+ defaults = {
177
+ :track_data => '%B' + number + '^LONGSEN/L. ^15121200000000000000**123******?',
178
+ }.update(options)
179
+
180
+ Billing::CreditCard.new(defaults)
181
+ end
182
+
183
+ def network_tokenization_credit_card(number = '4242424242424242', options = {})
184
+ defaults = {
185
+ :number => number,
186
+ :month => default_expiration_date.month,
187
+ :year => default_expiration_date.year,
188
+ :first_name => 'Longbob',
189
+ :last_name => 'Longsen',
190
+ :verification_value => '123',
191
+ :brand => 'visa'
192
+ }.update(options)
193
+
194
+ Billing::NetworkTokenizationCreditCard.new(defaults)
195
+ end
196
+
197
+ def check(options = {})
198
+ defaults = {
199
+ :name => 'Jim Smith',
200
+ :bank_name => 'Bank of Elbonia',
201
+ :routing_number => '244183602',
202
+ :account_number => '15378535',
203
+ :account_holder_type => 'personal',
204
+ :account_type => 'checking',
205
+ :number => '1'
206
+ }.update(options)
207
+
208
+ Billing::Check.new(defaults)
209
+ end
210
+
211
+ def apple_pay_payment_token(options = {})
212
+ # apple_pay_json_raw should contain the JSON serialization of the object described here
213
+ # https://developer.apple.com/library/IOs//documentation/PassKit/Reference/PaymentTokenJSON/PaymentTokenJSON.htm
214
+ apple_pay_json_raw = '{"version":"EC_v1","data":"","signature":""}'
215
+ defaults = {
216
+ payment_data: ActiveSupport::JSON.decode(apple_pay_json_raw),
217
+ payment_instrument_name: "Visa 2424",
218
+ payment_network: "Visa",
219
+ transaction_identifier: "uniqueidentifier123"
220
+ }.update(options)
221
+
222
+ ActiveMerchant::Billing::ApplePayPaymentToken.new(defaults[:payment_data],
223
+ payment_instrument_name: defaults[:payment_instrument_name],
224
+ payment_network: defaults[:payment_network],
225
+ transaction_identifier: defaults[:transaction_identifier]
226
+ )
227
+ end
228
+
229
+ def address(options = {})
230
+ {
231
+ name: 'Jim Smith',
232
+ address1: '456 My Street',
233
+ address2: 'Apt 1',
234
+ company: 'Widgets Inc',
235
+ city: 'Ottawa',
236
+ state: 'ON',
237
+ zip: 'K1C2N6',
238
+ country: 'CA',
239
+ phone: '(555)555-5555',
240
+ fax: '(555)555-6666'
241
+ }.update(options)
242
+ end
243
+
244
+ def generate_unique_id
245
+ SecureRandom.hex(16)
246
+ end
247
+
248
+ def all_fixtures
249
+ @@fixtures ||= load_fixtures
250
+ end
251
+
252
+ def fixtures(key)
253
+ data = all_fixtures[key] || raise(StandardError, "No fixture data was found for '#{key}'")
254
+
255
+ data.dup
256
+ end
257
+
258
+ def load_fixtures
259
+ [DEFAULT_CREDENTIALS, LOCAL_CREDENTIALS].inject({}) do |credentials, file_name|
260
+ if File.exist?(file_name)
261
+ yaml_data = YAML.load(ERB.new(File.read(file_name)).result)
262
+ credentials.merge!(symbolize_keys(yaml_data))
263
+ end
264
+ credentials
265
+ end
266
+ end
267
+
268
+ def symbolize_keys(hash)
269
+ return unless hash.is_a?(Hash)
270
+
271
+ hash.symbolize_keys!
272
+ hash.each{|k,v| symbolize_keys(v)}
273
+ end
274
+ end
275
+ end
276
+
277
+ Test::Unit::TestCase.class_eval do
278
+ include ActiveMerchant::Billing
279
+ include ActiveMerchant::Assertions
280
+ include ActiveMerchant::Fixtures
281
+
282
+ def capture_transcript(gateway)
283
+ transcript = ''
284
+ gateway.class.wiredump_device = transcript
285
+
286
+ yield
287
+
288
+ transcript
289
+ end
290
+
291
+ def dump_transcript_and_fail(gateway, amount, credit_card, params)
292
+ transcript = capture_transcript(gateway) do
293
+ gateway.purchase(amount, credit_card, params)
294
+ end
295
+
296
+ File.open("transcript.log", "w") { |f| f.write(transcript) }
297
+ assert false, "A purchase transcript has been written to transcript.log for you to test scrubbing with."
298
+ end
299
+ end
300
+
301
+ module ActionViewHelperTestHelper
302
+ def self.included(base)
303
+ base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)
304
+ base.send(:include, ActionView::Helpers::FormHelper)
305
+ base.send(:include, ActionView::Helpers::FormTagHelper)
306
+ base.send(:include, ActionView::Helpers::UrlHelper)
307
+ base.send(:include, ActionView::Helpers::TagHelper)
308
+ base.send(:include, ActionView::Helpers::CaptureHelper)
309
+ base.send(:include, ActionView::Helpers::TextHelper)
310
+ base.send(:attr_accessor, :output_buffer)
311
+ end
312
+
313
+ def setup
314
+ @controller = Class.new do
315
+ attr_reader :url_for_options
316
+ def url_for(options, *parameters_for_method_reference)
317
+ @url_for_options = options
318
+ end
319
+ end
320
+ @controller = @controller.new
321
+ @output_buffer = ''
322
+ end
323
+
324
+ protected
325
+ def protect_against_forgery?
326
+ false
327
+ end
328
+ end
329
+
330
+
331
+ class MockResponse
332
+ attr_reader :code, :body, :message
333
+ attr_accessor :headers
334
+
335
+ def self.succeeded(body, message="")
336
+ MockResponse.new(200, body, message)
337
+ end
338
+
339
+ def self.failed(body, http_status_code=422, message="")
340
+ MockResponse.new(http_status_code, body, message)
341
+ end
342
+
343
+ def initialize(code, body, message="", headers={})
344
+ @code, @body, @message, @headers = code, body, message, headers
345
+ end
346
+
347
+ def [](header)
348
+ @headers[header]
349
+ end
350
+ end
@@ -0,0 +1,122 @@
1
+ require './test/test_helper'
2
+ require "./lib/active_merchant/billing/gateways/payline.rb"
3
+ require 'securerandom'
4
+
5
+ include ActiveMerchant::Billing
6
+ include PaylineWalletManagementAPI
7
+
8
+ class PaylineDirectApi < Test::Unit::TestCase
9
+ def setup
10
+ @gateway = PaylineGateway.new(fixtures(:payline))
11
+
12
+ valid_year = Date.today.year + 1 .year
13
+
14
+ @random_order_ref = SecureRandom.hex
15
+
16
+ @valid_card = { number: 4970100000325734, brand: "visa", month: 12, year: valid_year, verification_value: 123}
17
+ @invalid_card = { number: "not_a_valid_number", brand: "visa", month: 12, year: valid_year, verification_value: 123}
18
+ end
19
+
20
+ ##########################################
21
+ # Tests for do_authorization request
22
+ ##########################################
23
+ def test_successful_do_authorization
24
+ VCR.use_cassette("test_successful_do_authorization") do
25
+ response = @gateway.do_authorization(1000, @valid_card, order_ref: @random_order_ref,
26
+ bank_account_data: {countryCode: 'FR'}
27
+ )
28
+
29
+ assert_success response
30
+ assert_equal "Transaction approved", response.params['result']['long_message']
31
+ assert_equal "00000", response.params['result']['code']
32
+ end
33
+ end
34
+
35
+ def test_failed_do_authorization
36
+ VCR.use_cassette("test_failed_do_authorization") do
37
+ # Invalid card number
38
+ response = @gateway.do_authorization(1000, @invalid_card, {order_ref: @random_order_ref})
39
+
40
+ assert_failure response
41
+ assert_equal "Invalid field format : Card Number : Bad format, please refer to the user guide", response.params['result']['long_message']
42
+ assert_equal "02305", response.params['result']['code']
43
+
44
+ # Invalid amount
45
+ response = @gateway.do_authorization("this_is_not_a_number", @valid_card, {order_ref: @random_order_ref})
46
+
47
+ assert_failure response
48
+ assert_equal "Invalid field format : Payment Amount : Must be numeric(12), ex : 15078", response.params['result']['long_message']
49
+ assert_equal "02305", response.params['result']['code']
50
+
51
+ # No order ID
52
+ response = @gateway.do_authorization(1000, @valid_card)
53
+
54
+ assert_failure response
55
+ assert_equal "Invalid field format : Order Reference : Max length 50 characters", response.params['result']['long_message']
56
+ assert_equal "02305", response.params['result']['code']
57
+ end
58
+ end
59
+
60
+ ##########################################
61
+ # Tests for get_payment_record request
62
+ ##########################################
63
+ def test_successful_get_payment_record
64
+ VCR.use_cassette("test_successful_get_payment_record") do
65
+ payment_response = @gateway.do_recurrent_wallet_payment(1000, "JaneDoe_WebWallet", {recurring: {amount: 1000, billing_cycle: :yearly}, order_ref: @random_order_ref })
66
+ payment_record_id = payment_response.params['payment_record_id']
67
+
68
+ response = @gateway.get_payment_record(payment_record_id)
69
+
70
+ assert_success response
71
+ assert_equal "Operation Successfull", response.params['result']['long_message']
72
+ assert_equal "02500", response.params['result']['code']
73
+ end
74
+ end
75
+
76
+ def test_failed_get_payment_record
77
+ VCR.use_cassette("test_failed_get_payment_record") do
78
+ response = @gateway.get_payment_record("fake_payment_record_id")
79
+
80
+ assert_failure response
81
+ assert_equal "Invalid field format : PaymentRecordId : Only numeric", response.params['result']['long_message']
82
+ assert_equal "02305", response.params['result']['code']
83
+ end
84
+ end
85
+
86
+ ##########################################
87
+ # Tests for disable_payment_record request
88
+ ##########################################
89
+ def test_successful_disable_payment_record
90
+ VCR.use_cassette("test_successful_disable_payment_record") do
91
+ payment_response = @gateway.do_recurrent_wallet_payment(1000, "JaneDoe_WebWallet", {recurring: {amount: 1000, billing_cycle: :yearly}, order_ref: @random_order_ref })
92
+ payment_record_id = payment_response.params['payment_record_id']
93
+
94
+ response = @gateway.disable_payment_record(payment_record_id)
95
+
96
+ assert_success response
97
+ assert_equal "Operation Successfull", response.params['result']['long_message']
98
+ assert_equal "02500", response.params['result']['code']
99
+ end
100
+ end
101
+
102
+ def test_failed_disable_payment_record
103
+ VCR.use_cassette("test_failed_disable_payment_record") do
104
+ response = @gateway.get_payment_record("fake_payment_record_id")
105
+
106
+ assert_failure response
107
+ assert_equal "Invalid field format : PaymentRecordId : Only numeric", response.params['result']['long_message']
108
+ assert_equal "02305", response.params['result']['code']
109
+ end
110
+ end
111
+
112
+ private
113
+ def show_response(response)
114
+ puts "----------------"
115
+ puts response.params
116
+ end
117
+
118
+ def get_payment_record_id
119
+ resp = @gateway.do_recurrent_wallet_payment(1000, "JaneDoe_WebWallet", {recurring_amount: 1000, frequency: :yearly, order_ref: "test" })
120
+ payment_record_id = resp.params["payment_record_id"]
121
+ end
122
+ end