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