activemerchant 1.27.0 → 1.28.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,7 +7,23 @@ module ActiveMerchant #:nodoc:
7
7
  class PaypalExpressGateway < Gateway
8
8
  include PaypalCommonAPI
9
9
  include PaypalExpressCommon
10
-
10
+
11
+ NON_STANDARD_LOCALE_CODES = {
12
+ 'DK' => 'da_DK',
13
+ 'IL' => 'he_IL',
14
+ 'ID' => 'id_ID',
15
+ 'JP' => 'jp_JP',
16
+ 'NO' => 'no_NO',
17
+ 'BR' => 'pt_BR',
18
+ 'RU' => 'ru_RU',
19
+ 'SE' => 'sv_SE',
20
+ 'TH' => 'th_TH',
21
+ 'TR' => 'tr_TR',
22
+ 'CN' => 'zh_CN',
23
+ 'HK' => 'zh_HK',
24
+ 'TW' => 'zh_TW'
25
+ }
26
+
11
27
  self.test_redirect_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'
12
28
  self.supported_countries = ['US']
13
29
  self.homepage_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=xpt/merchant/ExpressCheckoutIntro-outside'
@@ -97,7 +113,7 @@ module ActiveMerchant #:nodoc:
97
113
  end
98
114
  xml.tag! 'n2:NoShipping', options[:no_shipping] ? '1' : '0'
99
115
  xml.tag! 'n2:AddressOverride', options[:address_override] ? '1' : '0'
100
- xml.tag! 'n2:LocaleCode', options[:locale] unless options[:locale].blank?
116
+ xml.tag! 'n2:LocaleCode', locale_code(options[:locale]) unless options[:locale].blank?
101
117
  xml.tag! 'n2:BrandName', options[:brand_name] unless options[:brand_name].blank?
102
118
  # Customization of the payment page
103
119
  xml.tag! 'n2:PageStyle', options[:page_style] unless options[:page_style].blank?
@@ -173,6 +189,10 @@ module ActiveMerchant #:nodoc:
173
189
  def with_money_default(money)
174
190
  amount(money).to_f.zero? ? 100 : money
175
191
  end
192
+
193
+ def locale_code(country_code)
194
+ NON_STANDARD_LOCALE_CODES[country_code] || country_code
195
+ end
176
196
  end
177
197
  end
178
198
  end
@@ -17,7 +17,7 @@ module ActiveMerchant #:nodoc:
17
17
  def request_signature_string
18
18
  [
19
19
  @fields[mappings[:account]],
20
- secret,
20
+ @secret,
21
21
  @fields[mappings[:order]],
22
22
  @fields[mappings[:amount]]
23
23
  ].join
@@ -6,8 +6,8 @@ module ActiveMerchant #:nodoc:
6
6
  include Common
7
7
 
8
8
  def initialize(order, account, options = {})
9
- @md5secret = options.delete(:secret)
10
9
  super
10
+ @secret = options[:credential2]
11
11
  end
12
12
 
13
13
  def form_fields
@@ -18,10 +18,6 @@ module ActiveMerchant #:nodoc:
18
18
  @fields
19
19
  end
20
20
 
21
- def secret
22
- @md5secret
23
- end
24
-
25
21
  mapping :account, 'EP_MerNo'
26
22
  mapping :amount, 'EP_Sum'
27
23
  mapping :order, 'EP_OrderNo'
@@ -5,6 +5,14 @@ module ActiveMerchant #:nodoc:
5
5
  class Notification < ActiveMerchant::Billing::Integrations::Notification
6
6
  include Common
7
7
 
8
+ def initialize(data, options)
9
+ if options[:credential2].nil?
10
+ raise ArgumentError, "You need to provide the md5 secret as the option :credential2 to verify that the notification originated from EasyPay"
11
+ end
12
+
13
+ super
14
+ end
15
+
8
16
  def self.recognizes?(params)
9
17
  params.has_key?('order_mer_code') && params.has_key?('sum')
10
18
  end
@@ -30,11 +38,11 @@ module ActiveMerchant #:nodoc:
30
38
  end
31
39
 
32
40
  def status
33
- 'success'
41
+ 'Completed'
34
42
  end
35
43
 
36
44
  def secret
37
- @options[:secret]
45
+ @options[:credential2]
38
46
  end
39
47
 
40
48
  def acknowledge
