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