FileMaster
Search
Toggle Dark Mode
Home
/
.
/
wp-content
/
plugins
/
wp-parsidate
/
includes
/
plugins
/
wc-gateways
Edit File: wpp-melli-gateway.php
<?php defined('ABSPATH') or exit('No direct script access allowed'); if (!function_exists('wpp_melli_payment_gateway_init')) { function wpp_melli_payment_gateway_init() { if (!class_exists('WPP_WC_Melli_Gateway') && !class_exists('WPP_WC_Melli_Gateway')) { /** * WPP_WC_Melli_Gateway class to add Melli Bank payment gateway to WooCommerce * * @package WP-Parsidate * @subpackage Plugins/WooCommerce/PaymentGateways * @since 5.0.0 */ class WPP_WC_Melli_Gateway extends WC_Payment_Gateway { private $gateway_name; public $terminal_id; public $merchant_id; public $key; public $title; public $description; public $failed_massage; public function __construct() { $this->id = 'melli'; $this->gateway_name = __('Melli Bank', 'wp-parsidate'); $this->method_title = $this->gateway_name; $this->method_description = $this->gateway_name . ' ' . __('payment gateway (By WP-Parsidate)', 'wp-parsidate'); $this->has_fields = true; $this->icon = apply_filters($this->id . '_logo', WP_PARSI_URL . "assets/images/$this->id-logo.png"); $this->init_form_fields(); $this->init_settings(); $this->terminal_id = $this->get_option('terminal_id'); $this->merchant_id = $this->get_option('merchant_id'); $this->key = $this->get_option('key'); $this->title = $this->get_option('title'); $this->description = $this->get_option('description'); $this->failed_massage = $this->get_option('failed_massage'); // Save Admin Option add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options')); // Handle Request add_action('woocommerce_api_' . $this->get_class(), array($this, 'handle_gateway_response')); } public function get_class() { return strtolower(get_class($this)); } public function init_form_fields() { $this->form_fields = apply_filters('wpp_wc_' . $this->id . '_gateway_config', array( 'enabled' => array( 'title' => __('Enabled/Disabled', 'wp-parsidate'), 'type' => 'checkbox', /* translators: %s: Bank name */ 'label' => sprintf(__('Activate or deactivate %s gateway', 'wp-parsidate'), $this->gateway_name), 'default' => 'no', 'description' => ($this->is_enable_open_ssl() === false ? '<span style="color: red;">توجه: جهت فعال سازی درگاه می بایست ماژول OpenSSL در تنظیمات PHP هاست شما فعال باشد</span>' : ''), ), 'terminal_id' => array( 'title' => __('Terminal No.', 'wp-parsidate'), 'type' => 'text', 'default' => '', 'desc_tip' => false ), 'merchant_id' => array( 'title' => __('Merchant ID', 'wp-parsidate'), 'type' => 'text', 'default' => '', 'desc_tip' => false ), 'key' => array( 'title' => __('Gateway Key', 'wp-parsidate'), 'type' => 'text', 'default' => '', 'desc_tip' => false ), 'title' => array( 'title' => __('Gateway title', 'wp-parsidate'), 'type' => 'text', 'description' => __('This name is displayed to the customer during the purchase process', 'wp-parsidate'), 'default' => $this->gateway_name ), 'description' => array( 'title' => __('Gateway description', 'wp-parsidate'), 'type' => 'textarea', 'description' => __('The description that will be displayed during the purchase process for the gateway', 'wp-parsidate'), /* translators: %s: Bank name */ 'default' => sprintf(__("Secure payment by all Shetab's cards through %s", 'wp-parsidate'), $this->gateway_name) ), 'failed_massage' => array( 'title' => __('Payment failed message', 'wp-parsidate'), 'type' => 'textarea', 'description' => __('Enter the text of the message you want to display to the user after an unsuccessful payment.', 'wp-parsidate'), 'default' => __('Your payment has failed. Please try again or contact us in case of problems.', 'wp-parsidate') ) ) ); } public function get_icon() { $icon = $this->icon ? '<img src="' . esc_url(WC_HTTPS::force_https_url($this->icon)) . '" alt="' . esc_attr($this->get_title()) . '" />' : ''; return apply_filters('woocommerce_gateway_icon', $icon, $this->id); } public function is_available() { return parent::is_available(); } public function encrypt_pkcs7($str, $key): string { $key = base64_decode($key); $ciphertext = OpenSSL_encrypt($str, "DES-EDE3", $key, OPENSSL_RAW_DATA); return base64_encode($ciphertext); } public function api($url, $data = false) { try { $args = array( 'headers' => array( 'Content-Type' => 'application/json; charset=utf-8', ), 'timeout' => 20, 'sslverify' => false ); if ($data) { $args['body'] = json_encode($data); } $response = wp_remote_post($url, $args); if (is_wp_error($response)) { return false; } $body = wp_remote_retrieve_body($response); return !empty($body) ? json_decode($body) : false; } catch (Exception $ex) { return false; } } public function is_enable_open_ssl(): bool { return (extension_loaded('openssl') and function_exists('OpenSSL_encrypt')); } public function process_payment($order_id) { // Get Order $order = wc_get_order($order_id); // Get Gateway RefId $refId = $this->get_ref_id_from_melli($order); // Action do_action('wpp_wc_' . $this->id . '_gateway_process_payment', $order, $refId); if ($refId['status'] === false) { // setup Error Text $errorText = 'خطا در اتصال به درگاه پرداخت: ' . $refId['message']; // Add Notice wc_add_notice($errorText, 'error'); // Return for Block Support return [ 'result' => 'failure', 'messages' => $refId['message'], 'reload' => false ]; } // Return return [ 'result' => 'success', 'redirect' => $refId['redirect'] ]; } public function get_ref_id_from_melli($order): array { $Amount = $this->get_amount($order); $OrderId = $order->get_id(); $LocalDateTime = date("m/d/Y g:i:s a"); $TerminalId = $this->terminal_id; $key = $this->key; $SignData = $this->encrypt_pkcs7("$TerminalId;$OrderId;$Amount", "$key"); $data = apply_filters('wpp_wc_' . $this->id . '_gateway_request_payment', array( 'TerminalId' => $this->terminal_id, 'MerchantId' => $this->merchant_id, 'Amount' => $this->get_amount($order), 'SignData' => $SignData, 'ReturnUrl' => add_query_arg( array( 'wc-api' => $this->get_class(), 'order_id' => $order->get_id() ), get_site_url(null, '/') ), 'LocalDateTime' => $LocalDateTime, 'OrderId' => $OrderId )); $result = $this->api('https://sadad.shaparak.ir/vpg/api/v0/Request/PaymentRequest', $data); if ($result->ResCode == 0) { return [ 'status' => true, 'token' => $result->Token, 'redirect' => "https://sadad.shaparak.ir/VPG/Purchase?Token=" . $result->Token ]; } return [ 'status' => false, 'message' => $result->Description ]; } public function handle_gateway_response() { $action = $_GET['action'] ?? ''; $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0; $order = wc_get_order($order_id); switch ($action) { case 'redirect': $this->redirect_to_gateway($order); break; default: $this->verify_payment($order); break; } } public function redirect_to_gateway($order) { // Don't Need } public function verify_payment($order) { $OrderId = $_POST["OrderId"] ?? ''; $Token = $_POST["token"] ?? ''; $ResCode = $_POST["ResCode"] ?? ''; if ($ResCode == 0) { $verifyData = [ 'Token' => $Token, 'SignData' => $this->encrypt_pkcs7($Token, $this->key) ]; $result = $this->api('https://sadad.shaparak.ir/vpg/api/v0/Advice/Verify', $verifyData); if ($result->ResCode != -1 && $result->ResCode == 0) { // Set Payment Completed $order->payment_complete($result->RetrivalRefNo); // Add Order Note $order->add_order_note(sprintf('پرداخت با موفقیت انجام شد. کد پیگیری: %s', $result->RetrivalRefNo)); // Remove cart. WC()->cart->empty_cart(); // Action do_action('wpp_wc_' . $this->id . '_gateway_completed_payment', $order, [ 'RetrivalRefNo' => $result->RetrivalRefNo, 'SystemTraceNo' => $result->SystemTraceNo, 'OrderId' => $result->OrderId, ]); // Redirect wp_redirect($this->get_return_url($order)); exit; } } $this->set_failed_payment($order); } public function get_amount($order) { $currency = $order->get_currency(); $order_total = $order->get_total(); $amount = intval($order_total); $currency = strtolower($currency); if (in_array($currency, array( 'irt', 'toman', 'iran toman', 'iranian toman', 'iran-toman', 'iran_toman', 'تومان', 'تومان ایران' ))) { $amount = $amount * 10; } else if ('irht' === $currency) { $amount = $amount * 1000 * 10; } else if ('irhr' === $currency) { $amount = $amount * 1000; } return $amount; } public function set_failed_payment($order) { wc_add_notice($this->failed_massage, 'error'); do_action('wpp_wc_' . $this->id . '_gateway_failed_payment', $order); wp_redirect(wc_get_checkout_url()); exit; } } } } add_action('before_woocommerce_init', 'wpp_melli_payment_gateway_init', 15); }
Save
Back