paypal-sdk-rest 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/Gemfile +12 -0
- data/README.md +136 -0
- data/Rakefile +9 -0
- data/lib/paypal-sdk-rest.rb +2 -0
- data/lib/paypal-sdk/rest.rb +38 -0
- data/lib/paypal-sdk/rest/api.rb +23 -0
- data/lib/paypal-sdk/rest/data_types.rb +420 -0
- data/lib/paypal-sdk/rest/error_hash.rb +39 -0
- data/lib/paypal-sdk/rest/get_api.rb +20 -0
- data/lib/paypal-sdk/rest/request_data_type.rb +56 -0
- data/lib/paypal-sdk/rest/set_api.rb +42 -0
- data/lib/paypal-sdk/rest/version.rb +7 -0
- data/lib/paypal.rb +5 -0
- data/spec/config/cacert.pem +171 -0
- data/spec/config/cert_key.pem +33 -0
- data/spec/config/paypal.yml +8 -0
- data/spec/log/http.log +0 -0
- data/spec/payments_examples_spec.rb +210 -0
- data/spec/spec_helper.rb +24 -0
- metadata +98 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
module PayPal
|
2
|
+
module SDK
|
3
|
+
module REST
|
4
|
+
class ErrorHash < Core::Util::OrderedHash
|
5
|
+
def self.convert(hash)
|
6
|
+
error_hash = new
|
7
|
+
hash.each{|key, value|
|
8
|
+
error_hash[key] = value
|
9
|
+
}
|
10
|
+
error_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
def []=(key, value)
|
14
|
+
value =
|
15
|
+
if value.is_a? Hash
|
16
|
+
ErrorHash.convert(hash)
|
17
|
+
elsif value.is_a? Array and value[0].is_a? Hash
|
18
|
+
value.map{|array_value| ErrorHash.convert(array_value) }
|
19
|
+
else
|
20
|
+
value
|
21
|
+
end
|
22
|
+
super(key, value)
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](name)
|
26
|
+
super(name.to_s) || super(name.to_sym)
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(name, *args)
|
30
|
+
if keys.include?(name) or keys.include?(name.to_s)
|
31
|
+
self[name]
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module PayPal
|
2
|
+
module SDK
|
3
|
+
module REST
|
4
|
+
module GetAPI
|
5
|
+
# Get API object
|
6
|
+
# === Example
|
7
|
+
# Payment.api
|
8
|
+
# payment.api
|
9
|
+
def api
|
10
|
+
@api || parent_api
|
11
|
+
end
|
12
|
+
|
13
|
+
# Parent API object
|
14
|
+
def parent_api
|
15
|
+
superclass.respond_to?(:api) ? superclass.api : RequestDataType.api
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module PayPal
|
2
|
+
module SDK
|
3
|
+
module REST
|
4
|
+
|
5
|
+
module RequestDataType
|
6
|
+
|
7
|
+
# Get a local API object or Class level API object
|
8
|
+
def api
|
9
|
+
@api || self.class.api
|
10
|
+
end
|
11
|
+
|
12
|
+
# Convert Hash object to ErrorHash object
|
13
|
+
def error=(hash)
|
14
|
+
@error =
|
15
|
+
if hash.is_a? Hash
|
16
|
+
ErrorHash.convert(hash)
|
17
|
+
else
|
18
|
+
hash
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class << self
|
23
|
+
# Global API object
|
24
|
+
# === Example
|
25
|
+
# RequestDataType.api
|
26
|
+
def api
|
27
|
+
@api ||= API.new
|
28
|
+
end
|
29
|
+
|
30
|
+
# Setter for RequestDataType.api
|
31
|
+
# === Example
|
32
|
+
# RequestDataType.set_config(..)
|
33
|
+
include SetAPI
|
34
|
+
|
35
|
+
# Configure depended module, when RequestDataType is include.
|
36
|
+
# === Example
|
37
|
+
# class Payment < DataTypes
|
38
|
+
# include RequestDataType
|
39
|
+
# end
|
40
|
+
# Payment.set_config(..)
|
41
|
+
# payment.set_config(..)
|
42
|
+
# Payment.api
|
43
|
+
# payment.api
|
44
|
+
def included(klass)
|
45
|
+
klass.class_eval do
|
46
|
+
extend GetAPI
|
47
|
+
extend SetAPI
|
48
|
+
include SetAPI
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module PayPal
|
2
|
+
module SDK
|
3
|
+
module REST
|
4
|
+
module SetAPI
|
5
|
+
# Set new api
|
6
|
+
# === Examples
|
7
|
+
# payment.set_config(:development)
|
8
|
+
# payment.set_config(:client_id => "XYZ", :client_secret => "SECRET")
|
9
|
+
# payment.set_config
|
10
|
+
# payment.api = API.new(:development)
|
11
|
+
def set_config(*args)
|
12
|
+
if args[0].is_a?(API)
|
13
|
+
@api = args[0]
|
14
|
+
else
|
15
|
+
@api ||= API.new({})
|
16
|
+
@api.set_config(*args) # Just override the configuration and Not
|
17
|
+
@api
|
18
|
+
end
|
19
|
+
end
|
20
|
+
alias_method :config=, :set_config
|
21
|
+
alias_method :set_api, :set_config
|
22
|
+
alias_method :api=, :set_config
|
23
|
+
|
24
|
+
# Override token
|
25
|
+
def token=(token)
|
26
|
+
set_config( :client_id => nil, :client_secret => nil ).token = token
|
27
|
+
end
|
28
|
+
alias_method :"auth=", :"token="
|
29
|
+
|
30
|
+
# Override client id
|
31
|
+
def client_id=(client_id)
|
32
|
+
set_config(:client_id => client_id).token = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
# Override client secret
|
36
|
+
def client_secret=(client_secret)
|
37
|
+
set_config(:client_secret => client_secret).token = nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/paypal.rb
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
Verisign Class 3 Public Primary Certification Authority
|
2
|
+
=======================================================
|
3
|
+
-----BEGIN CERTIFICATE-----
|
4
|
+
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
|
5
|
+
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
|
6
|
+
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
|
7
|
+
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
|
8
|
+
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
|
9
|
+
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
|
10
|
+
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
|
11
|
+
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
|
12
|
+
TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
|
13
|
+
WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
|
14
|
+
Tqj/ZA1k
|
15
|
+
-----END CERTIFICATE-----
|
16
|
+
|
17
|
+
Verisign Class 3 Public Primary Certification Authority - G2
|
18
|
+
============================================================
|
19
|
+
-----BEGIN CERTIFICATE-----
|
20
|
+
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
|
21
|
+
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
|
22
|
+
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
|
23
|
+
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
|
24
|
+
dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
|
25
|
+
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
|
26
|
+
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
|
27
|
+
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
|
28
|
+
dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
|
29
|
+
FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
|
30
|
+
lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
|
31
|
+
MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
|
32
|
+
1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
|
33
|
+
Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
|
34
|
+
-----END CERTIFICATE-----
|
35
|
+
|
36
|
+
|
37
|
+
Verisign Class 3 Public Primary Certification Authority - G3
|
38
|
+
============================================================
|
39
|
+
-----BEGIN CERTIFICATE-----
|
40
|
+
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
|
41
|
+
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
42
|
+
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
43
|
+
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
|
44
|
+
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
|
45
|
+
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
|
46
|
+
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
|
47
|
+
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
|
48
|
+
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
49
|
+
ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
|
50
|
+
EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
|
51
|
+
cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
|
52
|
+
EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
|
53
|
+
055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
|
54
|
+
ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
|
55
|
+
j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
|
56
|
+
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
|
57
|
+
xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
|
58
|
+
t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
|
59
|
+
-----END CERTIFICATE-----
|
60
|
+
|
61
|
+
Verisign Class 4 Public Primary Certification Authority - G3
|
62
|
+
============================================================
|
63
|
+
-----BEGIN CERTIFICATE-----
|
64
|
+
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
|
65
|
+
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
66
|
+
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
67
|
+
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
|
68
|
+
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
|
69
|
+
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
|
70
|
+
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
|
71
|
+
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
|
72
|
+
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
73
|
+
ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
|
74
|
+
tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
|
75
|
+
8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
|
76
|
+
Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
|
77
|
+
Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
|
78
|
+
j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
|
79
|
+
mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
|
80
|
+
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
|
81
|
+
RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
|
82
|
+
UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
|
83
|
+
-----END CERTIFICATE-----
|
84
|
+
VeriSign Class 3 Public Primary Certification Authority - G5
|
85
|
+
============================================================
|
86
|
+
-----BEGIN CERTIFICATE-----
|
87
|
+
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
|
88
|
+
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
|
89
|
+
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
|
90
|
+
IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
|
91
|
+
ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
|
92
|
+
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
|
93
|
+
biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
|
94
|
+
dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
|
95
|
+
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
96
|
+
ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
|
97
|
+
j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
|
98
|
+
Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
|
99
|
+
Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
|
100
|
+
fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
|
101
|
+
BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
|
102
|
+
Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
|
103
|
+
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
|
104
|
+
SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
|
105
|
+
X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
|
106
|
+
KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
|
107
|
+
Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
|
108
|
+
ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
|
109
|
+
-----END CERTIFICATE-----
|
110
|
+
VeriSign Universal Root Certification Authority
|
111
|
+
===============================================
|
112
|
+
-----BEGIN CERTIFICATE-----
|
113
|
+
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
|
114
|
+
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
|
115
|
+
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
|
116
|
+
IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
|
117
|
+
IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
|
118
|
+
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
119
|
+
cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
120
|
+
IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
|
121
|
+
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
|
122
|
+
1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
|
123
|
+
MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
|
124
|
+
9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
|
125
|
+
AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
|
126
|
+
tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
|
127
|
+
CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
|
128
|
+
a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
|
129
|
+
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
|
130
|
+
Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
|
131
|
+
Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
|
132
|
+
P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
|
133
|
+
wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
|
134
|
+
mJO37M2CYfE45k+XmCpajQ==
|
135
|
+
-----END CERTIFICATE-----
|
136
|
+
|
137
|
+
VeriSign Class 3 Public Primary Certification Authority - G4
|
138
|
+
============================================================
|
139
|
+
-----BEGIN CERTIFICATE-----
|
140
|
+
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
|
141
|
+
VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
|
142
|
+
b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
|
143
|
+
ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
|
144
|
+
YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
|
145
|
+
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
|
146
|
+
cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
|
147
|
+
b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
|
148
|
+
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
|
149
|
+
Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
|
150
|
+
rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
|
151
|
+
/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
|
152
|
+
HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
|
153
|
+
Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
|
154
|
+
A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
|
155
|
+
AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
|
156
|
+
-----END CERTIFICATE-----
|
157
|
+
Verisign Class 3 Public Primary Certification Authority
|
158
|
+
=======================================================
|
159
|
+
-----BEGIN CERTIFICATE-----
|
160
|
+
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
|
161
|
+
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
|
162
|
+
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
|
163
|
+
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
|
164
|
+
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
|
165
|
+
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
|
166
|
+
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
|
167
|
+
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
|
168
|
+
CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
|
169
|
+
bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
|
170
|
+
D/xwzoiQ
|
171
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,33 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIICXAIBAAKBgQCx/rJhKDRYhs9WZj66FA+HidsrKwvep3g+YNbm1fXmjcg2rEmC
|
3
|
+
kq71+Ftw9rx0Uz7vmg6vcsASUgOyeNG7mVB1SsXc6j+JAzZsmpzxHI0QKm+nBNTS
|
4
|
+
OAp5NWn6NZQfu3BNAJ/Mok/iL3am2DWXV6dU74J66rBpwIJfzs9kmw8ZGwIDAQAB
|
5
|
+
AoGAa/V1sCQ4i7FItLjTNv3P5X+h5W74hhXBguQttFj2Ct7YHwEknQPnBt2aaMve
|
6
|
+
xhdvxtgELDpHcVU5VNifLU/yUg3+DSr/YkpBWOcNTCt1seW/z5s+jr2fQERQKbyf
|
7
|
+
SXWMTqwrQ19iQoCPYaj7Drf68JhksQCaYN650g7+B/QmSBECQQDp6r75fzDtEWrr
|
8
|
+
O4Sl9plK6CRLqQQ3LveAw4JV31N2UAqgAYtzRqD6K+SviAVtX9xxuv983qQxsfX4
|
9
|
+
ozE9sGXPAkEAwsxwR1s2Acuy10h3Xj6VtnFB3PpUrkSI9c9ZxF4CMf/+AS/b2UEe
|
10
|
+
QhH60WHY8ccgKT/DoPWBcEu2o0f9nPw29QJBAI480zHNeMe/Hp+5iliM0fvtmxxy
|
11
|
+
wwB3S8L9n4RuD0dTNpLDPbO0D/DvvdhKwtoWP2rcxbx9eaRKTYKKYUfcupsCQAkP
|
12
|
+
SQmIjHJ47tBkZmjTsFLT4aRNYDLarSQBiMNBPAjnRwD3INpx1N5tx6SFUHmuMSi5
|
13
|
+
9nc9888tNklRx9HNSSECQHgs9ExBpA6WbRVcgiizOKH7fmNxAB5f6TQ2W1QHMUb+
|
14
|
+
UhZpwuDelOIfzJAQUZGTZk8a8uVmyXU5hTf3ZDbrnJ8=
|
15
|
+
-----END RSA PRIVATE KEY-----
|
16
|
+
|
17
|
+
-----BEGIN CERTIFICATE-----
|
18
|
+
MIICpjCCAg+gAwIBAgIDD96nMA0GCSqGSIb3DQEBBQUAMIGfMQswCQYDVQQGEwJV
|
19
|
+
UzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2UxFTATBgNV
|
20
|
+
BAoTDFBheVBhbCwgSW5jLjEWMBQGA1UECxQNc2FuZGJveF9jZXJ0czEbMBkGA1UE
|
21
|
+
AxQSc2FuZGJveF9jYW1lcmNoYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwu
|
22
|
+
Y29tMB4XDTA5MTAxNTA2Mzg1N1oXDTE5MTAxMzA2Mzg1N1owgYAxLTArBgNVBAMU
|
23
|
+
JHBsYXRmb18xMjU1MTcwNjk0X2Jpel9hcGkxLmdtYWlsLmNvbTEiMCAGA1UEChMZ
|
24
|
+
cGxhdGZvcm0gc2RrJ3MgVGVzdCBTdG9yZTERMA8GA1UEBxMIU2FuIEpvc2UxCzAJ
|
25
|
+
BgNVBAgTAkNBMQswCQYDVQQGEwJVUzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
|
26
|
+
gYEAsf6yYSg0WIbPVmY+uhQPh4nbKysL3qd4PmDW5tX15o3INqxJgpKu9fhbcPa8
|
27
|
+
dFM+75oOr3LAElIDsnjRu5lQdUrF3Oo/iQM2bJqc8RyNECpvpwTU0jgKeTVp+jWU
|
28
|
+
H7twTQCfzKJP4i92ptg1l1enVO+CeuqwacCCX87PZJsPGRsCAwEAAaMNMAswCQYD
|
29
|
+
VR0TBAIwADANBgkqhkiG9w0BAQUFAAOBgQCgH3kwXMJtcAaCBQLKz5TGFogJp/C3
|
30
|
+
06MvjYzdbDrx9Rjf/252UhD8dMPUP5FhU1KXduL+KIEYawPbDQ9+lV58JgM12R0p
|
31
|
+
EhCODDI/lDvzbfxUnYgkJ5cnFhTZpcAqVzWuinUnG8jAL9XKiEyu/C73ePMPWPbt
|
32
|
+
otoWi+Tk828Qlw==
|
33
|
+
-----END CERTIFICATE-----
|
data/spec/log/http.log
ADDED
File without changes
|
@@ -0,0 +1,210 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Payments" do
|
4
|
+
|
5
|
+
PaymentAttributes = {
|
6
|
+
"intent" => "sale",
|
7
|
+
"payer" => {
|
8
|
+
"payment_method" => "credit_card",
|
9
|
+
"funding_instruments" => [ {
|
10
|
+
"credit_card" => {
|
11
|
+
"type" => "visa",
|
12
|
+
"number" => "4417119669820331",
|
13
|
+
"expire_month" => "11", "expire_year" => "2018",
|
14
|
+
"cvv2" => "874",
|
15
|
+
"first_name" => "Joe", "last_name" => "Shopper",
|
16
|
+
"billing_address" => {
|
17
|
+
"line1" => "52 N Main ST",
|
18
|
+
"city" => "Johnstown",
|
19
|
+
"state" => "OH",
|
20
|
+
"postal_code" => "43210", "country_code" => "US" } } } ] },
|
21
|
+
"transactions" => [ {
|
22
|
+
"amount" => {
|
23
|
+
"total" => "1.00",
|
24
|
+
"currency" => "USD" },
|
25
|
+
"description" => "This is the payment transaction description." } ] }
|
26
|
+
|
27
|
+
|
28
|
+
describe "Examples" do
|
29
|
+
describe "REST" do
|
30
|
+
it "Modifiy global configuration" do
|
31
|
+
backup_config = PayPal::SDK::REST.api.config
|
32
|
+
PayPal::SDK::REST.set_config( :client_id => "XYZ" )
|
33
|
+
PayPal::SDK::REST.api.config.client_id.should eql "XYZ"
|
34
|
+
PayPal::SDK::REST.set_config(backup_config)
|
35
|
+
PayPal::SDK::REST.api.config.client_id.should_not eql "XYZ"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "Payment" do
|
40
|
+
it "Create" do
|
41
|
+
payment = Payment.new(PaymentAttributes)
|
42
|
+
# Create
|
43
|
+
payment.create
|
44
|
+
payment.error.should be_nil
|
45
|
+
payment.id.should_not be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it "Create with request_id" do
|
49
|
+
payment = Payment.new(PaymentAttributes)
|
50
|
+
payment.create
|
51
|
+
payment.error.should be_nil
|
52
|
+
|
53
|
+
request_id = payment.request_id
|
54
|
+
|
55
|
+
new_payment = Payment.new(PaymentAttributes.merge( :request_id => request_id ))
|
56
|
+
new_payment.create
|
57
|
+
new_payment.error.should be_nil
|
58
|
+
|
59
|
+
payment.id.should eql new_payment.id
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
it "Create with token" do
|
64
|
+
api = API.new
|
65
|
+
payment = Payment.new(PaymentAttributes.merge( :token => api.token ))
|
66
|
+
Payment.api.should_not eql payment.api
|
67
|
+
payment.create
|
68
|
+
payment.error.should be_nil
|
69
|
+
payment.id.should_not be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it "Create with client_id and client_secret" do
|
73
|
+
api = API.new
|
74
|
+
payment = Payment.new(PaymentAttributes.merge( :client_id => api.config.client_id, :client_secret => api.config.client_secret))
|
75
|
+
Payment.api.should_not eql payment.api
|
76
|
+
payment.create
|
77
|
+
payment.error.should be_nil
|
78
|
+
payment.id.should_not be_nil
|
79
|
+
end
|
80
|
+
|
81
|
+
it "List" do
|
82
|
+
payment_history = Payment.all( "count" => 5 )
|
83
|
+
payment_history.error.should be_nil
|
84
|
+
payment_history.count.should eql 5
|
85
|
+
end
|
86
|
+
|
87
|
+
it "Find" do
|
88
|
+
payment_history = Payment.all( "count" => 1 )
|
89
|
+
payment = Payment.find(payment_history.payments[0].id)
|
90
|
+
payment.error.should be_nil
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "Validation" do
|
94
|
+
|
95
|
+
it "Create with empty values" do
|
96
|
+
payment = Payment.new
|
97
|
+
payment.create.should be_false
|
98
|
+
end
|
99
|
+
|
100
|
+
it "Find with invalid ID" do
|
101
|
+
lambda {
|
102
|
+
payment = Payment.find("Invalid")
|
103
|
+
}.should raise_error PayPal::SDK::Core::Exceptions::ResourceNotFound
|
104
|
+
end
|
105
|
+
|
106
|
+
it "Find with nil" do
|
107
|
+
lambda{
|
108
|
+
payment = Payment.find(nil)
|
109
|
+
}.should raise_error ArgumentError
|
110
|
+
end
|
111
|
+
|
112
|
+
it "Find with empty string" do
|
113
|
+
lambda{
|
114
|
+
payment = Payment.find("")
|
115
|
+
}.should raise_error ArgumentError
|
116
|
+
end
|
117
|
+
|
118
|
+
it "Find record with expired token" do
|
119
|
+
lambda {
|
120
|
+
Payment.api.token
|
121
|
+
Payment.api.token.sub!(/^/, "Expired")
|
122
|
+
Payment.all(:count => 1)
|
123
|
+
}.should_not raise_error
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "instance method" do
|
128
|
+
|
129
|
+
it "Execute" do
|
130
|
+
payment = Payment.find("PAY-6BL56416NR538963NKE3QC5Q")
|
131
|
+
payment.execute( :payer_id => "HZH2W8NPXUE5W" )
|
132
|
+
# payment.error.should be_nil
|
133
|
+
pending "Test with capybara"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "Sale" do
|
140
|
+
before :each do
|
141
|
+
@payment = Payment.new(PaymentAttributes)
|
142
|
+
@payment.create
|
143
|
+
@payment.should be_success
|
144
|
+
end
|
145
|
+
|
146
|
+
it "Find" do
|
147
|
+
sale = Sale.find(@payment.transactions[0].related_resources[0].sale.id)
|
148
|
+
sale.error.should be_nil
|
149
|
+
sale.should be_a Sale
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "instance method" do
|
153
|
+
it "Refund" do
|
154
|
+
sale = @payment.transactions[0].related_resources[0].sale
|
155
|
+
refund = sale.refund( :amount => { :total => "1.00", :currency => "USD" } )
|
156
|
+
refund.error.should be_nil
|
157
|
+
|
158
|
+
refund = Refund.find(refund.id)
|
159
|
+
refund.error.should be_nil
|
160
|
+
refund.should be_a Refund
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "CreditCard" do
|
166
|
+
it "Create" do
|
167
|
+
credit_card = CreditCard.new({
|
168
|
+
"type" => "visa",
|
169
|
+
"number" => "4417119669820331",
|
170
|
+
"expire_month" => "11", "expire_year" => "2018",
|
171
|
+
"cvv2" => "874",
|
172
|
+
"first_name" => "Joe", "last_name" => "Shopper",
|
173
|
+
"billing_address" => {
|
174
|
+
"line1" => "52 N Main ST",
|
175
|
+
"city" => "Johnstown",
|
176
|
+
"state" => "OH",
|
177
|
+
"postal_code" => "43210", "country_code" => "US" }})
|
178
|
+
credit_card.create
|
179
|
+
credit_card.error.should be_nil
|
180
|
+
credit_card.id.should_not be_nil
|
181
|
+
|
182
|
+
credit_card = CreditCard.find(credit_card.id)
|
183
|
+
credit_card.should be_a CreditCard
|
184
|
+
credit_card.error.should be_nil
|
185
|
+
end
|
186
|
+
|
187
|
+
describe "Validation" do
|
188
|
+
it "Create" do
|
189
|
+
credit_card = CreditCard.new({
|
190
|
+
"type" => "visa",
|
191
|
+
"number" => "4111111111111111" })
|
192
|
+
credit_card.create
|
193
|
+
credit_card.error.should_not be_nil
|
194
|
+
|
195
|
+
credit_card.error.name.should eql "VALIDATION_ERROR"
|
196
|
+
credit_card.error["name"].should eql "VALIDATION_ERROR"
|
197
|
+
|
198
|
+
credit_card.error.details[0].field.should eql "expire_year"
|
199
|
+
credit_card.error.details[0].issue.should eql "Required field missing"
|
200
|
+
credit_card.error.details[1].field.should eql "expire_month"
|
201
|
+
credit_card.error.details[1].issue.should eql "Required field missing"
|
202
|
+
|
203
|
+
credit_card.error["details"][0]["issue"].should eql "Required field missing"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
end
|