@@ -0,0 +1,36 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Paysbuy
5
+ autoload :Helper, File.dirname(__FILE__) + '/paysbuy/helper.rb'
6
+ autoload :Notification, File.dirname(__FILE__) + '/paysbuy/notification.rb'
7
+
8
+ mattr_accessor :test_url
9
+ self.test_url = 'https://demo.paysbuy.com/paynow.aspx'
10
+
11
+ mattr_accessor :production_url
12
+ self.production_url = 'https://www.paysbuy.com/paynow.aspx'
13
+
14
+ def self.service_url
15
+ mode = ActiveMerchant::Billing::Base.integration_mode
16
+ case mode
17
+ when :production
18
+ self.production_url
19
+ when :test
20
+ self.test_url
21
+ else
22
+ raise StandardError, "Integration mode set to an invalid value: #{mode}"
23
+ end
24
+ end
25
+
26
+ def self.helper(order, account, options = {})
27
+ Helper.new(order, account, options)
28
+ end
29
+
30
+ def self.notification(query_string, options = {})
31
+ Notification.new(query_string, options)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Paysbuy
5
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
6
+ mapping :account, 'biz'
7
+ mapping :amount, 'amt'
8
+ mapping :order, 'inv'
9
+ mapping :description, 'itm'
10
+ mapping :notify_url, 'postURL'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Paysbuy
5
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
6
+ SUCCESS = '00'
7
+ FAIL = '99'
8
+
9
+ def complete?
10
+ status == 'Completed'
11
+ end
12
+
13
+ def item_id
14
+ params['result'][2..-1]
15
+ end
16
+
17
+ def status
18
+ params['result'][0..1] == SUCCESS ? 'Completed' : 'Failed'
19
+ end
20
+
21
+ def acknowledge
22
+ true
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ # Documentation:
5
+ # http://wiki.webmoney.ru/projects/webmoney/wiki/Web_Merchant_Interface
6
+ module Webmoney
7
+ autoload :Helper, File.dirname(__FILE__) + '/webmoney/helper.rb'
8
+ autoload :Notification, File.dirname(__FILE__) + '/webmoney/notification.rb'
9
+ autoload :Return, File.dirname(__FILE__) + '/webmoney/return.rb'
10
+ autoload :Common, File.dirname(__FILE__) + '/webmoney/common.rb'
11
+
12
+ mattr_accessor :test_url
13
+ self.test_url = "https://merchant.webmoney.ru/lmi/payment.asp"
14
+
15
+ mattr_accessor :production_url
16
+ self.production_url = "https://merchant.webmoney.ru/lmi/payment.asp"
17
+
18
+ mattr_accessor :signature_parameter_name
19
+ self.signature_parameter_name = 'LMI_HASH'
20
+
21
+ def self.service_url
22
+ mode = ActiveMerchant::Billing::Base.integration_mode
23
+ case mode
24
+ when :production
25
+ self.production_url
26
+ when :test
27
+ self.test_url
28
+ else
29
+ raise StandardError, "Integration mode set to an invalid value: #{mode}"
30
+ end
31
+ end
32
+
33
+ def self.helper(order, account, options = {})
34
+ Helper.new(order, account, options)
35
+ end
36
+
37
+ def self.notification(query_string, options = {})
38
+ Notification.new(query_string, options)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Webmoney
5
+ module Common
6
+ def generate_signature_string
7
+ "#{params['LMI_PAYEE_PURSE']}#{params['LMI_PAYMENT_AMOUNT']}#{params['LMI_PAYMENT_NO']}#{params['LMI_MODE']}#{params['LMI_SYS_INVS_NO']}#{params['LMI_SYS_TRANS_NO']}#{params['LMI_SYS_TRANS_DATE']}#{secret}#{params['LMI_PAYER_PURSE']}#{params['LMI_PAYER_WM']}"
8
+ end
9
+
10
+ def generate_signature
11
+ Digest::MD5.hexdigest(generate_signature_string).upcase
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Webmoney
5
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
6
+ include Common
7
+
8
+ def initialize(order, account, options = {})
9
+ @webmoney_options = options.dup
10
+ options.delete(:description)
11
+ options.delete(:fail_url)
12
+ options.delete(:success_url)
13
+ options.delete(:result_url)
14
+ super
15
+ @webmoney_options.each do |key, value|
16
+ add_field mappings[key], value
17
+ end
18
+ end
19
+
20
+ def form_fields
21
+ @fields
22
+ end
23
+
24
+ def params
25
+ @fields
26
+ end
27
+
28
+ mapping :account, 'LMI_PAYEE_PURSE'
29
+ mapping :amount, 'LMI_PAYMENT_AMOUNT'
30
+ mapping :order, 'LMI_PAYMENT_NO'
31
+ mapping :description, 'LMI_PAYMENT_DESC'
32
+ mapping :fail_url, 'LMI_FAIL_URL'
33
+ mapping :success_url, 'LMI_SUCCESS_URL'
34
+ mapping :result_url, 'LMI_RESULT_URL'
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Webmoney
5
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
6
+ include Common
7
+
8
+ def recognizes?
9
+ (params.has_key?('LMI_PAYMENT_NO') && params.has_key?('LMI_PAYMENT_AMOUNT'))
10
+ end
11
+
12
+ def key_present?
13
+ params["LMI_HASH"].present?
14
+ end
15
+
16
+ def security_key
17
+ params["LMI_HASH"]
18
+ end
19
+
20
+ def secret
21
+ @options[:secret]
22
+ end
23
+
24
+ def acknowledge
25
+ (security_key == generate_signature)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveMerchant
2
- VERSION = "1.27.0"
2
+ VERSION = "1.28.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemerchant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.27.0
4
+ version: 1.28.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,39 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain:
12
- - gem-public_cert.pem
13
- date: 2012-08-10 00:00:00.000000000 Z
12
+ - !binary |-
13
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROakNDQWg2Z0F3SUJB
14
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJCTVJNd0VRWURWUVFEREFwamIy
15
+ UjUKWm1GMWMyVnlNUlV3RXdZS0NaSW1pWlB5TEdRQkdSWUZaMjFoYVd3eEV6
16
+ QVJCZ29Ka2lhSmsvSXNaQUVaRmdOagpiMjB3SGhjTk1EY3dNakl5TVRjeU1U
17
+ STNXaGNOTURnd01qSXlNVGN5TVRJM1dqQkJNUk13RVFZRFZRUUREQXBqCmIy
18
+ UjVabUYxYzJWeU1SVXdFd1lLQ1pJbWlaUHlMR1FCR1JZRloyMWhhV3d4RXpB
19
+ UkJnb0praWFKay9Jc1pBRVoKRmdOamIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFF
20
+ QkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNlQ0SXF0NWlXdkFsVQppWEk2TDhV
21
+ TzBVUlFoSUM2NVgvZ0o5aEwveDRsd1NsL2NrVm0vUi9iUHJKR21pZlQrWW9v
22
+ RnY4MjROM3kvVElYCjI1by9sWnRSajFUVVpKSzRPQ2IwYVZ6b3NRVnhCSFNl
23
+ NnJMbXhPOGNJdE5UTU9NOXduM3RoYUlURnJUYTFET1EKTzN3cUVqdlcyTDZW
24
+ TW96VmZLMU1makw5SUdneTByQ25sKzJnNEdoNGpERHBrTGZuTUc1Q1dJNmNU
25
+ Q2YzQzF5ZQp5dE9wV2dpMFhwT0V5OG5RV2NGbXQvS0NRL2tGZnpCbzRReHFK
26
+ aTU0YjgwODQyRXl2eldUOU9CN09ldy9DWFpHCkYyeUlIdGlZeG9uejZOMDl2
27
+ dlN6cTRDdkV1aXNvVUZMS1pua3RuZHhNRUJLd0pVM1hlU0hBYnVTN2l4NDBP
28
+ S08KV0t1STU0ZkhBZ01CQUFHak9UQTNNQWtHQTFVZEV3UUNNQUF3Q3dZRFZS
29
+ MFBCQVFEQWdTd01CMEdBMVVkRGdRVwpCQlI5UVFwZWZJM29EQ0F4aXFKVy8z
30
+ R2c2akk2cWpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQXMwbFgyNk8rCkhw
31
+ eU1wN1dMK1NnWnVNOGs3NkFqZk9IdUthamwyR0VuM1M4cFdZR3BzYTB4dTA3
32
+ SHRlaEpoS0xpYXZyZlVZZUUKcWxGdHlZTVV5T2g2LzFTMnZma0g2VnFqWDdt
33
+ V2pvaTdYS0hXLzk5ZmtNUzQwQjVTYk4reXBBVXN0KzZjNVI4NAp3MzkwbWp0
34
+ TEhwZERFNldRWWhTNmJGdkJONTN2SzZqRzNETHlDSmMwSzl1TVE3Z2RIV294
35
+ cTdSbkc5Mm5jUXBUClRocFJBK2ZreTVYdDJRNjNZSkRuSnBrWUF6NzlRSWFt
36
+ YTFlblNuZDRqc2xLelNsODlKUzJsdXEvemlvUGUvVXMKaGJ5YWxXUjErSHJo
37
+ Z1BvU1BxN25rK3MyRlFVQko5VVpGSzFsZ016aG8vNGZaZ3pKd2J1K2NPOFNO
38
+ dWFMUy9iagpoUGFTVHlWVTB5Q1Nudz09Ci0tLS0tRU5EIENFUlRJRklDQVRF
39
+ LS0tLS0K
40
+ date: 2012-08-24 00:00:00.000000000 Z
14
41
  dependencies:
