PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.9.3
Tutor LMS – eLearning and online course solution v3.9.3
4.0.0 3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / ecommerce / PaymentGateways / GatewayBase.php
tutor / ecommerce / PaymentGateways Last commit date
Configs 8 months ago Paypal 8 months ago GatewayBase.php 9 months ago GatewayFactory.php 11 months ago PaypalGateway.php 1 year ago
GatewayBase.php
229 lines
1 <?php
2 /**
3 * GatewayBase class for implementing common functionalities
4 *
5 * @package Tutor\Ecommerce
6 * @author Themeum
7 * @link https://themeum.com
8 * @since 3.0.0
9 */
10
11 namespace Tutor\PaymentGateways;
12
13 use Ollyo\PaymentHub\PaymentHub;
14 use stdClass;
15 use Tutor\Ecommerce\CheckoutController;
16
17 /**
18 * Payment gateway base class
19 */
20 abstract class GatewayBase {
21
22 /**
23 * Payment object of PaymentHub
24 *
25 * @var object
26 */
27 public $payment = null;
28
29 /**
30 * Root directory name
31 *
32 * @since 3.0.0
33 *
34 * @var string
35 */
36 abstract public function get_root_dir_name(): string;
37
38 /**
39 * Payment class from payment hub
40 *
41 * @since 3.0.0
42 *
43 * @var string
44 */
45 abstract public function get_payment_class(): string;
46
47 /**
48 * Config class
49 *
50 * @var string
51 *
52 * @since 3.0.0
53 */
54 abstract public function get_config_class(): string;
55
56 /**
57 * Include autoload file & init payment object
58 *
59 * @since 3.0.0
60 *
61 * @throws \Exception Throw exception if error occur.
62 *
63 * @return void
64 */
65 public function __construct() {
66 // Getting autoload file from concrete gateway class.
67 $autoload_file = $this::get_autoload_file();
68 if ( is_array( $autoload_file ) ) {
69 foreach ( $autoload_file as $file ) {
70 if ( file_exists( $file ) ) {
71 require_once $file;
72 }
73 }
74 } elseif ( isset( $autoload_file ) && file_exists( $autoload_file ) ) {
75 require_once $autoload_file;
76 }
77
78 if ( ! class_exists( '\Brick\Money' ) ) {
79 $autoload_file = tutor()->path . 'ecommerce/PaymentGateways/Paypal/vendor/autoload.php';
80 include $autoload_file;
81 }
82
83 $this->payment = ( new PaymentHub( $this->get_payment_class(), $this->get_config_class() ) )->make();
84
85 if ( ! $this->payment ) {
86 throw new \Exception( 'Failed to initialize payment for gateway: ' . static::class );
87 }
88 }
89
90 /**
91 * Setup payment data & redirect to the gateway
92 *
93 * @since 3.0.0
94 *
95 * @param mixed $data Data to be sent to the gateway.
96 *
97 * @throws \Exception Throw exception if error occur.
98 * @throws \Throwable Throw a throwable if error occur inside payment hub.
99 *
100 * @return void
101 */
102 public function setup_payment_and_redirect( $data ) {
103 if ( ! $this->payment ) {
104 throw new \Exception( 'Payment object is not initialized.' );
105 }
106
107 try {
108 $this->payment->setData( $data );
109
110 $this->payment->createPayment();
111 } catch ( \Throwable $th ) {
112 throw $th;
113 }
114 }
115
116 /**
117 * Generate webhook data of the payment and return
118 *
119 * @since 3.0.0
120 *
121 * @throws \Exception Throw exception if error occur.
122 * @throws \Throwable Throw a throwable if error occur inside payment hub.
123 *
124 * @return object
125 */
126 public function get_webhook_data() {
127 if ( ! $this->payment ) {
128 throw new \Exception( 'Payment object is not initialized.' );
129 }
130
131 $obj = new stdClass();
132
133 try {
134 $webhook = $this->payment->createWebhook();
135
136 $obj->webhook_url = $webhook->url;
137 $obj->secret = $webhook->secret;
138
139 return $obj;
140 } catch ( \Throwable $th ) {
141 throw $th;
142 }
143 }
144
145 /**
146 * Generate webhook data of the payment and return
147 *
148 * @since 3.0.0
149 *
150 * @param mixed $webhook_data Webhook data.
151 * @throws \Exception Throw exception if error occur.
152 *
153 * @return mixed
154 */
155 public function verify_webhook_signature( $webhook_data ) {
156 if ( ! $this->payment ) {
157 throw new \Exception( 'Payment object is not initialized.' );
158 }
159
160 return $this->payment->verifyAndCreateOrderData( $webhook_data );
161 }
162
163 /**
164 * Make recurring payment against a order
165 *
166 * @since 3.0.0
167 *
168 * @param int $order_id Order ID.
169 *
170 * @throws \Throwable Throw throwable if error occur.
171 * @throws \InvalidArgumentException Throw throwable if error occur.
172 * @throws \RuntimeException Throw throwable if error occur.
173 *
174 * @return void
175 */
176 public function make_recurring_payment( int $order_id ) {
177 // Check if payment object is initialized.
178 if ( ! $this->payment ) {
179 throw new \InvalidArgumentException( 'Payment object is not initialized.' );
180 }
181
182 // Validate order ID and amount.
183 if ( ! $order_id ) {
184 throw new \InvalidArgumentException( 'Invalid order ID or amount.' );
185 }
186
187 try {
188 // Prepare payment data.
189 $payment_data = CheckoutController::prepare_recurring_payment_data( $order_id );
190
191 if ( ! $payment_data ) {
192 throw new \RuntimeException( 'Failed to prepare recurring payment data.' );
193 }
194
195 // Set payment data and initiate recurring payment.
196 $this->payment->setData( $payment_data );
197 $this->payment->createRecurringPayment();
198 } catch ( \Throwable $th ) {
199 // Catch and rethrow any exception.
200 throw $th;
201 }
202 }
203
204 /**
205 * Make refund against a order
206 *
207 * @since 3.1.0
208 *
209 * @param object $refund_data Refund data.
210 *
211 * @throws \InvalidArgumentException Throw throwable if error occur.
212 *
213 * @return void
214 */
215 public function make_refund( object $refund_data ) {
216 // Check if payment object is initialized.
217 if ( ! $this->payment ) {
218 throw new \InvalidArgumentException( 'Payment object is not initialized.' );
219 }
220
221 if ( ! method_exists( $this->payment, 'createRefund' ) ) {
222 throw new \InvalidArgumentException( 'Refund from payment gateway is not available.' );
223 }
224
225 $this->payment->setData( $refund_data );
226 $this->payment->createRefund();
227 }
228 }
229