Files
formipay/includes/Payment/Payment.php
2025-08-21 20:39:34 +07:00

289 lines
10 KiB
PHP

<?php
namespace Formipay\Payment;
use Formipay\Traits\SingletonTrait;
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
abstract class Payment {
use SingletonTrait;
abstract public function add_gateway($gateways);
abstract public function add_transaction($order_data);
abstract public function process_payment($order_data);
abstract public function cancel_payment($order_data);
protected function __construct() {
add_filter( 'formipay/global-settings', [$this, 'add_setting_payment_menu'], 20 );
add_filter( 'formipay/form-config', [$this, 'add_form_payment_menu'], 79 );
add_filter( 'formipay/form-config/tab:payments', [$this, 'add_responsive_grid'], 1012 );
add_filter( 'formipay/frontend/payment-list', [$this, 'add_payment_list'], 999, 2 );
add_filter( 'formipay/order/shortcodes', [$this, 'add_order_shortcodes'], 999, 4 );
add_filter( 'formipay/thankyou/shortcodes', [$this, 'add_order_shortcodes'], 999, 4 );
add_filter( 'formipay/order/process-data', [$this, 'add_payment_in_process_data'], 999, 2 );
add_filter( 'formipay/order/payment-details', [$this, 'render_payment_details'], 999, 4 );
add_action( 'init', [$this, 'set_endpoint'], 999);
add_filter( 'query_vars', [$this, 'set_query_vars'], 899);
add_action( 'wp_enqueue_scripts', [$this, 'frontend_enqueue'] );
add_filter( 'pre_get_document_title', [$this, 'payment_confirm_page_title'], 1000 );
}
public function add_setting_payment_menu($fields){
$general_payment_settings = array();
$payment_settings = apply_filters( 'formipay/global-settings/tab:payment', $general_payment_settings );
if(!empty($payment_settings)){
$fields['payment'] = array(
'name' => __('Payment', 'formipay'),
'fields' => $payment_settings
);
}
return $fields;
}
public function add_form_payment_menu($fields) {
$gateways = apply_filters( 'formipay/form-config/tab:payments/gateways', [] );
$payment_options = [];
if(!empty($gateways)){
foreach($gateways as $gateway){
$id = $gateway['id'];
$label = $gateway['gateway'];
if(isset($gateway['channel'])){
$label .= ' - '.$gateway['channel'];
}
$payment_options[] = [
'id' => $id,
'label' => $label
];
}
}
$payment_fields = [
'payment_section_group' => array(
'type' => 'group_title',
'label' => __( 'Payment Section', 'formipay' ),
'submenu' => __( 'General', 'formipay' ),
'group' => 'started'
),
'payment_section_title' => array(
'type' => 'text',
'label' => __( 'Payment Section Title', 'formipay' ),
'submenu' => __( 'General', 'formipay' ),
'value' => 'Payment Methods',
),
'payment_gateways' => array(
'type' => 'sorter',
'label' => __( 'Choose one or any', 'formipay' ),
'options' => array(
array(
'id' => 'inactive',
'name' => __( 'Inactive', 'formipay' ),
'options' => $payment_options,
),
array(
'id' => 'active',
'name' => __( 'Active', 'formipay' ),
'options' => [],
)
),
'submenu' => __( 'General', 'formipay' ),
),
'payment_label' => array(
'type' => 'checkbox',
'label' => __( 'Show Payment Label', 'formipay' ),
'description' => __( 'Show payment label in the payment options on the frontend.', 'formipay' ),
'submenu' => __( 'General', 'formipay' ),
'group' => 'ended'
)
];
$payment_fields = apply_filters( 'formipay/form-config/tab:payments', $payment_fields );
$fields['formipay_form_settings']['payments'] = array(
'name' => __( 'Payments', 'formipay' ),
'fields' => $payment_fields
);
return $fields;
}
public function add_responsive_grid($channels) {
$channels['payment_responsive_box'] = array(
'type' => 'group_title',
'label' => __( 'Responsive', 'formipay' ),
'description' => __( 'Set responsive grid payment card options' , 'formipay' ),
'submenu' => __( 'General', 'formipay' ),
'group' => 'started',
);
$channels['payment_desktop_columns'] = array(
'type' => 'number',
'label' => __( 'Desktop View', 'formipay' ),
'submenu' => __( 'General', 'formipay' ),
'value' => 4
);
$channels['payment_tablet_columns'] = array(
'type' => 'number',
'label' => __( 'Tablet View', 'formipay' ),
'submenu' => __( 'General', 'formipay' ),
'value' => 3
);
$channels['payment_mobile_columns'] = array(
'type' => 'number',
'label' => __( 'Mobile View', 'formipay' ),
'submenu' => __( 'General', 'formipay' ),
'value' => 2,
'group' => 'ended'
);
return $channels;
}
public function add_payment_list($payment_list, $form_id) {
$formipay_settings = get_option('formipay_settings');
$payment_gateways = json_decode(formipay_get_post_meta($form_id, 'payment_gateways'), true);
foreach($payment_gateways as $payment){
if($payment['id'] == 'active' && !empty($payment['options'])){
foreach($payment['options'] as $option){
$id = $option['id'];
$_pay = explode(':::', $id);
$gateway = $_pay[0];
if(formipay_get_post_meta($form_id, 'product_type') == 'digital' && $gateway == 'cod'){
continue;
}
if(isset($formipay_settings[$gateway.'_channels']) && isset($_pay[1])){
$channel = $_pay[1];
if(strpos($channel, '-')){
$channel = explode('-', $channel);
$channel_index = $channel[1];
$payment_list[$id] = $formipay_settings[$gateway.'_channels'][$channel_index];
}
}else{
$label = $icon = '';
if(isset($formipay_settings[$gateway.'_label']) && !empty($formipay_settings[$gateway.'_label'])){
$label = $formipay_settings[$gateway.'_label'];
}
if(isset($formipay_settings[$gateway.'_icon']) && !empty($formipay_settings[$gateway.'_icon'])){
$icon = $formipay_settings[$gateway.'_icon'];
}
$payment_list[$id] = array(
$gateway.'_name' => apply_filters( 'formipay/payment-list/'.$gateway.'/label', $label),
$gateway.'_logo' => apply_filters( 'formipay/payment-list/'.$gateway.'/logo', $icon)
);
}
}
}
}
return $payment_list;
}
public function add_order_shortcodes($shortcodes, $form_id, $order_data, $submit_action_type) {
$shortcodes['payment_details'] = apply_filters( 'formipay/order/payment-details', '', $form_id, $order_data, $submit_action_type );
return $shortcodes;
}
public function render_payment_details($render, $form_id, $order_data, $submit_action_type) {
$payment_gateway = $order_data['payment_gateway'];
$render = apply_filters( 'formipay/order/payment-details/'.$payment_gateway, $render, $form_id, $order_data, $submit_action_type );
ob_start();
echo wp_kses($render, formipay_thankyoupage_allowed_html());
$content = ob_get_contents();
ob_get_clean();
return $content;
}
public function add_payment_in_process_data($order_data, $form_id) {
$payment = explode(':::', $order_data['payment']);
$payment_gateway = $payment[0];
$order_data['payment_gateway'] = $payment_gateway;
return $order_data;
}
public function set_endpoint() {
add_rewrite_rule(
'^payment-confirm/([^/]*)/([^/]*)/?',
'index.php?formipay-payment-confirm=1&gateway=$matches[1]&formipay-token=$matches[2]',
'top'
);
flush_rewrite_rules();
}
public function set_query_vars($vars){
$vars[] = 'formipay-payment-confirm';
$vars[] = 'gateway';
$vars[] = 'formipay-token';
return $vars;
}
public function frontend_enqueue() {
global $wp_query;
if(
is_array($wp_query->query) &&
array_key_exists('formipay-payment-confirm', $wp_query->query) &&
true === boolval($wp_query->query['formipay-payment-confirm'])
) :
wp_enqueue_style( 'formipay-payment-confirm', FORMIPAY_URL . 'public/assets/css/payment-confirm.css', [], FORMIPAY_VERSION, 'all' );
wp_enqueue_script( 'formipay-payment-confirm', FORMIPAY_URL . 'public/assets/js/payment-confirm.js', ['jquery'], FORMIPAY_VERSION, true );
endif;
}
public function payment_confirm_page_title($title) {
global $wp_query;
if(
is_array($wp_query->query) &&
array_key_exists('formipay-payment-confirm', $wp_query->query) &&
true === boolval($wp_query->query['formipay-payment-confirm'])
) :
$gateway = $wp_query->query['gateway'];
$gateway = strlen($gateway) > 3 ? ucwords( str_replace('_', ' ', $gateway) ) : strtoupper($gateway);
$title = $gateway . ' Confirmation' . ' - ' . get_bloginfo('name');
endif;
return $title;
}
}