15
42
  - !ruby/object:Gem::Dependency
16
43
  name: activesupport
17
- requirement: &70278479544420 !ruby/object:Gem::Requirement
44
+ requirement: &70160952962180 !ruby/object:Gem::Requirement
18
45
  none: false
19
46
  requirements:
20
47
  - - ! '>='
@@ -22,10 +49,10 @@ dependencies:
22
49
  version: 2.3.11
23
50
  type: :runtime
24
51
  prerelease: false
25
- version_requirements: *70278479544420
52
+ version_requirements: *70160952962180
26
53
  - !ruby/object:Gem::Dependency
27
54
  name: i18n
28
- requirement: &70278479593100 !ruby/object:Gem::Requirement
55
+ requirement: &70160952961760 !ruby/object:Gem::Requirement
29
56
  none: false
30
57
  requirements:
31
58
  - - ! '>='
@@ -33,10 +60,10 @@ dependencies:
33
60
  version: '0'
34
61
  type: :runtime
35
62
  prerelease: false
36
- version_requirements: *70278479593100
63
+ version_requirements: *70160952961760
37
64
  - !ruby/object:Gem::Dependency
38
65
  name: money
39
- requirement: &70278479592640 !ruby/object:Gem::Requirement
66
+ requirement: &70160952961300 !ruby/object:Gem::Requirement
40
67
  none: false
