PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.19.4
GiveWP – Donation Plugin and Fundraising Platform v3.19.4
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 3 years ago RouteSignature.php 4 years ago
GatewayRoute.php
184 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 */
31 public function __invoke()
32 {
33 if ($this->isValidListener()) {
34 /** @var PaymentGatewayRegister $paymentGatewaysRegister */
35 $paymentGatewaysRegister = give(PaymentGatewayRegister::class);
36
37 // get all registered gateways
38 $paymentGateways = $paymentGatewaysRegister->getPaymentGateways();
39
40 // get all registered gateway ids
41 $gatewayIds = array_keys($paymentGateways);
42
43 // make sure required params are valid
44 if (!$this->isValidRequest($gatewayIds)) {
45 throw new PaymentGatewayException('This route is not valid.');
46 }
47
48 // create DTO from GET request
49 $data = GatewayRouteData::fromRequest(give_clean($_GET));
50
51 /**
52 * Get the PaymentGateway instance
53 *
54 * @var PaymentGateway $gateway
55 */
56 $gateway = give($paymentGateways[$data->gatewayId]);
57
58 if (!$gateway->supportsMethodRoute($data->gatewayMethod)) {
59 throw new PaymentGatewayException('The gateway method does not exist.');
60 }
61
62 // If method is in secureRouteMethods then, validate signature
63 if (in_array($data->gatewayMethod, $gateway->secureRouteMethods, true)) {
64 $this->validateSignature($data->routeSignature, $data);
65 }
66
67 // Navigate to our payment gateway api to handle calling the gateway's method
68 $this->handleGatewayRouteMethod($gateway, $data->gatewayMethod, $data->queryParams);
69
70 exit;
71 }
72 }
73
74 /**
75 * Check if the request is valid
76 *
77 * @since 2.19.0 remove required check give-donation-id
78 *
79 * @since 2.18.0
80 *
81 * @param array $gatewayIds
82 *
83 * @return bool
84 *
85 * @example ?give-listener=give-gateway&give-gateway-id=test-gateway&give-donation-id=1&give-gateway-method=returnFromOffsiteRedirect
86 *
87 */
88 private function isValidRequest($gatewayIds)
89 {
90 $isset = isset($_GET['give-gateway-id'], $_GET['give-gateway-method']);
91 $idValid = in_array($_GET['give-gateway-id'], $gatewayIds, true);
92
93 return $isset && $idValid;
94 }
95
96 /**
97 * Check if the listener is valid
98 *
99 * @since 2.18.0
100 *
101 * @return bool
102 */
103 private function isValidListener()
104 {
105 return isset($_GET['give-listener']) && $_GET['give-listener'] === 'give-gateway';
106 }
107
108 /**
109 * Validate signature using nonces
110 *
111 * @since 2.19.5 replace nonce with hash
112 * @since 2.19.4 replace RouteSignature args with unique donationId
113 * @since 2.19.0
114 *
115 * @param string $routeSignature
116 * @param GatewayRouteData $data
117 *
118 * @return void
119 */
120 private function validateSignature($routeSignature, GatewayRouteData $data)
121 {
122 $signature = new RouteSignature(
123 $data->gatewayId,
124 $data->gatewayMethod,
125 $data->routeSignatureId,
126 $data->routeSignatureExpiration
127 );
128
129 if (!$signature->isValid($routeSignature)) {
130 PaymentGatewayLog::error(
131 'Invalid Secure Route',
132 [
133 'routeSignature' => $routeSignature,
134 'signature' => $signature,
135 'signatureString' => $signature->toString(),
136 'signatureHash' => $signature->toHash(),
137 'signatureExpiration' => $signature->expiration,
138 'data' => $data
139 ]
140 );
141
142 wp_die('Forbidden', 403);
143 }
144 }
145
146 /**
147 * Handle gateway route method
148 *
149 * @since 2.18.0
150 *
151 * @since 2.19.0 - replace $donationId with $queryParams array
152 * @since 2.19.0 Record gateway id, callback method name and query params in log.
153 *
154 * @param PaymentGateway $gateway
155 * @param string $method
156 * @param array $queryParams
157 */
158 private function handleGatewayRouteMethod(PaymentGateway $gateway, $method, $queryParams)
159 {
160 try {
161 $this->handleResponse($gateway->callRouteMethod($method, $queryParams));
162 } catch (PaymentGatewayException $paymentGatewayException) {
163 $this->handleResponse(response()->json($paymentGatewayException->getMessage()));
164 } catch (\Exception $exception) {
165 PaymentGatewayLog::error(
166 $exception->getMessage(),
167 [
168 'Payment Gateway' => $gateway::id(),
169 'Payment Gateway Method' => $method,
170 'Query Params' => $queryParams
171 ]
172 );
173 $this->handleResponse(
174 response()->json(
175 __(
176 'An unexpected error occurred while processing your donation. Please try again or contact us to help resolve.',
177 'give'
178 )
179 )
180 );
181 }
182 }
183 }
184