From f087396785ae68fbdf993945cd563f2ee36391ec Mon Sep 17 00:00:00 2001 From: Wajih Date: Wed, 6 Dec 2023 16:16:41 +0400 Subject: [PATCH] Valu widget (#65) * Add valU widget valU widget display inside product details page. Set the widget location inside the product summary * Use higher resolution icon for valU * SDK core update --- icons/valu.png | Bin 1802 -> 5183 bytes icons/valu_long.png | Bin 0 -> 39835 bytes includes/_valu_widget.php | 18 +++++ includes/paytabs_core.php | 23 +++++- includes/paytabs_gateways.php | 48 ++++++++++-- includes/paytabs_payment_methods.php | 7 +- includes/widgets/valu.php | 113 +++++++++++++++++++++++++++ paytabs-woocommerce.php | 19 ++++- 8 files changed, 215 insertions(+), 13 deletions(-) create mode 100644 icons/valu_long.png create mode 100644 includes/_valu_widget.php create mode 100644 includes/widgets/valu.php diff --git a/icons/valu.png b/icons/valu.png index aa4f161e32245bb53d7c9877f17aceaddceb8876..577e006c069f4cc4961eedb836ded6767c9532d4 100644 GIT binary patch literal 5183 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 literal 1802 zcmZ{lc`)0H7RP_8Z4g>J6;-!wV%H>Ui?o(fp+u=lV`*c_ReHsih`r^a4br}eM604) zil!H}wy1cQT8doiRZ%=kti>gkBBi`^-pqS5Z|2RJbG|d*GoShXcMk0;)?P+RO$q=2 z83&B5n@Dv;ttxR;Gy^XW?2AOxALHf>0I@ItxR(L|-$d5E1puJH0br2;0H`Mbpc2Mz zbVZ96NByqY+X4qas(@RXC2}OgF!)FSFg)|4#iENXqeLc%?BHw%nwJDgA3DC*;sXVM zBcB{>t=%!5c|$>EKG&5%f{BasQI!U(6vB)4^yf;4+tbVITEyhsN@Zn~JKYO0h_-u( z;9vY6{FcU7JujzgLWg-Iqcc*U@MZn%40>6w{b(UN7%zRotvg?)zmC^@uN+Fa6yqAR z)YCxC=Wcylt=qq2#<}|${h@%*B}^~wJ|Sk--N;mhcejt>c-n{=Jw+?^o) zK98W`MLjg0{AYaZ=-&RwgII+l80z6a@Yb}le6C8)cY>dv*yFPZYMS9&FJ=Ah%Z zuzyIGy&ubdlBaqox+f_+O=(BD7yQp6u?mGo9B~jfceZvhc;P6`XP7n=coB~<-Y{=c zKVA~%h^qZ%d`TeAYmtk$AW;?Pr%_GFUT#nXakfULVeeK-9Nfb2^)bt~DY-_l&9lOJi7*X{NYBUs*0|sis4STt3!4)JW^L;#MYrZ!2*)LIq25ne$dp+ z4!0EhjMP14w=PSKnrZEmG&3H@wwLXEmw2Y;)>S0EBH{9=_N!TQ=1r%z>IWEH)bz@G zT9QYYb)io&)4~~B51i|OL6b((bm<BWz$BLcy$XwMz{2vZ#C(gu zWJNCpFC>l+XmAudAzr`FsJYYbH-gk#z;OS{uB`r715G(*HQ1N1IMv;E7C2m&H#=1& zjcfVoNJj=UTjC&do>%#?t>Fw2pjzoc^Vpwgyhrw=m$q-E#I-uhH6GTb<}ELmFzLoq zf8uXcY*L3A_1tUmweB21T+YUkp5i||WQ^v94r!08_u)g!C@}+vjXifRDEndOu1kfR zPBDN)=REJnHMx<9eP6bQRpN;RVLvLSh*4a5fdzvb*PI>PDs}Tr3%D!|Ik;2a>cZU2 zPoaLrk{mXDBylV~7yL)EyNz7%_V;uQy zJp*aOzfRpg*9CpsTp*xGk$6M^pXq-AM(P|d35&231iP}Uequ!+<#0OXp|X&t-i%G5 zquyienh#XJltAl)kSRPc}&3@7x3W(D5I&FgY0&5Qd+5=?tD zwUm}2ELX~1->{}6KYzC-`N5hWF($9^-ZA@C1!Lko-smUJ$mdPLZOHcqrgC>Z6EKo!P^5b@HCHpt1TF z$q$b|ty`-)01rITv_C|54GcfOeyN)z+*SxfxTtTPRos5#cOE-?)-O7YaMq0H_5jPq&XV=*@aD?O+ zn_{ptnBbz@9v{hXc3|a+)5lJhcl5L<%v#nXk9Auu_q2#^K9p>CgB;*XCZhZ!h#~=y zaHNp|+}r?e>W)C7;0TlvTn`RM!Qtsv**~7le}RzDfS{ja{y(sL((tkf(Ed*XIVgk} fN%jp1`(Fl$LKy!$1b3QkC1L;vJFIPm4I%kosoX?S diff --git a/icons/valu_long.png b/icons/valu_long.png new file mode 100644 index 0000000000000000000000000000000000000000..5a330f62873a78f2f96514d268bcf76385583824 GIT binary patch literal 39835 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 + +?> + +
+ + + + + +
+ valU logo + + +
+
\ No newline at end of file diff --git a/includes/paytabs_core.php b/includes/paytabs_core.php index 0caac1e..d1e5ed1 100755 --- a/includes/paytabs_core.php +++ b/includes/paytabs_core.php @@ -2,11 +2,11 @@ /** * PayTabs v2 PHP SDK - * Version: 2.15.0 + * Version: 2.17.0 * PHP >= 7.0.0 */ -define('PAYTABS_SDK_VERSION', '2.15.0'); +define('PAYTABS_SDK_VERSION', '2.17.0'); define('PAYTABS_DEBUG_FILE_NAME', 'debug_paytabs.log'); define('PAYTABS_DEBUG_SEVERITY', ['Info', 'Warning', 'Error']); @@ -1049,6 +1049,7 @@ class PaytabsApi '23' => ['name' => 'forsa', 'title' => 'PayTabs - Forsa', 'currencies' => ['EGP'], 'groups' => [PaytabsApi::GROUP_IFRAME]], '24' => ['name' => 'tabby', 'title' => 'PayTabs - Tabby', 'currencies' => ['AED'], 'groups' => []], '25' => ['name' => 'souhoola', 'title' => 'PayTabs - Souhoola', 'currencies' => ['EGP'], 'groups' => [PaytabsApi::GROUP_IFRAME, PaytabsApi::GROUP_REFUND]], + '26' => ['name' => 'amaninstallments', 'title' => 'PayTabs - Aman installments', 'currencies' => ['EGP'], 'groups' => [PaytabsApi::GROUP_IFRAME, PaytabsApi::GROUP_REFUND]], ]; @@ -1097,6 +1098,8 @@ class PaytabsApi const URL_TOKEN_QUERY = 'payment/token'; const URL_TOKEN_DELETE = 'payment/token/delete'; + const URL_INQUIRY_VALU = 'payment/info/valu/inquiry'; + // private $base_url; @@ -1201,6 +1204,22 @@ function token_delete($token) return $res; } + function inqiry_valu($params) + { + $res1 = $this->sendRequest(self::URL_INQUIRY_VALU, $params); + + $res = json_decode($res1); + + $res->success = false; + + if (isset($res->valuResponse, $res->valuResponse->responseCode)) { + if ($res->valuResponse->responseCode == 0) { + $res->success = true; + } + } + + return $res; + } // function is_valid_redirect($post_values) diff --git a/includes/paytabs_gateways.php b/includes/paytabs_gateways.php index 8e3127d..e8f9d5d 100644 --- a/includes/paytabs_gateways.php +++ b/includes/paytabs_gateways.php @@ -100,13 +100,47 @@ public function init_form_fields() { parent::init_form_fields(); - $this->form_fields['valu_product_id'] = array( - 'title' => __('valU product ID', 'PayTabs'), - 'type' => 'text', - 'description' => __('Please enter the product ID of your valU account.', 'PayTabs'), - 'default' => '', - 'required' => true - ); + $this->form_fields['valu_widget_enable'] = [ + 'title' => __('ValU widget', 'PayTabs'), + 'label' => __('Enable ValU widget.', 'PayTabs'), + 'description' => __('Show valU widget in product\'s details page.', 'PayTabs'), + 'type' => 'checkbox', + 'default' => 'no' + ]; + $this->form_fields['valu_widget_static_content'] = [ + 'title' => __('ValU widget, Static content', 'PayTabs'), + 'type' => 'checkbox', + 'label' => __('ValU widget, Static content.', 'PayTabs'), + 'description' => __('Display the static content in the widget, Otherwise call the API to fetch live content based on the price.', 'PayTabs'), + 'default' => 'no' + ]; + $this->form_fields['valu_widget_phone_number'] = [ + 'title' => __('ValU phone number', 'PayTabs'), + 'type' => 'text', + 'description' => __('Registered valU phone number.', 'PayTabs'), + 'default' => '', + 'desc_tip' => true, + ]; + $this->form_fields['valu_widget_price_threshold'] = [ + 'title' => __('ValU price threshold', 'PayTabs'), + 'type' => 'text', + 'description' => __('Display The widget if the product price higher than the current thershold.', 'PayTabs'), + 'default' => '1000', + 'desc_tip' => true, + ]; + } + + public function getIconWidget() + { + $icon_name = 'valu_long.png'; + + $iconPath = PAYTABS_PAYPAGE_DIR . "icons/{$icon_name}"; + $icon = ''; + if (file_exists($iconPath)) { + $icon = PAYTABS_PAYPAGE_ICONS_URL . "{$icon_name}"; + } + + return $icon; } } diff --git a/includes/paytabs_payment_methods.php b/includes/paytabs_payment_methods.php index 975751c..aa5d1cb 100755 --- a/includes/paytabs_payment_methods.php +++ b/includes/paytabs_payment_methods.php @@ -98,7 +98,11 @@ public function __construct() if ($this->_code == 'valu') { - $this->valu_product_id = $this->get_option('valu_product_id'); + //$this->valu_product_id = $this->get_option('valu_product_id'); + $this->valu_widget_enable = $this->get_option('valu_widget_enable') == 'yes'; + $this->valu_widget_static_content = $this->get_option('valu_widget_static_content') == 'yes'; + $this->valu_widget_phone_number = $this->get_option('valu_widget_phone_number'); + $this->valu_widget_price_threshold = $this->get_option('valu_widget_price_threshold'); } $this->enable_tokenise = $this->get_option('enable_tokenise') == 'yes'; @@ -602,7 +606,6 @@ function receipt_page($order_id) } } - public function scheduled_subscription_payment($amount_to_charge, $renewal_order) { $user_id = $renewal_order->get_user_id(); diff --git a/includes/widgets/valu.php b/includes/widgets/valu.php new file mode 100644 index 0000000..19e670d --- /dev/null +++ b/includes/widgets/valu.php @@ -0,0 +1,113 @@ +valu_widget_enable) { + + $product_price = $this->get_product_price(); + if ($product_price) { + if ($product_price >= $valu_payment->valu_widget_price_threshold) { + + if ($valu_payment->valu_widget_static_content) { + $plan = $this->get_static_content(); + } else { + $plan = $this->call_valu_api($valu_payment, $product_price); + } + + if ($plan) { + include(PAYTABS_PAYPAGE_DIR . 'includes/_valu_widget.php'); + } + } + } + } + } + + private function get_static_content() + { + return "Buy Now & Pay Later up to 60 Months!"; + } + + private function get_product_price() + { + // Get the current product's ID. + $product_id = get_the_ID(); + $product = wc_get_product($product_id); + $product_price = 0; + + if ($product) { + // Get the product price. + $product_price = $product->get_price(); + } + + return $product_price; + } + + private function call_valu_api($valu_payment, $product_price) + { + $_paytabsApi = PaytabsApi::getInstance($valu_payment->paytabs_endpoint, $valu_payment->merchant_id, $valu_payment->merchant_key); + $phone_number = $valu_payment->valu_widget_phone_number; + + $data = [ + 'cart_amount' => $product_price, + 'cart_currency' => "EGP", + 'customer_details' => [ + "phone" => $phone_number + ], + ]; + + PaytabsHelper::log("valU inqiry, {$product_price}", 1); + $details = $_paytabsApi->inqiry_valu($data); + + if (!$details || !$details->success) { + $_err_msg = json_encode($details); + PaytabsHelper::log("valU Details error: [{$_err_msg}]", 3); + return false; + } + + $installments_count = 3; + $valu_plan = $this->getValUPlan($details, $installments_count); + + if (!$valu_plan) { + return false; + } + + try { + $installment_amount = $valu_plan->emi; + + $calculated_installment = round($product_price / $installments_count, 2); + $is_free_interest = $calculated_installment >= $installment_amount; + + $txt_free = $is_free_interest ? "interest-free" : ""; + + $msg = "Pay {$installments_count} {$txt_free} payments of EGP $installment_amount."; + + return $msg; + } catch (\Throwable $th) { + PaytabsHelper::log("valU widget error: " . $th->getMessage(), 3); + } + + return false; + } + + private function getValUPlan($details, $installments_count) + { + try { + $plansList = $details->valuResponse->productList[0]->tenureList; + foreach ($plansList as $plan) { + if ($plan->tenorMonth == $installments_count) { + return $plan; + } + } + } catch (\Throwable $th) { + PaytabsHelper::log("valU Plan error: " . $th->getMessage(), 3); + } + + $_log = json_encode($plansList); + PaytabsHelper::log("valU Plan error: No Plan selected, [{$_log}]", 2); + + return false; + } +} diff --git a/paytabs-woocommerce.php b/paytabs-woocommerce.php index 4c8f5ec..4a4c5ea 100644 --- a/paytabs-woocommerce.php +++ b/paytabs-woocommerce.php @@ -9,7 +9,7 @@ * Plugin URI: https://paytabs.com/ * Description: PayTabs is a 3rd party payment gateway. Ideal payment solutions for your internet business. - * Version: 4.20.0 + * Version: 4.21.0 * Requires PHP: 7.0 * Author: PayTabs * Author URI: integration@paytabs.com @@ -20,7 +20,7 @@ } -define('PAYTABS_PAYPAGE_VERSION', '4.20.0'); +define('PAYTABS_PAYPAGE_VERSION', '4.21.0'); define('PAYTABS_PAYPAGE_DIR', plugin_dir_path(__FILE__)); define('PAYTABS_PAYPAGE_ICONS_URL', plugins_url("icons/", __FILE__)); define('PAYTABS_PAYPAGE_IMAGES_URL', plugins_url("images/", __FILE__)); @@ -80,6 +80,7 @@ function woocommerce_paytabs_init() require_once PAYTABS_PAYPAGE_DIR . 'includes/paytabs_payment_methods.php'; require_once PAYTABS_PAYPAGE_DIR . 'includes/paytabs_gateways.php'; require_once PAYTABS_PAYPAGE_DIR . 'includes/paytabs_payment_token.php'; + require_once PAYTABS_PAYPAGE_DIR . 'includes/widgets/valu.php'; /** @@ -135,6 +136,20 @@ function paytabs_add_action_links($links) add_filter('woocommerce_payment_gateways', 'paytabs_filter_gateways', 10, 1); add_filter('woocommerce_payment_methods_list_item', 'get_account_saved_payment_methods_list_item_paytabs', 10, 2); add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'paytabs_add_action_links'); + + add_action('woocommerce_single_product_summary', 'valu_widget', 21); + + function valu_widget() + { + $enabled_gateways = WC()->payment_gateways->get_available_payment_gateways(); + + if (array_key_exists('paytabs_valu', $enabled_gateways)) { + $valu_payment = $enabled_gateways['paytabs_valu']; + + $valu_widget = new ValuWidget(); + $valu_widget->init($valu_payment); + } + } }