PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.27.1
GiveWP – Donation Plugin and Fundraising Platform v2.27.1
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 / LegacyPaymentGateways / Adapters / LegacyPaymentGatewayAdapter.php
give / src / LegacyPaymentGateways / Adapters Last commit date
LegacyPaymentGatewayAdapter.php 3 years ago
LegacyPaymentGatewayAdapter.php
213 lines
1 <?php
2
3 namespace Give\LegacyPaymentGateways\Adapters;
4
5 use Exception;
6 use Give\Donations\ValueObjects\DonationType;
7 use Give\Donors\Models\Donor;
8 use Give\Framework\PaymentGateways\Contracts\PaymentGatewayInterface;
9 use Give\Framework\PaymentGateways\Controllers\GatewayPaymentController;
10 use Give\Framework\PaymentGateways\Controllers\GatewaySubscriptionController;
11 use Give\Framework\PaymentGateways\PaymentGateway;
12 use Give\PaymentGateways\Actions\GetGatewayDataFromRequest;
13 use Give\PaymentGateways\DataTransferObjects\FormData;
14 use Give\PaymentGateways\DataTransferObjects\SubscriptionData;
15 use Give\Subscriptions\Models\Subscription;
16 use Give\Subscriptions\ValueObjects\SubscriptionMode;
17 use Give\Subscriptions\ValueObjects\SubscriptionPeriod;
18 use Give\Subscriptions\ValueObjects\SubscriptionStatus;
19
20 /**
21 * Class LegacyPaymentGatewayAdapter
22 * @since 2.18.0
23 */
24 class LegacyPaymentGatewayAdapter
25 {
26
27 /**
28 * Get legacy form field markup to display gateway specific payment fields
29 *
30 * @since 2.18.0
31 * @since 2.19.0 Added missing $args parameter for ID prefixing and general backwards compatibility.
32 */
33 public function getLegacyFormFieldMarkup(
34 int $formId,
35 array $args,
36 PaymentGatewayInterface $registeredGateway
37 ): string {
38 return $registeredGateway->getLegacyFormFieldMarkup($formId, $args);
39 }
40
41 /**
42 * First we create a payment, then move on to the gateway processing
43 *
44 * @since 2.24.0 add support for payment mode
45 * @since 2.21.0 Replace give_insert_payment with donation model. Store legacy subscription data in donation meta.
46 * Attach subscription id to donation.
47 * @since 2.19.0 Replace is_recurring with is_donation_recurring to detect recurring donations.
48 * @since 2.18.0
49 *
50 * @throws Exception
51 */
52 public function handleBeforeGateway(array $legacyDonationData, PaymentGateway $registeredGateway)
53 {
54 $formData = FormData::fromRequest($legacyDonationData);
55
56 $this->validateGatewayNonce($formData->gatewayNonce);
57 $donor = $this->getOrCreateDonor(
58 $formData->donorInfo->wpUserId,
59 $formData->donorInfo->email,
60 $formData->donorInfo->firstName,
61 $formData->donorInfo->lastName
62 );
63
64 $donation = $formData->toDonation($donor->id);
65
66 if (give_recurring_is_donation_recurring($legacyDonationData)) {
67 $subscriptionData = SubscriptionData::fromRequest($legacyDonationData);
68
69 $paymentMode = !empty($legacyDonationData['payment_mode']) ? new SubscriptionMode($legacyDonationData['payment_mode']) : null;
70
71 if ( $paymentMode === null ) {
72 $paymentMode = give_is_test_mode() ? SubscriptionMode::TEST() : SubscriptionMode::LIVE();
73 }
74
75 $subscription = Subscription::create([
76 'amount' => $donation->amount,
77 'period' => new SubscriptionPeriod($subscriptionData->period),
78 'frequency' => (int)$subscriptionData->frequency,
79 'donorId' => $donor->id,
80 'installments' => (int)$subscriptionData->times,
81 'status' => SubscriptionStatus::PENDING(),
82 'mode' => $paymentMode,
83 'donationFormId' => $formData->formId,
84 ]);
85
86 $donation->type = DonationType::SUBSCRIPTION();
87 $donation->subscriptionId = $subscription->id;
88 $donation->save();
89
90 give()->subscriptions->updateLegacyParentPaymentId($subscription->id, $donation->id);
91
92 $this->setSession($donation->id);
93
94 /**
95 * Filter hook to provide gateway data before initial transaction for subscription is processed by the gateway.
96 *
97 * @since 2.21.2
98 */
99 $gatewayData = apply_filters(
100 "givewp_create_subscription_gateway_data_{$registeredGateway::id()}",
101 (new GetGatewayDataFromRequest)(),
102 $donation,
103 $subscription
104 );
105
106 $controller = new GatewaySubscriptionController($registeredGateway);
107 $controller->create($donation, $subscription, $gatewayData);
108 } else {
109 $donation->type = DonationType::SINGLE();
110 $donation->save();
111
112 $this->setSession($donation->id);
113
114 /**
115 * Filter hook to provide gateway data before transaction is processed by the gateway.
116 *
117 * @since 2.21.2
118 */
119 $gatewayData = apply_filters(
120 "givewp_create_payment_gateway_data_{$registeredGateway::id()}",
121 (new GetGatewayDataFromRequest)(),
122 $donation
123 );
124
125 $controller = new GatewayPaymentController($registeredGateway);
126 $controller->create($donation, $gatewayData);
127 }
128 }
129
130 /**
131 * Validate Gateway Nonce
132 *
133 * @since 2.18.0
134 */
135 private function validateGatewayNonce(string $gatewayNonce)
136 {
137 if (!wp_verify_nonce($gatewayNonce, 'give-gateway')) {
138 wp_die(
139 esc_html__(
140 'We\'re unable to recognize your session. Please refresh the screen to try again; otherwise contact your website administrator for assistance.',
141 'give'
142 ),
143 esc_html__('Error', 'give'),
144 ['response' => 403]
145 );
146 }
147 }
148
149 /**
150 * Set donation id to purchase session for use in the donation receipt.
151 *
152 * @since 2.21.0
153 *
154 * @param $donationId
155 *
156 * @return void
157 */
158 private function setSession($donationId)
159 {
160 $purchaseSession = (array)give()->session->get('give_purchase');
161
162 if ($purchaseSession && array_key_exists('purchase_key', $purchaseSession)) {
163 $purchaseSession['donation_id'] = $donationId;
164 give()->session->set('give_purchase', $purchaseSession);
165 }
166 }
167
168 /**
169 * @since 2.21.0
170 *
171 * @param int|null $userId
172 * @param string $donorEmail
173 * @param string $firstName
174 * @param string $lastName
175 *
176 * @return Donor
177 * @throws Exception
178 */
179 private function getOrCreateDonor(
180 int $userId,
181 string $donorEmail,
182 string $firstName,
183 string $lastName
184 ): Donor {
185 // first check if donor exists as a user
186 $donor = Donor::whereUserId($userId);
187
188 // If they exist as a donor & user then make sure they don't already own this email before adding to their additional emails list..
189 if ($donor && !$donor->hasEmail($donorEmail)) {
190 $donor->additionalEmails = array_merge($donor->additionalEmails ?? [], [$donorEmail]);
191 $donor->save();
192 }
193
194 // if donor is not a user than check for any donor matching this email
195 if (!$donor) {
196 $donor = Donor::whereEmail($donorEmail);
197 }
198
199 // if no donor exists then create a new one using their personal information from the form.
200 if (!$donor) {
201 $donor = Donor::create([
202 'name' => trim("$firstName $lastName"),
203 'firstName' => $firstName,
204 'lastName' => $lastName,
205 'email' => $donorEmail,
206 'userId' => $userId ?: null,
207 ]);
208 }
209
210 return $donor;
211 }
212 }
213