amazon_pay 2.3.2 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/amazon_pay/client.rb +62 -8
- data/lib/amazon_pay/client_helper.rb +12 -13
- data/lib/amazon_pay/ipn_handler.rb +18 -35
- data/lib/amazon_pay/log_initializer.rb +2 -0
- data/lib/amazon_pay/login.rb +12 -16
- data/lib/amazon_pay/request.rb +6 -13
- data/lib/amazon_pay/response.rb +26 -33
- data/lib/amazon_pay/sanitize.rb +11 -8
- data/lib/amazon_pay/version.rb +3 -3
- metadata +4 -5
- data/lib/CHANGES.txt +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: fe42cd1c1161cf3ad88ccba66c243e7b816729672ab136c3a99e33ff1caceb53
|
4
|
+
data.tar.gz: 0e628bdcc508d9705e869cc30c4ed18fdd45cb32991459f181823cbb88dbf735
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa3bebaa9bf5dcdceef3eebdf283ff48bbf335030e02db6d9f51241108a9f412eebadd18e07776cb7660f04ac31e13fd22fb14e17750cc7f2ddf4df81df133c7
|
7
|
+
data.tar.gz: 3adbe8158ad59d28a286c13e80900137ea8e86e10e9b94dd39967c156cc9db262f67f357e27e61c668419d0b2e89d7d568763c9a9cf140118c6e407142e91a03
|
data/lib/amazon_pay/client.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength, Metrics/LineLength, Metrics/AbcSize, Metrics/ClassLength, Metrics/ParameterLists, Style/AccessorMethodName
|
2
|
+
|
1
3
|
require 'time'
|
2
4
|
require 'logger'
|
3
5
|
require 'stringio'
|
@@ -26,7 +28,6 @@ module AmazonPay
|
|
26
28
|
)
|
27
29
|
|
28
30
|
attr_accessor(
|
29
|
-
:sandbox,
|
30
31
|
:proxy_addr,
|
31
32
|
:proxy_port,
|
32
33
|
:proxy_user,
|
@@ -126,6 +127,7 @@ module AmazonPay
|
|
126
127
|
# @optional seller_order_id [String]
|
127
128
|
# @optional store_name [String]
|
128
129
|
# @optional custom_information [String]
|
130
|
+
# @optional supplementary_data [String]
|
129
131
|
# @optional merchant_id [String]
|
130
132
|
# @optional mws_auth_token [String]
|
131
133
|
def create_order_reference_for_id(
|
@@ -140,6 +142,7 @@ module AmazonPay
|
|
140
142
|
seller_order_id: nil,
|
141
143
|
store_name: nil,
|
142
144
|
custom_information: nil,
|
145
|
+
supplementary_data: nil,
|
143
146
|
merchant_id: @merchant_id,
|
144
147
|
mws_auth_token: nil
|
145
148
|
)
|
@@ -161,6 +164,7 @@ module AmazonPay
|
|
161
164
|
'OrderReferenceAttributes.SellerOrderAttributes.SellerOrderId' => seller_order_id,
|
162
165
|
'OrderReferenceAttributes.SellerOrderAttributes.StoreName' => store_name,
|
163
166
|
'OrderReferenceAttributes.SellerOrderAttributes.CustomInformation' => custom_information,
|
167
|
+
'OrderReferenceAttributes.SellerOrderAttributes.SupplementaryData' => supplementary_data,
|
164
168
|
'MWSAuthToken' => mws_auth_token
|
165
169
|
}
|
166
170
|
|
@@ -174,6 +178,7 @@ module AmazonPay
|
|
174
178
|
# @optional access_token [String]
|
175
179
|
# @optional merchant_id [String]
|
176
180
|
# @optional mws_auth_token [String]
|
181
|
+
|
177
182
|
def get_billing_agreement_details(
|
178
183
|
amazon_billing_agreement_id,
|
179
184
|
address_consent_token: nil,
|
@@ -191,7 +196,10 @@ module AmazonPay
|
|
191
196
|
optional = {
|
192
197
|
# Preseving address_consent_token for backwards compatibility
|
193
198
|
# AccessToken returns all data in AddressConsentToken plus new data
|
194
|
-
|
199
|
+
# You cannot pass both address_consent_token and access_token in
|
200
|
+
# the same call or you will encounter a 400/"AmbiguousToken" error
|
201
|
+
'AccessToken' => access_token,
|
202
|
+
'AddressConsentToken' => address_consent_token,
|
195
203
|
'MWSAuthToken' => mws_auth_token
|
196
204
|
}
|
197
205
|
|
@@ -209,6 +217,10 @@ module AmazonPay
|
|
209
217
|
# @optional store_name [String]
|
210
218
|
# @optional merchant_id [String]
|
211
219
|
# @optional mws_auth_token [String]
|
220
|
+
# @optional billing_agreement_type [String] - one of CustomerInitiatedTransaction or MerchantInitiatedTransaction
|
221
|
+
# @optional subscription_amount [String]
|
222
|
+
# @optional subscription_currency_code [String]
|
223
|
+
|
212
224
|
def set_billing_agreement_details(
|
213
225
|
amazon_billing_agreement_id,
|
214
226
|
platform_id: nil,
|
@@ -217,6 +229,9 @@ module AmazonPay
|
|
217
229
|
custom_information: nil,
|
218
230
|
store_name: nil,
|
219
231
|
merchant_id: @merchant_id,
|
232
|
+
billing_agreement_type: nil,
|
233
|
+
subscription_amount: nil,
|
234
|
+
subscription_currency_code: @currency_code,
|
220
235
|
mws_auth_token: nil
|
221
236
|
)
|
222
237
|
|
@@ -232,9 +247,14 @@ module AmazonPay
|
|
232
247
|
'BillingAgreementAttributes.SellerBillingAgreementAttributes.SellerBillingAgreementId' => seller_billing_agreement_id,
|
233
248
|
'BillingAgreementAttributes.SellerBillingAgreementAttributes.CustomInformation' => custom_information,
|
234
249
|
'BillingAgreementAttributes.SellerBillingAgreementAttributes.StoreName' => store_name,
|
250
|
+
'BillingAgreementAttributes.BillingAgreementType' => billing_agreement_type,
|
251
|
+
'BillingAgreementAttributes.SubscriptionAmount.Amount' => subscription_amount,
|
252
|
+
'BillingAgreementAttributes.SubscriptionAmount.CurrencyCode' => subscription_currency_code,
|
235
253
|
'MWSAuthToken' => mws_auth_token
|
236
254
|
}
|
237
255
|
|
256
|
+
optional['BillingAgreementAttributes.SubscriptionAmount.CurrencyCode'] = nil if subscription_amount.nil?
|
257
|
+
|
238
258
|
operation(parameters, optional)
|
239
259
|
end
|
240
260
|
|
@@ -244,9 +264,13 @@ module AmazonPay
|
|
244
264
|
# @param amazon_billing_agreement_id [String]
|
245
265
|
# @optional merchant_id [String]
|
246
266
|
# @optional mws_auth_token [String]
|
267
|
+
# @optional success_url [String]
|
268
|
+
# @optional failure_url [String]
|
247
269
|
def confirm_billing_agreement(
|
248
270
|
amazon_billing_agreement_id,
|
249
271
|
merchant_id: @merchant_id,
|
272
|
+
success_url: nil,
|
273
|
+
failure_url: nil,
|
250
274
|
mws_auth_token: nil
|
251
275
|
)
|
252
276
|
|
@@ -257,6 +281,8 @@ module AmazonPay
|
|
257
281
|
}
|
258
282
|
|
259
283
|
optional = {
|
284
|
+
'SuccessUrl' => success_url,
|
285
|
+
'FailureUrl' => failure_url,
|
260
286
|
'MWSAuthToken' => mws_auth_token
|
261
287
|
}
|
262
288
|
|
@@ -305,6 +331,7 @@ module AmazonPay
|
|
305
331
|
# @optional seller_order_id [String]
|
306
332
|
# @optional store_name [String]
|
307
333
|
# @optional inherit_shipping_address [Boolean]
|
334
|
+
# @optional supplementary_data [String]
|
308
335
|
# @optional merchant_id [String]
|
309
336
|
# @optional mws_auth_token [String]
|
310
337
|
def authorize_on_billing_agreement(
|
@@ -322,6 +349,7 @@ module AmazonPay
|
|
322
349
|
seller_order_id: nil,
|
323
350
|
store_name: nil,
|
324
351
|
inherit_shipping_address: nil,
|
352
|
+
supplementary_data: nil,
|
325
353
|
merchant_id: @merchant_id,
|
326
354
|
mws_auth_token: nil
|
327
355
|
)
|
@@ -345,6 +373,7 @@ module AmazonPay
|
|
345
373
|
'SellerOrderAttributes.CustomInformation' => custom_information,
|
346
374
|
'SellerOrderAttributes.SellerOrderId' => seller_order_id,
|
347
375
|
'SellerOrderAttributes.StoreName' => store_name,
|
376
|
+
'SellerOrderAttributes.SupplementaryData' => supplementary_data,
|
348
377
|
'InheritShippingAddress' => inherit_shipping_address,
|
349
378
|
'MWSAuthToken' => mws_auth_token
|
350
379
|
}
|
@@ -463,7 +492,7 @@ module AmazonPay
|
|
463
492
|
optional = {
|
464
493
|
'MWSAuthToken' => mws_auth_token
|
465
494
|
}
|
466
|
-
|
495
|
+
|
467
496
|
operation(parameters, optional)
|
468
497
|
end
|
469
498
|
|
@@ -511,6 +540,7 @@ module AmazonPay
|
|
511
540
|
# @optional store_name [String]
|
512
541
|
# @optional order_item_categories Array[String]
|
513
542
|
# @optional custom_information [String]
|
543
|
+
# @optional supplementary_data [String]
|
514
544
|
# @optional merchant_id [String]
|
515
545
|
# @optional mws_auth_token [String]
|
516
546
|
def set_order_reference_details(
|
@@ -524,6 +554,7 @@ module AmazonPay
|
|
524
554
|
store_name: nil,
|
525
555
|
order_item_categories: nil,
|
526
556
|
custom_information: nil,
|
557
|
+
supplementary_data: nil,
|
527
558
|
merchant_id: @merchant_id,
|
528
559
|
mws_auth_token: nil
|
529
560
|
)
|
@@ -543,6 +574,7 @@ module AmazonPay
|
|
543
574
|
'OrderReferenceAttributes.SellerOrderAttributes.SellerOrderId' => seller_order_id,
|
544
575
|
'OrderReferenceAttributes.SellerOrderAttributes.StoreName' => store_name,
|
545
576
|
'OrderReferenceAttributes.SellerOrderAttributes.CustomInformation' => custom_information,
|
577
|
+
'OrderReferenceAttributes.SellerOrderAttributes.SupplementaryData' => supplementary_data,
|
546
578
|
'MWSAuthToken' => mws_auth_token
|
547
579
|
}
|
548
580
|
|
@@ -571,12 +603,13 @@ module AmazonPay
|
|
571
603
|
# @optional store_name [String]
|
572
604
|
# @optional order_item_categories Array[String]
|
573
605
|
# @optional custom_information [String]
|
606
|
+
# @optional supplementary_data [String]
|
574
607
|
# @optional merchant_id [String]
|
575
608
|
# @optional mws_auth_token [String]
|
576
609
|
def set_order_attributes(
|
577
610
|
amazon_order_reference_id,
|
578
611
|
amount: nil,
|
579
|
-
currency_code:
|
612
|
+
currency_code: @currency_code,
|
580
613
|
platform_id: nil,
|
581
614
|
seller_note: nil,
|
582
615
|
seller_order_id: nil,
|
@@ -586,6 +619,7 @@ module AmazonPay
|
|
586
619
|
store_name: nil,
|
587
620
|
order_item_categories: nil,
|
588
621
|
custom_information: nil,
|
622
|
+
supplementary_data: nil,
|
589
623
|
merchant_id: @merchant_id,
|
590
624
|
mws_auth_token: nil
|
591
625
|
)
|
@@ -607,9 +641,12 @@ module AmazonPay
|
|
607
641
|
'OrderAttributes.RequestPaymentAuthorization' => request_payment_authorization,
|
608
642
|
'OrderAttributes.SellerOrderAttributes.StoreName' => store_name,
|
609
643
|
'OrderAttributes.SellerOrderAttributes.CustomInformation' => custom_information,
|
644
|
+
'OrderAttributes.SellerOrderAttributes.SupplementaryData' => supplementary_data,
|
610
645
|
'MWSAuthToken' => mws_auth_token
|
611
646
|
}
|
612
647
|
|
648
|
+
optional['OrderAttributes.OrderTotal.CurrencyCode'] = nil if amount.nil?
|
649
|
+
|
613
650
|
if order_item_categories
|
614
651
|
optional.merge!(
|
615
652
|
get_categories_list(
|
@@ -626,12 +663,22 @@ module AmazonPay
|
|
626
663
|
# information has been set on the order reference
|
627
664
|
# @see https://pay.amazon.com/documentation/apireference/201751630#201751980
|
628
665
|
# @param amazon_order_reference_id [String]
|
666
|
+
# @optional success_url [String]
|
667
|
+
# @optional failure_url [String]
|
668
|
+
# @optional authorization_amount [String]
|
669
|
+
# @optional currency_code [String]
|
629
670
|
# @optional merchant_id [String]
|
630
671
|
# @optional mws_auth_token [String]
|
672
|
+
# @optional expect_immediate_authorization [Boolean]
|
631
673
|
def confirm_order_reference(
|
632
674
|
amazon_order_reference_id,
|
675
|
+
success_url: nil,
|
676
|
+
failure_url: nil,
|
677
|
+
authorization_amount: nil,
|
678
|
+
currency_code: @currency_code,
|
633
679
|
merchant_id: @merchant_id,
|
634
|
-
mws_auth_token: nil
|
680
|
+
mws_auth_token: nil,
|
681
|
+
expect_immediate_authorization: nil
|
635
682
|
)
|
636
683
|
|
637
684
|
parameters = {
|
@@ -641,9 +688,16 @@ module AmazonPay
|
|
641
688
|
}
|
642
689
|
|
643
690
|
optional = {
|
644
|
-
'
|
691
|
+
'SuccessUrl' => success_url,
|
692
|
+
'FailureUrl' => failure_url,
|
693
|
+
'AuthorizationAmount.Amount' => authorization_amount,
|
694
|
+
'AuthorizationAmount.CurrencyCode' => currency_code,
|
695
|
+
'MWSAuthToken' => mws_auth_token,
|
696
|
+
'ExpectImmediateAuthorization' => expect_immediate_authorization
|
645
697
|
}
|
646
698
|
|
699
|
+
optional['AuthorizationAmount.CurrencyCode'] = nil if authorization_amount.nil?
|
700
|
+
|
647
701
|
operation(parameters, optional)
|
648
702
|
end
|
649
703
|
|
@@ -1076,8 +1130,8 @@ module AmazonPay
|
|
1076
1130
|
list = {}
|
1077
1131
|
|
1078
1132
|
categories.each_with_index do |val, index|
|
1079
|
-
|
1080
|
-
end
|
1133
|
+
list.merge!("#{attribute_key}.SellerOrderAttributes.OrderItemCategories.OrderItemCategory.#{index + 1}" => val)
|
1134
|
+
end
|
1081
1135
|
|
1082
1136
|
list
|
1083
1137
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength, Metrics/LineLength, Metrics/ClassLength, Metrics/ParameterLists
|
2
|
+
|
1
3
|
module AmazonPay
|
2
4
|
# This will extend the client class to add additional
|
3
5
|
# helper methods that combine core API calls.
|
@@ -31,8 +33,8 @@ module AmazonPay
|
|
31
33
|
mws_auth_token: nil
|
32
34
|
)
|
33
35
|
|
34
|
-
if
|
35
|
-
|
36
|
+
if order_reference?(amazon_reference_id)
|
37
|
+
call_order_reference_api(
|
36
38
|
amazon_reference_id,
|
37
39
|
authorization_reference_id,
|
38
40
|
charge_amount,
|
@@ -46,11 +48,8 @@ module AmazonPay
|
|
46
48
|
merchant_id,
|
47
49
|
mws_auth_token
|
48
50
|
)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
if is_billing_agreement?(amazon_reference_id)
|
53
|
-
response = call_billing_agreement_api(
|
51
|
+
elsif billing_agreement?(amazon_reference_id)
|
52
|
+
call_billing_agreement_api(
|
54
53
|
amazon_reference_id,
|
55
54
|
authorization_reference_id,
|
56
55
|
charge_amount,
|
@@ -64,7 +63,6 @@ module AmazonPay
|
|
64
63
|
merchant_id,
|
65
64
|
mws_auth_token
|
66
65
|
)
|
67
|
-
return response
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
@@ -94,10 +92,11 @@ module AmazonPay
|
|
94
92
|
mws_auth_token: nil
|
95
93
|
)
|
96
94
|
|
97
|
-
set_order_attributes(
|
95
|
+
set_order_attributes(
|
98
96
|
# amount:(This value can't be modified after order is confirmed so it isn't passed to set_order_attributes)
|
99
97
|
# currency_code:(This value can't be modified after order is confirmed so it isn't passed to set_order_attributes)
|
100
98
|
# platform_id:(This value can't be modified after order is confirmed so it isn't passed to set_order_attributes)
|
99
|
+
amazon_order_reference_id,
|
101
100
|
seller_note: seller_note,
|
102
101
|
seller_order_id: seller_order_id,
|
103
102
|
payment_service_provider_id: payment_service_provider_id,
|
@@ -161,7 +160,7 @@ module AmazonPay
|
|
161
160
|
)
|
162
161
|
end
|
163
162
|
end
|
164
|
-
|
163
|
+
response
|
165
164
|
end
|
166
165
|
|
167
166
|
def call_billing_agreement_api(
|
@@ -223,14 +222,14 @@ module AmazonPay
|
|
223
222
|
merchant_id: merchant_id,
|
224
223
|
mws_auth_token: mws_auth_token
|
225
224
|
)
|
226
|
-
|
225
|
+
response
|
227
226
|
end
|
228
227
|
|
229
|
-
def
|
228
|
+
def order_reference?(amazon_reference_id)
|
230
229
|
amazon_reference_id.start_with?('S', 'P')
|
231
230
|
end
|
232
231
|
|
233
|
-
def
|
232
|
+
def billing_agreement?(amazon_reference_id)
|
234
233
|
amazon_reference_id.start_with?('C', 'B')
|
235
234
|
end
|
236
235
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength, Metrics/ClassLength, Metrics/LineLength, Metrics/ParameterLists, Metrics/AbcSize, Metrics/CyclomaticComplexity, Rails/Blank
|
2
|
+
|
1
3
|
require 'base64'
|
2
4
|
require 'json'
|
3
5
|
require 'net/http'
|
@@ -18,6 +20,10 @@ module AmazonPay
|
|
18
20
|
# there are many helper methods in place to extract information received
|
19
21
|
# from the ipn notification.
|
20
22
|
class IpnHandler
|
23
|
+
MSG_HEADER = 'Error - Header does not contain x-amz-sns-message-type header'.freeze
|
24
|
+
MSG_CERTIFICATE = 'Error - Unable to verify certificate subject issued by Amazon'.freeze
|
25
|
+
MSG_KEY = 'Error - Unable to verify public key with signature and signed string'.freeze
|
26
|
+
|
21
27
|
SIGNABLE_KEYS = %w[
|
22
28
|
Message
|
23
29
|
MessageId
|
@@ -66,13 +72,7 @@ module AmazonPay
|
|
66
72
|
@proxy_pass = proxy_pass
|
67
73
|
|
68
74
|
@log_enabled = log_enabled
|
69
|
-
if @log_enabled
|
70
|
-
log_set = AmazonPay::LogInitializer.new(
|
71
|
-
log_file_name,
|
72
|
-
log_level
|
73
|
-
)
|
74
|
-
@logger = log_set.create_logger
|
75
|
-
end
|
75
|
+
@logger = AmazonPay::LogInitializer.new(log_file_name, log_level).create_logger if @log_enabled
|
76
76
|
end
|
77
77
|
|
78
78
|
# This method will authenticate the ipn message sent from Amazon.
|
@@ -81,8 +81,8 @@ module AmazonPay
|
|
81
81
|
def authentic?
|
82
82
|
decoded_from_base64 = Base64.decode64(signature)
|
83
83
|
validate_header
|
84
|
-
validate_subject(
|
85
|
-
public_key =
|
84
|
+
validate_subject(certificate.subject)
|
85
|
+
public_key = public_key_from(certificate)
|
86
86
|
verify_public_key(public_key, decoded_from_base64, canonical_string)
|
87
87
|
|
88
88
|
return true
|
@@ -156,12 +156,12 @@ module AmazonPay
|
|
156
156
|
|
157
157
|
protected
|
158
158
|
|
159
|
-
def
|
159
|
+
def certificate
|
160
160
|
cert_pem = download_cert(signing_cert_url)
|
161
161
|
OpenSSL::X509::Certificate.new(cert_pem)
|
162
162
|
end
|
163
163
|
|
164
|
-
def
|
164
|
+
def public_key_from(certificate)
|
165
165
|
OpenSSL::PKey::RSA.new(certificate.public_key)
|
166
166
|
end
|
167
167
|
|
@@ -178,11 +178,9 @@ module AmazonPay
|
|
178
178
|
|
179
179
|
def download_cert(url)
|
180
180
|
uri = URI.parse(url)
|
181
|
-
unless
|
182
|
-
|
183
|
-
|
184
|
-
File.extname(uri.path) == '.pem'
|
185
|
-
then
|
181
|
+
unless uri.scheme == 'https' &&
|
182
|
+
uri.host.match(/^sns\.[a-zA-Z0-9\-]{3,}\.amazonaws\.com(\.cn)?$/) &&
|
183
|
+
File.extname(uri.path) == '.pem'
|
186
184
|
msg = "Error - certificate is not hosted at AWS URL (https): #{url}"
|
187
185
|
raise IpnWasNotAuthenticError, msg
|
188
186
|
end
|
@@ -191,7 +189,7 @@ module AmazonPay
|
|
191
189
|
resp = https_get(url)
|
192
190
|
if @log_enabled
|
193
191
|
data = AmazonPay::Sanitize.new(resp.body)
|
194
|
-
@logger.debug(data.sanitize_response_data)
|
192
|
+
@logger.debug(data.sanitize_response_data)
|
195
193
|
end
|
196
194
|
resp.body
|
197
195
|
rescue StandardError => error
|
@@ -213,31 +211,16 @@ module AmazonPay
|
|
213
211
|
end
|
214
212
|
|
215
213
|
def validate_header
|
216
|
-
unless
|
217
|
-
@headers['x-amz-sns-message-type'] == 'Notification'
|
218
|
-
then
|
219
|
-
msg = 'Error - Header does not contain x-amz-sns-message-type header'
|
220
|
-
raise IpnWasNotAuthenticError, msg
|
221
|
-
end
|
214
|
+
raise IpnWasNotAuthenticError, MSG_HEADER unless @headers['x-amz-sns-message-type'] == 'Notification'
|
222
215
|
end
|
223
216
|
|
224
217
|
def validate_subject(certificate_subject)
|
225
218
|
subject = certificate_subject.to_a
|
226
|
-
unless
|
227
|
-
subject.rassoc(COMMON_NAME)
|
228
|
-
then
|
229
|
-
msg = 'Error - Unable to verify certificate subject issued by Amazon'
|
230
|
-
raise IpnWasNotAuthenticError, msg
|
231
|
-
end
|
219
|
+
raise IpnWasNotAuthenticError, MSG_CERTIFICATE unless subject.rassoc(COMMON_NAME)
|
232
220
|
end
|
233
221
|
|
234
222
|
def verify_public_key(public_key, decoded_signature, signed_string)
|
235
|
-
unless
|
236
|
-
public_key.verify(OpenSSL::Digest::SHA1.new, decoded_signature, signed_string)
|
237
|
-
then
|
238
|
-
msg = 'Error - Unable to verify public key with signature and signed string'
|
239
|
-
raise IpnWasNotAuthenticError, msg
|
240
|
-
end
|
223
|
+
raise IpnWasNotAuthenticError, MSG_KEY unless public_key.verify(OpenSSL::Digest::SHA1.new, decoded_signature, signed_string)
|
241
224
|
end
|
242
225
|
end
|
243
226
|
end
|
data/lib/amazon_pay/login.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength, Metrics/LineLength, Metrics/AbcSize
|
2
|
+
|
1
3
|
require 'uri'
|
2
4
|
require 'net/http'
|
3
5
|
require 'net/https'
|
@@ -5,14 +7,12 @@ require 'json'
|
|
5
7
|
require 'openssl'
|
6
8
|
|
7
9
|
module AmazonPay
|
8
|
-
|
9
10
|
# AmazonPay API
|
10
11
|
#
|
11
12
|
# This class allows you to obtain user profile
|
12
13
|
# information once a user has logged into your
|
13
14
|
# application using their Amazon credentials.
|
14
15
|
class Login
|
15
|
-
|
16
16
|
attr_reader(:region)
|
17
17
|
|
18
18
|
attr_accessor(:client_id, :sandbox)
|
@@ -25,7 +25,7 @@ module AmazonPay
|
|
25
25
|
@region = region
|
26
26
|
@endpoint = region_hash[@region]
|
27
27
|
@sandbox = sandbox
|
28
|
-
@sandbox_str = @sandbox ?
|
28
|
+
@sandbox_str = @sandbox ? 'api.sandbox' : 'api'
|
29
29
|
end
|
30
30
|
|
31
31
|
# This method will validate the access token and
|
@@ -42,34 +42,30 @@ module AmazonPay
|
|
42
42
|
response = http.request(req)
|
43
43
|
decode = JSON.parse(response.body)
|
44
44
|
|
45
|
-
if decode['aud'] != @client_id
|
46
|
-
raise "Invalid Access Token"
|
47
|
-
end
|
45
|
+
raise 'Invalid Access Token' if decode['aud'] != @client_id
|
48
46
|
|
49
47
|
uri = URI.parse("https://#{@sandbox_str}.#{@endpoint}/user/profile")
|
50
48
|
req = Net::HTTP::Get.new(uri.request_uri)
|
51
|
-
req['Authorization'] =
|
49
|
+
req['Authorization'] = 'bearer ' + decoded_access_token
|
52
50
|
http = Net::HTTP.new(uri.host, uri.port)
|
53
51
|
http.use_ssl = true
|
54
52
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
55
53
|
response = http.request(req)
|
56
54
|
decoded_login_profile = JSON.parse(response.body)
|
57
|
-
|
55
|
+
decoded_login_profile
|
58
56
|
end
|
59
57
|
|
60
58
|
private
|
61
59
|
|
62
60
|
def region_hash
|
63
61
|
{
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
62
|
+
jp: 'amazon.co.jp',
|
63
|
+
uk: 'amazon.co.uk',
|
64
|
+
de: 'amazon.de',
|
65
|
+
eu: 'amazon.co.uk',
|
66
|
+
us: 'amazon.com',
|
67
|
+
na: 'amazon.com'
|
70
68
|
}
|
71
69
|
end
|
72
|
-
|
73
70
|
end
|
74
|
-
|
75
71
|
end
|
data/lib/amazon_pay/request.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength, Metrics/LineLength, Metrics/ParameterLists, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
2
|
+
|
1
3
|
require 'uri'
|
2
4
|
require 'net/http'
|
3
5
|
require 'net/https'
|
@@ -46,13 +48,7 @@ module AmazonPay
|
|
46
48
|
@application_name = application_name
|
47
49
|
@application_version = application_version
|
48
50
|
|
49
|
-
if @log_enabled
|
50
|
-
log_set = AmazonPay::LogInitializer.new(
|
51
|
-
log_file_name,
|
52
|
-
log_level
|
53
|
-
)
|
54
|
-
@logger = log_set.create_logger
|
55
|
-
end
|
51
|
+
@logger = AmazonPay::LogInitializer.new(log_file_name, log_level).create_logger if @log_enabled
|
56
52
|
end
|
57
53
|
|
58
54
|
# This method sends the post request.
|
@@ -68,7 +64,7 @@ module AmazonPay
|
|
68
64
|
# the post url.
|
69
65
|
def build_post_url
|
70
66
|
@optional.map { |k, v| @parameters[k] = v unless v.nil? }
|
71
|
-
@parameters['Timestamp'] = Time.now.utc.iso8601 unless @parameters.
|
67
|
+
@parameters['Timestamp'] = Time.now.utc.iso8601 unless @parameters.key?('Timestamp')
|
72
68
|
@parameters = @default_hash.merge(@parameters)
|
73
69
|
post_url = @parameters.sort.map { |k, v| "#{k}=#{custom_escape(v)}" }.join('&')
|
74
70
|
post_body = ['POST', @mws_endpoint.to_s, "/#{@sandbox_str}/#{AmazonPay::API_VERSION}", post_url].join("\n")
|
@@ -106,11 +102,8 @@ module AmazonPay
|
|
106
102
|
@logger.debug("response: #{data.sanitize_response_data}")
|
107
103
|
end
|
108
104
|
if @throttle.eql?(true)
|
109
|
-
if response.code.eql?('500')
|
110
|
-
|
111
|
-
elsif response.code.eql?('503')
|
112
|
-
raise 'ServiceUnavailable or RequestThrottled'
|
113
|
-
end
|
105
|
+
raise 'InternalServerError' if response.code.eql?('500')
|
106
|
+
raise 'ServiceUnavailable or RequestThrottled' if response.code.eql?('503')
|
114
107
|
end
|
115
108
|
AmazonPay::Response.new(response)
|
116
109
|
rescue StandardError => error
|
data/lib/amazon_pay/response.rb
CHANGED
@@ -1,42 +1,35 @@
|
|
1
1
|
require 'rexml/document'
|
2
2
|
|
3
3
|
module AmazonPay
|
4
|
-
|
5
4
|
# This class provides helpers to parse the response
|
6
5
|
class Response
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
return @value
|
26
|
-
end
|
27
|
-
|
28
|
-
def code
|
29
|
-
@response.code
|
30
|
-
end
|
31
|
-
|
32
|
-
def success
|
33
|
-
if @response.code.eql? '200'
|
34
|
-
return true
|
35
|
-
else
|
36
|
-
return false
|
6
|
+
def initialize(response)
|
7
|
+
@response = response
|
8
|
+
end
|
9
|
+
|
10
|
+
def body
|
11
|
+
@response.body
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_xml
|
15
|
+
REXML::Document.new(body)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_element(xpath, xml_element)
|
19
|
+
xml = to_xml
|
20
|
+
value = nil
|
21
|
+
xml.elements.each(xpath) do |element|
|
22
|
+
value = element.elements[xml_element].text
|
37
23
|
end
|
38
|
-
|
24
|
+
value
|
25
|
+
end
|
39
26
|
|
40
|
-
|
27
|
+
def code
|
28
|
+
@response.code
|
29
|
+
end
|
41
30
|
|
31
|
+
def success
|
32
|
+
@response.code.eql? '200'
|
33
|
+
end
|
34
|
+
end
|
42
35
|
end
|
data/lib/amazon_pay/sanitize.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength, Metrics/LineLength
|
2
|
+
|
1
3
|
module AmazonPay
|
4
|
+
# Removes PII and other sensitive data for the logger
|
2
5
|
class Sanitize
|
3
6
|
def initialize(input_data)
|
4
7
|
@copy = input_data ? input_data.dup : ''
|
@@ -29,14 +32,14 @@ module AmazonPay
|
|
29
32
|
# Array of item to remove
|
30
33
|
|
31
34
|
patterns = []
|
32
|
-
patterns.push(
|
33
|
-
patterns.push(
|
34
|
-
patterns.push(
|
35
|
-
patterns.push(
|
36
|
-
patterns.push(
|
37
|
-
patterns.push(
|
38
|
-
patterns.push(
|
39
|
-
patterns.push(
|
35
|
+
patterns.push(%r{(?<=<Buyer>).*(?=<\/Buyer>)}s)
|
36
|
+
patterns.push(%r{(?<=<PhysicalDestination>).*(?=<\/PhysicalDestination>)}ms)
|
37
|
+
patterns.push(%r{(?<=<BillingAddress>).*(?=<\/BillingAddress>)}s)
|
38
|
+
patterns.push(%r{(?<=<SellerNote>).*(?=<\/SellerNote>)}s)
|
39
|
+
patterns.push(%r{(?<=<AuthorizationBillingAddress>).*(?=<\/AuthorizationBillingAddress>)}s)
|
40
|
+
patterns.push(%r{(?<=<SellerAuthorizationNote>).*(?=<\/SellerAuthorizationNote>)}s)
|
41
|
+
patterns.push(%r{(?<=<SellerCaptureNote>).*(?=<\/SellerCaptureNote>)}s)
|
42
|
+
patterns.push(%r{(?<=<SellerRefundNote>).*(?=<\/SellerRefundNote>)}s)
|
40
43
|
|
41
44
|
patterns.each do |s|
|
42
45
|
@copy.gsub!(s, '*REMOVED*')
|
data/lib/amazon_pay/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amazon_pay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AmazonPay
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: AmazonPay Ruby SDK
|
14
14
|
email: amazon-pay-sdk@amazon.com
|
@@ -19,7 +19,6 @@ files:
|
|
19
19
|
- LICENSE
|
20
20
|
- NOTICE
|
21
21
|
- README.md
|
22
|
-
- lib/CHANGES.txt
|
23
22
|
- lib/amazon_pay.rb
|
24
23
|
- lib/amazon_pay/client.rb
|
25
24
|
- lib/amazon_pay/client_helper.rb
|
@@ -37,7 +36,7 @@ metadata: {}
|
|
37
36
|
post_install_message:
|
38
37
|
rdoc_options: []
|
39
38
|
require_paths:
|
40
|
-
-
|
39
|
+
- lib
|
41
40
|
required_ruby_version: !ruby/object:Gem::Requirement
|
42
41
|
requirements:
|
43
42
|
- - ">="
|
@@ -50,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
50
49
|
version: '0'
|
51
50
|
requirements: []
|
52
51
|
rubyforge_project:
|
53
|
-
rubygems_version: 2.2
|
52
|
+
rubygems_version: 2.7.6.2
|
54
53
|
signing_key:
|
55
54
|
specification_version: 4
|
56
55
|
summary: AmazonPay Ruby SDK
|
data/lib/CHANGES.txt
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
2.3.2 May 2018
|
2
|
-
- Modify get_order_reference_details and get_billing_agreement_details
|
3
|
-
to take access_token parameter
|
4
|
-
|
5
|
-
2.3.1 May 2018
|
6
|
-
- Modify ipn_handler to work with new Cert format
|
7
|
-
- Add CHANGES file
|
8
|
-
|
9
|
-
2.3.0 April 2018
|
10
|
-
- Add GetMerchantAccountStatus
|
11
|
-
|
12
|
-
2.2.1 March 2018
|
13
|
-
- Create new Timestamp parameter on every request
|
14
|
-
|
15
|
-
2.2.0 Jan 2018
|
16
|
-
- Add ListOrderReference
|
17
|
-
- Add ListOrderReferenceByNextToken
|
18
|
-
|
19
|
-
2.1.0 Jan 2018
|
20
|
-
- Add Logging
|
21
|
-
- Add SetOrderAttribute
|
22
|
-
|
23
|
-
2.0.0 Feb 2017
|
24
|
-
- Pay with Amazon to Amazon Pay rebranding
|
25
|
-
|
26
|
-
1.x - 2015
|
27
|
-
- Update README
|
28
|
-
- Update documentation links
|
29
|
-
- Change Login with Amazon API class and method name
|
30
|
-
- Add one time transaction and subscriptions api flow
|
31
|
-
- Add marketplace api support
|
32
|
-
- Add client helper method
|
33
|
-
- Add get user info api
|
34
|
-
- Separate post request from client
|
35
|
-
- Initial release
|