class_exists('WooCommerce'), 'OpenSSL' => extension_loaded('openssl') ]; foreach ($dependencies as $name => $satisfied) { if (!$satisfied) { add_action('admin_notices', function() use ($name) { ahapaybuynowpaylater_admin_missing_notice($name); }); deactivate_plugins(plugin_basename(__FILE__)); return false; } } return true; } /** * Add AhaPay gateway class to WooCommerce * * @param array $gateways List of payment gateways * @return array Modified list of payment gateways */ function ahapaybuynowpaylater_add_gateway_class($gateways) { // Register the new gateway class name; legacy name remains available via class_alias for backward compatibility. $gateways[] = 'Ahapaybuynowpaylater_WC_Gateway'; return $gateways; } /** * Initialize the AhaPay callback handler */ function ahapaybuynowpaylater_init_callback_handler() { new Ahapaybuynowpaylater_Callback_Handler(); } /** * Declare compatibility with WooCommerce blocks */ function ahapaybuynowpaylater_declare_blocks_compatibility() { if (class_exists(FeaturesUtil::class)) { FeaturesUtil::declare_compatibility('cart_checkout_blocks', __FILE__, true); } } /** * Add blocks payment data * * @param array $data Payment method data * @param string $payment_method Payment method name * @return array Modified payment method data */ function ahapaybuynowpaylater_add_blocks_payment_data($data, $payment_method) { if ($payment_method === 'ahapaybuynowpaylater') { $support = new Ahapaybuynowpaylater_WC_Blocks_Support(); $support->initialize(); $data['ahapay_data'] = $support->get_payment_method_data(); } return $data; } /** * Enqueue block styles */ function ahapaybuynowpaylater_enqueue_block_styles() { wp_enqueue_style( 'ahapaybuynowpaylater-block-style', AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/css/ahapaybuynowpaylater-block-style.css', [], AHAPAYBUYNOWPAYLATER_VERSION );} /** * Enqueue block data */ function ahapaybuynowpaylater_enqueue_block_data() { // Ensure the block script is registered using the build asset if available if (!wp_script_is('ahapaybuynowpaylater-block', 'registered')) { $asset_path = AHAPAYBUYNOWPAYLATER_PLUGIN_DIR . 'assets/blocks/index.asset.php'; if (file_exists($asset_path)) { $asset = require $asset_path; $deps = isset($asset['dependencies']) ? $asset['dependencies'] : array(); $ver = isset($asset['version']) ? $asset['version'] : filemtime(AHAPAYBUYNOWPAYLATER_PLUGIN_DIR . 'assets/blocks/index.js'); wp_register_script( 'ahapaybuynowpaylater-block', AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/blocks/index.js', $deps, $ver, true ); // Ensure module type if the build expects it wp_script_add_data('ahapaybuynowpaylater-block', 'type', 'module'); } } wp_localize_script('ahapaybuynowpaylater-block', 'ahapaybuynowpaylater_data', [ 'logoUrl' => AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/images/ahapay-logo.png', ]); wp_enqueue_script('ahapaybuynowpaylater-block'); } // ===================== // 7. Frontend Scripts and Styles // ===================== /** * Enqueue frontend scripts */ function ahapaybuynowpaylater_enqueue_scripts() { wp_enqueue_script('jquery'); // Ensure jQuery is loaded if (is_product() || is_shop()) { wp_add_inline_script('jquery', " document.addEventListener('DOMContentLoaded', function () { const badges = document.querySelectorAll('.custom-overlay-badge'); badges.forEach(badge => { const context = badge.dataset.pageContext; if (context === 'shop') { const productCard = badge.closest('li.wc-block-product'); const imageWrapper = productCard?.querySelector('.wc-block-components-product-image'); if (imageWrapper && !imageWrapper.contains(badge)) { imageWrapper.appendChild(badge); } } else if (context === 'single') { const imageWrapper = document.querySelector('.woocommerce-product-gallery'); const saleBadge = imageWrapper?.querySelector('.onsale'); if (imageWrapper && !imageWrapper.contains(badge)) { if (saleBadge && saleBadge.parentElement === imageWrapper) { saleBadge.insertAdjacentElement('afterend', badge); } else { imageWrapper.appendChild(badge); } } } }); }); "); } } /** * Enqueue frontend styles */ function ahapaybuynowpaylater_enqueue_styles() { wp_enqueue_style('ahapay-label-style', AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/css/ahapay-label.css', [], '1.0.0'); // Add dynamic inline styles for product labels $settings = get_option('woocommerce_ahapaybuynowpaylater_settings'); if (isset($settings['enabled']) && $settings['enabled'] === 'yes' && isset($settings['enable_product_label']) && $settings['enable_product_label'] === 'yes') { $bg_color = $settings['product_label_color'] ?? '#fc642d'; $text_color = $settings['product_label_text_color'] ?? '#ffffff'; $custom_css = sprintf( '.ahapay-bottom-banner { background-color: %s; color: %s; }', esc_attr($bg_color), esc_attr($text_color) ); wp_add_inline_style('ahapay-label-style', $custom_css); } } /** * Enqueue minimum amount check script on checkout */ function ahapaybuynowpaylater_enqueue_minimum_check_script() { wp_enqueue_script('jquery'); // Ensure jQuery is loaded // Get the gateway settings $settings = get_option('woocommerce_ahapaybuynowpaylater_settings'); $minimum_amount = isset($settings['minimum_amount']) ? floatval($settings['minimum_amount']) : 55; $disabled = WC()->cart->total < $minimum_amount; wp_enqueue_script( 'ahapay-minimum-check', AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/js/ahapay-minimum-check.js', ['jquery', 'wc-checkout'], AHAPAYBUYNOWPAYLATER_VERSION, true ); // Pass data to script wp_localize_script('ahapay-minimum-check', 'ahapay_data_minimum', [ 'disabled_message' => __('AhaPay is not available for orders below RM 55', 'ahapay-buy-now-pay-later'), 'disabled' => $disabled, ]); } /** * Enqueue styles and scripts for the product modal */ function ahapaybuynowpaylater_enqueue_modal_assets() { wp_enqueue_script('jquery'); // Ensure jQuery is loaded wp_enqueue_style('ahapay-modal-styles', AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/css/modal.css', [], '1.0.0'); wp_enqueue_script('ahapay-modal-script', AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/js/modal.js', ['jquery'], '1.0.0', true); } // ===================== // 8. Admin Scripts and Functions // ===================== /** * Enqueue admin scripts * * @param string $hook Current admin page hook */ function ahapaybuynowpaylater_admin_enqueue_scripts($hook) { wp_enqueue_script('jquery'); // Ensure jQuery is loaded if ($hook === 'woocommerce_page_wc-settings' && isset($_GET['tab'], $_GET['section']) && $_GET['tab'] === 'checkout' && $_GET['section'] === 'ahapaybuynowpaylater') { wp_add_inline_script('jquery', ' document.addEventListener("DOMContentLoaded",function(){const input=document.getElementById("woocommerce_ahapaybuynowpaylater_api_key");input.addEventListener("focus",()=>{input.type="text";});input.addEventListener("blur",()=>{input.type="password";});}); '); } // Load only on the WooCommerce order edit page if ($hook !== 'woocommerce_page_wc-orders') return; wp_enqueue_script('ahapaybuynowpaylater-admin-api', AHAPAYBUYNOWPAYLATER_PLUGIN_URL . 'assets/js/ahapay-admin-api.js', ['jquery'], AHAPAYBUYNOWPAYLATER_VERSION, true); wp_localize_script('ahapaybuynowpaylater-admin-api', 'ahapaybuynowpaylater_api_data', [ 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('ahapaybuynowpaylater_api_nonce'), ]); $custom_css = " #ahapay-api-response { margin-top: 12px; padding: 10px 14px; font-weight: 500; border-radius: 4px; display: inline-block; max-width: 100%; } .ahapay-success { background-color: #d1e7dd; color: #0f5132; border: 1px solid #badbcc; } .ahapay-error { background-color: #f8d7da; color: #842029; border: 1px solid #f5c2c7; } "; wp_add_inline_style('woocommerce_admin_styles', $custom_css); } /** * Add settings link on plugins page * * @param array $links Plugin action links * @return array Modified plugin action links */ function ahapaybuynowpaylater_add_plugin_page_settings_link($links) { $settings_link = '' . __('Settings', 'ahapay-buy-now-pay-later') . ''; array_unshift($links, $settings_link); return $links; } /** * Add button to check order status in admin order details * * @param WC_Order $order The order object */ function ahapaybuynowpaylater_add_check_order_status_button($order) { if (!$order || $order->get_payment_method() !== 'ahapaybuynowpaylater') { return; } $order_id = $order->get_id(); ?>
AhaPay Payment Gateway requires ' . esc_html($reason) . ' to be installed and active. The plugin has been deactivated.
'; } // ===================== // 9. AJAX and REST API Handlers // ===================== /** * Handle AJAX call to AhaPay API */ function ahapaybuynowpaylater_handle_api_call() { check_ajax_referer('ahapaybuynowpaylater_api_nonce', 'nonce'); $order_id = isset($_POST['order_id']) ? intval($_POST['order_id']) : ''; $order = wc_get_order($order_id); if (!$order) { wp_send_json_error(['message' => 'Invalid order ID']); } $gateway = new Ahapaybuynowpaylater_WC_Gateway(); $apiKey = $gateway->get_option('api_key'); $base_url = $gateway->get_option("environment") === 'sandbox' ? AHAPAYBUYNOWPAYLATER_SANDBOX_BASE_URL : AHAPAYBUYNOWPAYLATER_LIVE_BASE_URL; $transaction_id = get_post_meta($order_id, '_ahapaybuynowpaylater_order_id', true); // API call for order status $response = wp_remote_get($base_url . '/v1/orders/' . $transaction_id . '/status', [ 'headers' => ['Content-Type' => 'application/json', 'X-ApiKey' => $apiKey], 'timeout' => 15, ]); if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) { wp_send_json_error(['message' => 'API error']); } $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); if (!(new Ahapaybuynowpaylater_Status_Handler($gateway))->handle_status($order, $data['data']['online_order_status'], $transaction_id)) { wp_send_json_error(['message' => 'Error handling status']); } wp_send_json_success(['message' => 'API call succeeded! Refreshing page...', 'refresh' => true]); } /** * Send error response with message and status code * * @param string $message Error message * @param int $status_code HTTP status code * @return WP_REST_Response */ function ahapaybuynowpaylater_send_error_response($message, $status_code) { return wp_send_json([ 'success' => false, 'message' => $message ], $status_code); } /** * Send success response with order details * * @param WC_Order $order Order object * @param int $order_id Order ID * @return WP_REST_Response */ function ahapaybuynowpaylater_send_success_response($order, $order_id) { return wp_send_json([ 'success' => true, 'order_id' => $order_id, 'status' => $order->get_status(), 'is_paid' => $order->is_paid(), 'payment_method' => $order->get_payment_method() ]); } // Register REST API endpoints add_action('rest_api_init', function() { register_rest_route('ahapaybuynowpaylater/v1', '/check-order-status/(?P