PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.14.2
GiveWP – Donation Plugin and Fundraising Platform v3.14.2
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 / PaymentGateways / Gateways / PayPalStandard / Controllers / PayPalStandardWebhook.php
give / src / PaymentGateways / Gateways / PayPalStandard / Controllers Last commit date
PayPalStandardWebhook.php 3 years ago
PayPalStandardWebhook.php
162 lines
1 <?php
2
3 namespace Give\PaymentGateways\Gateways\PayPalStandard\Controllers;
4
5 use Give\Log\Log;
6 use Give\PaymentGateways\Gateways\PayPalStandard\PayPalStandard;
7 use Give\PaymentGateways\Gateways\PayPalStandard\Webhooks\WebhookRegister;
8 use Give\PaymentGateways\Gateways\PayPalStandard\Webhooks\WebhookValidator;
9
10 /**
11 * This class use to handle PayPal ipn.
12 *
13 * @since 2.19.0
14 */
15 class PayPalStandardWebhook
16 {
17
18 /**
19 * @var WebhookValidator
20 */
21 private $webhookValidator;
22
23 public function __construct(WebhookValidator $webhookValidator)
24 {
25 $this->webhookValidator = $webhookValidator;
26 }
27
28 /**
29 * Handle PayPal ipn
30 *
31 * @since 2.19.0
32 * @since 2.19.3 Respond with 200 http status to ipn.
33 */
34 public function handle()
35 {
36 $eventData = file_get_contents('php://input');
37 $eventData = wp_parse_args($eventData);
38
39 if ( ! $this->webhookValidator->verifyEventSignature($eventData)) {
40 exit();
41 }
42
43 $donationId = isset($eventData['custom']) ? absint($eventData['custom']) : 0;
44 $txnType = $eventData['txn_type'];
45
46 // ipn verification can be disabled in GiveWP (<=2.15.0).
47 // This check will prevent anonymous requests from editing donation, if ipn verification disabled.
48 if ( ! $this->verifyDonationId($donationId)) {
49 Log::error(
50 'PayPal Standard IPN Error',
51 [
52 'Message' => 'Donation id (from IPN) does not exist.',
53 'Event Data' => $eventData,
54 ]
55 );
56 exit();
57 }
58
59 $this->recordIpn($eventData, $donationId);
60 $this->recordIpnInDonation($donationId);
61
62 /* @var WebhookRegister $webhookRegisterer */
63 $webhookRegisterer = give(WebhookRegister::class);
64 if ($webhookRegisterer->hasEventRegistered($txnType)) {
65 $webhookRegisterer->getEventHandler($txnType)->processEvent((object)$eventData);
66 }
67
68 $this->supportLegacyActions($txnType, $eventData, $donationId);
69
70 exit;
71 }
72
73 /**
74 * @since 2.19.0
75 *
76 * @param int $donationId
77 *
78 * @param array $eventData
79 */
80 private function recordIpn(array $eventData, $donationId)
81 {
82 update_option(
83 'give_last_paypal_ipn_received',
84 [
85 'auth_status' => 'VERIFIED',
86 'transaction_id' => isset($eventData['txn_id']) ? $eventData['txn_id'] : 'N/A',
87 'payment_id' => $donationId,
88 ],
89 false
90 );
91 }
92
93 /**
94 * @since 2.19.0
95 *
96 * @param int $donationId
97 */
98 private function recordIpnInDonation($donationId)
99 {
100 $currentTimestamp = current_time('timestamp');
101
102 give_insert_payment_note(
103 $donationId,
104 sprintf(
105 __('IPN received on %1$s at %2$s', 'give'),
106 date_i18n('m/d/Y', $currentTimestamp),
107 date_i18n('H:i', $currentTimestamp)
108 )
109 );
110
111 give_update_meta($donationId, 'give_last_paypal_ipn_received', $currentTimestamp);
112 }
113
114 /**
115 * @param $donationId
116 *
117 * @return bool
118 */
119 private function verifyDonationId($donationId)
120 {
121 return $donationId && PayPalStandard::id() === give_get_payment_gateway($donationId);
122 }
123
124 /**
125 * @since 2.19.0
126 *
127 * @param string $txnType
128 * @param array $eventData
129 * @param int $donationId
130 *
131 * @return void
132 */
133 private function supportLegacyActions($txnType, array $eventData, $donationId)
134 {
135 if (has_action('give_paypal_' . $txnType)) {
136 /**
137 * Fires while processing PayPal IPN $txnType.
138 *
139 * Allow PayPal IPN types to be processed separately.
140 *
141 * @since 1.0
142 *
143 * @param array $eventData Encoded data.
144 * @param int $donationId donation id.
145 */
146 do_action("give_paypal_{$txnType}", $eventData, $donationId);
147 } else {
148 /**
149 * Fires while process PayPal IPN.
150 *
151 * Fallback to web accept just in case the txn_type isn't present.
152 *
153 * @since 1.0
154 *
155 * @param array $eventData Encoded data.
156 * @param int $donationId donation id.
157 */
158 do_action('give_paypal_web_accept', $eventData, $donationId);
159 }
160 }
161 }
162