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