41
68
  requirements:
42
69
  - - ! '>='
@@ -44,10 +71,10 @@ dependencies:
44
71
  version: '0'
45
72
  type: :runtime
46
73
  prerelease: false
47
- version_requirements: *70278479592640
74
+ version_requirements: *70160952961300
48
75
  - !ruby/object:Gem::Dependency
49
76
  name: builder
50
- requirement: &70278479592140 !ruby/object:Gem::Requirement
77
+ requirement: &70160952960800 !ruby/object:Gem::Requirement
51
78
  none: false
52
79
  requirements:
53
80
  - - ! '>='
@@ -55,10 +82,10 @@ dependencies:
55
82
  version: 2.0.0
56
83
  type: :runtime
57
84
  prerelease: false
58
- version_requirements: *70278479592140
85
+ version_requirements: *70160952960800
59
86
  - !ruby/object:Gem::Dependency
60
87
  name: json
61
- requirement: &70278479591640 !ruby/object:Gem::Requirement
88
+ requirement: &70160952960300 !ruby/object:Gem::Requirement
62
89
  none: false
63
90
  requirements:
64
91
  - - ! '>='
@@ -66,10 +93,10 @@ dependencies:
66
93
  version: 1.5.1
67
94
  type: :runtime
68
95
  prerelease: false
69
- version_requirements: *70278479591640
96
+ version_requirements: *70160952960300
70
97
  - !ruby/object:Gem::Dependency
71
98
  name: active_utils
72
- requirement: &70278479591180 !ruby/object:Gem::Requirement
99
+ requirement: &70160952959840 !ruby/object:Gem::Requirement
73
100
  none: false
74
101
  requirements:
75
102
  - - ! '>='
@@ -77,10 +104,10 @@ dependencies:
77
104
  version: 1.0.2
78
105
  type: :runtime
79
106
  prerelease: false
80
- version_requirements: *70278479591180
107
+ version_requirements: *70160952959840
81
108
  - !ruby/object:Gem::Dependency
82
109
  name: nokogiri
83
- requirement: &70278479590800 !ruby/object:Gem::Requirement
110
+ requirement: &70160952959460 !ruby/object:Gem::Requirement
84
111
  none: false
85
112
  requirements:
86
113
  - - ! '>='
@@ -88,10 +115,10 @@ dependencies:
88
115
  version: '0'
89
116
  type: :runtime
90
117
  prerelease: false
91
- version_requirements: *70278479590800
118
+ version_requirements: *70160952959460
92
119
  - !ruby/object:Gem::Dependency
93
120
  name: rake
