PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.19.8
GiveWP – Donation Plugin and Fundraising Platform v2.19.8
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Framework / PaymentGateways / Routes / GatewayRoute.php
give / src / Framework / PaymentGateways / Routes Last commit date
GatewayRoute.php 4 years ago RouteSignature.php 4 years ago
GatewayRoute.php
197 lines
1 <?php
2
3 namespace Give\Framework\PaymentGateways\Routes;
4
5 use Give\Framework\PaymentGateways\DataTransferObjects\GatewayRouteData;
6 use Give\Framework\PaymentGateways\Exceptions\PaymentGatewayException;
7 use Give\Framework\PaymentGateways\Log\PaymentGatewayLog;
8 use Give\Framework\PaymentGateways\PaymentGateway;
9 use Give\Framework\PaymentGateways\PaymentGatewayRegister;
10 use Give\Framework\PaymentGateways\Traits\HandleHttpResponses;
11
12 use function Give\Framework\Http\Response\response;
13
14 /**
15 * @since 2.18.0
16 */
17 class GatewayRoute
18 {
19 use HandleHttpResponses;
20
21 /**
22 * This is our entry point into the Gateway Routing system.
23 *
24 * @since 2.19.0 - validate secureRouteMethods
25 * @since 2.18.0
26 *
27 * @return void
28 *
29 * @throws PaymentGatewayException
30 * @since 2.18.0
31 * @since 2.19.0 - validate secureRouteMethods
32 *
33 */
34 public function __invoke()
35 {
36 if ($this->isValidListener()) {
37 /** @var PaymentGatewayRegister $paymentGatewaysRegister */
38 $paymentGatewaysRegister = give(PaymentGatewayRegister::class);
39
40 // get all registered gateways
41 $paymentGateways = $paymentGatewaysRegister->getPaymentGateways();
42
43 // get all registered gateway ids
44 $gatewayIds = array_keys($paymentGateways);
45
46 // make sure required params are valid
47 if (!$this->isValidRequest($gatewayIds)) {
48 throw new PaymentGatewayException('This route is not valid.');
49 }
50
51 // create DTO from GET request
52 $data = GatewayRouteData::fromRequest(give_clean($_GET));
53
54 /**
55 * Get the PaymentGateway instance
56 *
57 * @var PaymentGateway $gateway
58 */
59 $gateway = give($paymentGateways[$data->gatewayId]);
60
61 // get all public and secure gateway methods
62 $allGatewayMethods = array_merge($gateway->routeMethods, $gateway->secureRouteMethods);
63
64 // Make sure the method being called is defined in the gateway.
65 if (
66 !method_exists($gateway, $data->gatewayMethod) ||
67 !in_array($data->gatewayMethod, $allGatewayMethods, true)
68 ) {
69 throw new PaymentGatewayException('The gateway method does not exist.');
70 }
71
72 // If method is in secureRouteMethods then, validate signature
73 if (in_array($data->gatewayMethod, $gateway->secureRouteMethods, true)) {
74 $this->validateSignature($data->routeSignature, $data);
75 }
76
77 // Navigate to our payment gateway api to handle calling the gateway's method
78 $this->handleGatewayRouteMethod($gateway, $data->gatewayMethod, $data->queryParams);
79
80 exit;
81 }
82 }
83
84 /**
85 * Check if the request is valid
86 *
87 * @since 2.19.0 remove required check give-donation-id
88 *
89 * @since 2.18.0
90 *
91 * @param array $gatewayIds
92 *
93 * @return bool
94 *
95 * @example ?give-listener=give-gateway&give-gateway-id=test-gateway&give-donation-id=1&give-gateway-method=returnFromOffsiteRedirect
96 *
97 */
98 private function isValidRequest($gatewayIds)
99 {
100 $isset = isset($_GET['give-gateway-id'], $_GET['give-gateway-method']);
101 $idValid = in_array($_GET['give-gateway-id'], $gatewayIds, true);
102
103 return $isset && $idValid;
104 }
105
106 /**
107 * Check if the listener is valid
108 *
109 * @since 2.18.0
110 *
111 * @return bool
112 */
113 private function isValidListener()
114 {
115 return isset($_GET['give-listener']) && $_GET['give-listener'] === 'give-gateway';
116 }
117
118 /**
119 * Validate signature using nonces
120 *
121 * @since 2.19.5 replace nonce with hash
122 * @since 2.19.4 replace RouteSignature args with unique donationId
123 * @since 2.19.0
124 *
125 * @param string $routeSignature
126 * @param GatewayRouteData $data
127 *
128 * @return void
129 */
130 private function validateSignature($routeSignature, GatewayRouteData $data)
131 {
132 $signature = new RouteSignature(
133 $data->gatewayId,
134 $data->gatewayMethod,
135 $data->routeSignatureId,
136 $data->routeSignatureExpiration
137 );
138
139 if (!$signature->isValid($routeSignature)) {
140 PaymentGatewayLog::error(
141 'Invalid Secure Route',
142 [
143 'routeSignature' => $routeSignature,
144 'signature' => $signature,
145 'signatureString' => $signature->toString(),
146 'signatureHash' => $signature->toHash(),
147 'signatureExpiration' => $signature->expiration,
148 'data' => $data
149 ]
150 );
151
152 wp_die('Forbidden', 403);
153 }
154 }
155
156 /**
157 * Handle gateway route method
158 *
159 * @since 2.18.0
160 *
161 * @since 2.19.0 - replace $donationId with $queryParams array
162 * @since 2.19.0 Record gateway id, callback method name and query params in log.
163 *
164 * @param PaymentGateway $gateway
165 * @param string $method
166 * @param array $queryParams
167 *
168 * @return void
169 *
170 */
171 private function handleGatewayRouteMethod(PaymentGateway $gateway, $method, $queryParams)
172 {
173 try {
174 $this->handleResponse($gateway->$method($queryParams));
175 } catch (PaymentGatewayException $paymentGatewayException) {
176 $this->handleResponse(response()->json($paymentGatewayException->getMessage()));
177 } catch (\Exception $exception) {
178 PaymentGatewayLog::error(
179 $exception->getMessage(),
180 [
181 'Payment Gateway' => $gateway->getId(),
182 'Payment Gateway Method' => $method,
183 'Query Params' => $queryParams
184 ]
185 );
186 $this->handleResponse(
187 response()->json(
188 __(
189 'An unexpected error occurred while processing your donation. Please try again or contact us to help resolve.',
190 'give'
191 )
192 )
193 );
194 }
195 }
196 }
197