PluginProbe
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More / 2.4.1
Better Payment – Instant Payments, Donations, Fundraising with Subscriptions & More v2.4.1
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.4.1, at includes/Admin/Elementor/Form_Actions/Paystack_Integration.php

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