PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 2.1.2
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v2.1.2
2.4.1 2.4.0 2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.2 2.2.1 2.2.0 2.1.2 2.1.1 trunk 0.0.1 0.0.2 0.0.3 0.0.4 0.0.5 0.0.6 0.0.7 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 All 68 releases
better-payment / includes / Admin / Elementor / Form_Actions / Paystack_Integration.php

Paystack_Integration.php in Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More 2.1.2, at includes/Admin/Elementor/Form_Actions/Paystack_Integration.php

286 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Better_Payment\Lite\Admin\Elementor\Form_Actions;
4
5 use Better_Payment\Lite\Admin\DB;
6 use Better_Payment\Lite\Classes\Handler;
7 use Better_Payment\Lite\Traits\Helper;
8 use Elementor\Controls_Manager;
9 use ElementorPro\Modules\Forms\Classes\Action_Base;
10 use ElementorPro\Modules\Forms\Classes\Ajax_Handler;
11 use ElementorPro\Modules\Forms\Classes\Form_Record;
12
13 /**
14 * Paystack integration class
15 *
16 * @since 0.0.1
17 */
18 class Paystack_Integration extends Action_Base {
19 use Helper;
20
21 private $better_payment_global_settings = [];
22
23 public function __construct() {
24 wp_enqueue_script( 'better-payment' );
25 }
26
27 public function get_name() {
28 return 'paystack';
29 }
30
31 public function get_label() {
32 return __( 'Paystack', 'better-payment' );
33 }
34
35 public function get_script_depends() {
36 return [ 'better-payment' ];
37 }
38
39 /**
40 * @param \Elementor\Widget_Base $widget
41 */
42 public function register_settings_section( $widget ) {
43 $this->better_payment_global_settings = DB::get_settings();
44
45 $widget->start_controls_section(
46 'section_paystack_payment',
47 [
48 'label' => __( 'Paystack', 'better-payment' ),
49 'condition' => [
50 'submit_actions' => $this->get_name(),
51 'better_payment_payment_amount_enable' => 'yes'
52 ],
53 ]
54 );
55
56 $better_payment_helper = new \Better_Payment\Lite\Classes\Helper();
57
58 $widget->add_control(
59 'better_payment_form_paystack_currency',
60 [
61 'label' => esc_html__( 'Currency Symbols', 'better-payment' ),
62 'type' => Controls_Manager::SELECT,
63 'default' => esc_html($this->better_payment_global_settings['better_payment_settings_general_general_currency']),
64 'options' => $better_payment_helper->get_currency_list(),
65 ]
66 );
67
68 $widget->add_control(
69 'better_payment_paystack_currecny_support_notice',
70 [
71 'type' => Controls_Manager::RAW_HTML,
72 'raw' => __( 'Currency is not supported by Paystack!', 'better-payment' ),
73 'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
74 'condition' => [
75 'better_payment_form_paystack_currency!' => $this->bp_supported_currencies( 'paystack' ),
76 ],
77 ]
78 );
79
80 $better_payment_is_paystack_live = ! empty( $this->better_payment_global_settings['better_payment_settings_payment_paystack_live_mode'] ) && 'yes' === $this->better_payment_global_settings['better_payment_settings_payment_paystack_live_mode'] ? 1 : 0;
81 $paystack_live_key = ! empty( $this->better_payment_global_settings['better_payment_settings_payment_paystack_live_public'] ) ? $this->better_payment_global_settings['better_payment_settings_payment_paystack_live_public'] : '';
82 $paystack_test_key = ! empty( $this->better_payment_global_settings['better_payment_settings_payment_paystack_test_public'] ) ? $this->better_payment_global_settings['better_payment_settings_payment_paystack_test_public'] : '';
83 $paystack_live_secret = ! empty( $this->better_payment_global_settings['better_payment_settings_payment_paystack_live_secret'] ) ? $this->better_payment_global_settings['better_payment_settings_payment_paystack_live_secret'] : '';
84 $paystack_test_secret = ! empty( $this->better_payment_global_settings['better_payment_settings_payment_paystack_test_secret'] ) ? $this->better_payment_global_settings['better_payment_settings_payment_paystack_test_secret'] : '';
85
86 $widget->add_control(
87 'better_payment_paystack_public_key',
88 [
89 'label' => __( 'Public Key', 'better-payment' ),
90 'type' => current_user_can('manage_options') ? Controls_Manager::TEXT : Controls_Manager::HIDDEN,
91 'dynamic' => [
92 'active' => true,
93 ],
94 'label_block' => true,
95 'default' => $better_payment_is_paystack_live ? esc_html( $paystack_live_key ) : esc_html( $paystack_test_key ),
96 'ai' => [
97 'active' => false,
98 ],
99 ]
100 );
101
102 $widget->add_control(
103 'better_payment_paystack_secret_key',
104 [
105 'label' => __( 'Secret Key', 'better-payment' ),
106 'type' => current_user_can('manage_options') ? Controls_Manager::TEXT : Controls_Manager::HIDDEN,
107 'input_type' => 'password',
108 'dynamic' => [
109 'active' => true,
110 ],
111 'label_block' => true,
112 'default' => $better_payment_is_paystack_live ? esc_html( $paystack_live_secret ) : esc_html( $paystack_test_secret ),
113 'ai' => [
114 'active' => false,
115 ],
116 ]
117 );
118
119 $widget->add_control(
120 'better_payment_paystack_live_mode',
121 [
122 'label' => __( 'Live Mode', 'better-payment' ),
123 'type' => Controls_Manager::SWITCHER,
124 'label_on' => __( 'Yes', 'better-payment' ),
125 'label_off' => __( 'No', 'better-payment' ),
126 'return_value' => 'yes',
127 'default' => esc_html($this->better_payment_global_settings['better_payment_settings_payment_paypal_live_mode']), //yes or no
128 ]
129 );
130 $widget->end_controls_section();
131 }
132
133 /**
134 * @param array $element
135 * @return array
136 */
137 public function on_export( $element ) {
138 unset(
139 $element[ 'settings' ][ 'better_payment_form_paystack_currency' ],
140 $element[ 'settings' ][ 'better_payment_paystack_public_key' ],
141 $element[ 'settings' ][ 'better_payment_paystack_secret_key' ],
142 $element[ 'settings' ][ 'better_payment_paystack_live_mode' ]
143 );
144 return $element;
145 }
146
147 /**
148 * @param Form_Record $record
149 * @param Ajax_Handler $ajax_handler
150 */
151 public function run( $record, $ajax_handler ) {
152
153 $secret_key = $record->get_form_settings( 'better_payment_paystack_secret_key' );
154 $post_data = [];
155 $header_info = array(
156 'Authorization' => 'Bearer ' . sanitize_text_field( $secret_key ),
157 "Cache-Control: no-cache",
158 );
159
160 $sent_data = $record->get( 'sent_data' );
161
162 $el_form_form_settings = $record->get('form_settings');
163 $page_id = $el_form_form_settings['form_post_id'] ? intval($el_form_form_settings['form_post_id']) : 0;
164 $widget_id = $el_form_form_settings['id'] ? sanitize_text_field($el_form_form_settings['id']) : '';
165
166 if ( empty( $sent_data['payment_amount'] ) && empty( $sent_data['primary_payment_amount_radio'] ) ) {
167 $ajax_handler->add_error_message( 'Amount field is required!' );
168 return false;
169 }
170
171 $amount = isset( $sent_data['payment_amount'] ) ? floatval($sent_data['payment_amount']) : 0;
172
173 if ( empty( $amount ) && ! empty( $sent_data['primary_payment_amount_radio'] ) ) {
174 $amount = floatval( $sent_data['primary_payment_amount_radio'] );
175 }
176
177 $quantity = 1;
178 if ( !empty( $sent_data[ 'pay_quantity' ] ) ) {
179 $quantity = intval( $sent_data[ 'pay_quantity' ][ 'value' ] );
180 $amount *= $quantity;
181 }
182
183 $order_id = 'paystack_' . uniqid();
184
185 $redirection_url_success = get_permalink( $page_id );
186 $redirection_url_error = get_permalink( $page_id );
187
188 $request = [
189 'amount' => ( $amount * 100 ),
190 'cart_id' => $order_id,
191 'callback_url' => add_query_arg( [
192 'better_payment_paystack_status' => 'success',
193 'better_payment_paystack_id' => $order_id,
194 'better_payment_widget_id' => $widget_id
195 ], $redirection_url_success ),
196 ];
197
198 if ( ! empty( $sent_data[ 'email' ] ) ) {
199 $request['payment_intent_data']['metadata']['customer_email'] = $request['metadata']['customer_email'] = $request['email'] = sanitize_email( $sent_data['email'] );
200 }
201
202 if ( ! empty( $sent_data['name'] ) ) {
203 $request['customer_name'] = ! empty( $request['customer_name'] ) ? $request['customer_name'] . ' ' . sanitize_text_field( $sent_data['name'] ) : sanitize_text_field( $sent_data['name'] );
204 }
205
206 if ( !empty( $sent_data['first_name'] ) ) {
207 $request['customer_name'] = ! empty( $request['customer_name'] ) ? $request['customer_name'] . ' ' . sanitize_text_field( $sent_data['first_name'] ) : sanitize_text_field( $sent_data['first_name'] );
208 }
209
210 if ( !empty( $sent_data['last_name'] ) ) {
211 $request['customer_name'] = !empty( $request['customer_name'] ) ? $request['customer_name'] . ' ' . sanitize_text_field( $sent_data['last_name'] ) : sanitize_text_field( $sent_data['last_name'] );
212 }
213
214 if ( !empty( $request['customer_name'] ) ) {
215 $request['payment_intent_data']['metadata']['customer_name'] = $request['metadata']['customer_name'] = $request['customer_name'];
216 unset( $request['customer_name'] );
217 }
218
219 $response = wp_safe_remote_post(
220 'https://api.paystack.co/transaction/initialize',
221 array(
222 'method' => 'POST',
223 'headers' => $header_info,
224 'body' => $request,
225 'timeout' => 70,
226 )
227 );
228
229 $response_ar = json_decode( $response['body'] );
230
231 if ( ! empty( $response_ar->error ) ) {
232 $ajax_handler->add_error_message( sanitize_text_field( $response_ar->error->message ) );
233 return false;
234 }
235
236 $paystack_supported_currencies = $this->bp_supported_currencies( 'paystack' );
237 $currency_code = sanitize_text_field( $record->get_form_settings( 'better_payment_form_paystack_currency' ) );
238
239 if ( is_array( $paystack_supported_currencies ) && ! in_array( $currency_code, $paystack_supported_currencies ) ) {
240 $ajax_handler->add_error_message( 'Currency is not supported by Paystack!' );
241 return false;
242 }
243
244 if ( ! ( empty( $response_ar->status ) || empty( $response_ar->data ) ) ) {
245
246 //Form fields data to send via email
247 $better_form_fields = [
248 'email' => ! empty( $sent_data['email'] ) ? sanitize_email( $sent_data['email'] ) : '',
249 'amount' => $currency_code . floatval( $amount ),
250 'el_form_fields' => maybe_serialize($sent_data),
251 'referer_page_id' => $page_id,
252 'referer_widget_id' => $widget_id,
253 'source' => 'paystack'
254 ];
255
256 // Get campaign_id from form data if available
257 $campaign_id = ! empty( $sent_data['campaign_id'] ) ? sanitize_text_field( $sent_data['campaign_id'] ) : '';
258
259 Handler::payment_create(
260 [
261 'amount' => $amount,
262 'order_id' => $order_id,
263 'payment_date' => date( 'Y-m-d H:i:s' ),
264 'source' => 'paystack',
265 'transaction_id' => '',
266 'customer_info' => maybe_serialize( $response_ar ),
267 'form_fields_info' => maybe_serialize( $better_form_fields ),
268 'obj_id' => !empty($response_ar->id) ? sanitize_text_field($response_ar->id) : '',
269 'status' => 'unpaid',
270 'currency' => $currency_code,
271 'referer' => "elementor-form",
272 'campaign_id' => $campaign_id,
273 ]
274 );
275
276 $authorization_url = ! empty( $response_ar->data->authorization_url ) ? esc_url_raw( $response_ar->data->authorization_url ) : '';
277
278 $ajax_handler->add_response_data( 'better_paystack_data', [
279 'authorization_url' => esc_url_raw( $authorization_url ),
280 ] );
281 }
282 }
283 }
284
285
286