PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 2.2.2
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v2.2.2
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 1.0.5 1.0.6 All 66 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.2.2, at includes/Admin/Elementor/Form_Actions/Paystack_Integration.php

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