94
- requirement: &70278479590340 !ruby/object:Gem::Requirement
121
+ requirement: &70160952959000 !ruby/object:Gem::Requirement
95
122
  none: false
96
123
  requirements:
97
124
  - - ! '>='
@@ -99,10 +126,10 @@ dependencies:
99
126
  version: '0'
100
127
  type: :development
101
128
  prerelease: false
102
- version_requirements: *70278479590340
129
+ version_requirements: *70160952959000
103
130
  - !ruby/object:Gem::Dependency
104
131
  name: mocha
105
- requirement: &70278479589840 !ruby/object:Gem::Requirement
132
+ requirement: &70160952958500 !ruby/object:Gem::Requirement
106
133
  none: false
107
134
  requirements:
108
135
  - - ~>
@@ -110,10 +137,10 @@ dependencies:
110
137
  version: 0.11.3
111
138
  type: :development
112
139
  prerelease: false
113
- version_requirements: *70278479589840
140
+ version_requirements: *70160952958500
114
141
  - !ruby/object:Gem::Dependency
115
142
  name: rails
116
- requirement: &70278479589340 !ruby/object:Gem::Requirement
143
+ requirement: &70160952958000 !ruby/object:Gem::Requirement
117
144
  none: false
118
145
  requirements:
119
146
  - - ! '>='
@@ -121,10 +148,10 @@ dependencies:
121
148
  version: 2.3.11
122
149
  type: :development
123
150
  prerelease: false
124
- version_requirements: *70278479589340
151
+ version_requirements: *70160952958000
125
152
  - !ruby/object:Gem::Dependency
126
153
  name: rubigen
127
- requirement: &70278479588960 !ruby/object:Gem::Requirement
154
+ requirement: &70160952957620 !ruby/object:Gem::Requirement
128
155
  none: false
129
156
  requirements:
130
157
  - - ! '>='
@@ -132,7 +159,7 @@ dependencies:
132
159
  version: '0'
133
160
  type: :development
134
161
  prerelease: false
135
- version_requirements: *70278479588960
162
+ version_requirements: *70160952957620
136
163
  description: Active Merchant is a simple payment abstraction library used in and sponsored
137
164
  by Shopify. It is written by Tobias Luetke, Cody Fauser, and contributors. The aim
138
165
  of the project is to feel natural to Ruby users and to abstract as many parts as
@@ -160,6 +187,7 @@ files:
160
187
  - lib/active_merchant/billing/gateways/authorize_net.rb
161
188
  - lib/active_merchant/billing/gateways/authorize_net_cim.rb
162
189
  - lib/active_merchant/billing/gateways/balanced.rb
190
+ - lib/active_merchant/billing/gateways/banwire.rb
163
191
  - lib/active_merchant/billing/gateways/barclays_epdq.rb
164
192
  - lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb
165
193
  - lib/active_merchant/billing/gateways/beanstream.rb
@@ -345,6 +373,9 @@ files:
345
373
  - lib/active_merchant/billing/integrations/paypal.rb
346
374
  - lib/active_merchant/billing/integrations/paypal_payments_advanced/helper.rb
347
375
  - lib/active_merchant/billing/integrations/paypal_payments_advanced.rb
376
+ - lib/active_merchant/billing/integrations/paysbuy/helper.rb
377
+ - lib/active_merchant/billing/integrations/paysbuy/notification.rb
378
+ - lib/active_merchant/billing/integrations/paysbuy.rb
348
379
  - lib/active_merchant/billing/integrations/pxpay/helper.rb
349
380
  - lib/active_merchant/billing/integrations/pxpay/notification.rb
350
381
  - lib/active_merchant/billing/integrations/pxpay/return.rb
@@ -379,6 +410,10 @@ files:
379
410
  - lib/active_merchant/billing/integrations/web_pay/helper.rb
380
411
  - lib/active_merchant/billing/integrations/web_pay/notification.rb
381
412
  - lib/active_merchant/billing/integrations/web_pay.rb
413
+ - lib/active_merchant/billing/integrations/webmoney/common.rb
414
+ - lib/active_merchant/billing/integrations/webmoney/helper.rb
415
+ - lib/active_merchant/billing/integrations/webmoney/notification.rb
416
+ - lib/active_merchant/billing/integrations/webmoney.rb
382
417
  - lib/active_merchant/billing/integrations/world_pay/helper.rb
383
418
  - lib/active_merchant/billing/integrations/world_pay/notification.rb
384
419
  - lib/active_merchant/billing/integrations/world_pay.rb