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