PayPalAccountGateway.php
5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?php
namespace Braintree;
use InvalidArgumentException;
/**
* Braintree PayPalAccountGateway module
*
* @package Braintree
* @category Resources
*/
/**
* Manages Braintree PayPalAccounts
*
* <b>== More information ==</b>
*
*
* @package Braintree
* @category Resources
*/
class PayPalAccountGateway
{
private $_gateway;
private $_config;
private $_http;
public function __construct($gateway)
{
$this->_gateway = $gateway;
$this->_config = $gateway->config;
$this->_config->assertHasAccessTokenOrKeys();
$this->_http = new Http($gateway->config);
}
/**
* find a paypalAccount by token
*
* @access public
* @param string $token paypal accountunique id
* @return PayPalAccount
* @throws Exception\NotFound
*/
public function find($token)
{
$this->_validateId($token);
try {
$path = $this->_config->merchantPath() . '/payment_methods/paypal_account/' . $token;
$response = $this->_http->get($path);
return PayPalAccount::factory($response['paypalAccount']);
} catch (Exception\NotFound $e) {
throw new Exception\NotFound(
'paypal account with token ' . $token . ' not found'
);
}
}
/**
* updates the paypalAccount record
*
* if calling this method in context, $token
* is the 2nd attribute. $token is not sent in object context.
*
* @access public
* @param array $attributes
* @param string $token (optional)
* @return Result\Successful or Result\Error
*/
public function update($token, $attributes)
{
Util::verifyKeys(self::updateSignature(), $attributes);
$this->_validateId($token);
return $this->_doUpdate('put', '/payment_methods/paypal_account/' . $token, ['paypalAccount' => $attributes]);
}
public function delete($token)
{
$this->_validateId($token);
$path = $this->_config->merchantPath() . '/payment_methods/paypal_account/' . $token;
$this->_http->delete($path);
return new Result\Successful();
}
/**
* create a new sale for the current PayPal account
*
* @param string $token
* @param array $transactionAttribs
* @return Result\Successful|Result\Error
* @see Transaction::sale()
*/
public function sale($token, $transactionAttribs)
{
$this->_validateId($token);
return Transaction::sale(
array_merge(
$transactionAttribs,
['paymentMethodToken' => $token]
)
);
}
public static function updateSignature()
{
return [
'token',
['options' => ['makeDefault']]
];
}
/**
* sends the update request to the gateway
*
* @ignore
* @param string $subPath
* @param array $params
* @return mixed
*/
private function _doUpdate($httpVerb, $subPath, $params)
{
$fullPath = $this->_config->merchantPath() . $subPath;
$response = $this->_http->$httpVerb($fullPath, $params);
return $this->_verifyGatewayResponse($response);
}
/**
* generic method for validating incoming gateway responses
*
* creates a new PayPalAccount object and encapsulates
* it inside a Result\Successful object, or
* encapsulates a Errors object inside a Result\Error
* alternatively, throws an Unexpected exception if the response is invalid.
*
* @ignore
* @param array $response gateway response values
* @return Result\Successful|Result\Error
* @throws Exception\Unexpected
*/
private function _verifyGatewayResponse($response)
{
if (isset($response['paypalAccount'])) {
// return a populated instance of PayPalAccount
return new Result\Successful(
PayPalAccount::factory($response['paypalAccount'])
);
} else if (isset($response['apiErrorResponse'])) {
return new Result\Error($response['apiErrorResponse']);
} else {
throw new Exception\Unexpected(
'Expected paypal account or apiErrorResponse'
);
}
}
/**
* verifies that a valid paypal account identifier is being used
* @ignore
* @param string $identifier
* @param Optional $string $identifierType type of identifier supplied, default 'token'
* @throws InvalidArgumentException
*/
private function _validateId($identifier = null, $identifierType = 'token')
{
if (empty($identifier)) {
throw new InvalidArgumentException(
'expected paypal account id to be set'
);
}
if (!preg_match('/^[0-9A-Za-z_-]+$/', $identifier)) {
throw new InvalidArgumentException(
$identifier . ' is an invalid paypal account ' . $identifierType . '.'
);
}
}
}
class_alias('Braintree\PayPalAccountGateway', 'Braintree_PayPalAccountGateway');