From 5c01cbf1632626d2e04ee167c71dabfe594d7895 Mon Sep 17 00:00:00 2001 From: Razorpay Date: Fri, 6 Dec 2024 18:06:02 +0530 Subject: [PATCH] PLUG-2874 woocommerce checkout360 --- woo-razorpay.php | 411 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 381 insertions(+), 30 deletions(-) diff --git a/woo-razorpay.php b/woo-razorpay.php index fe1e36db..25371c46 100644 --- a/woo-razorpay.php +++ b/woo-razorpay.php @@ -248,6 +248,166 @@ public function getCustomOrdercreationMessage($thank_you_title, $order) return $message; } + public function generate_multicheckbox_html($key, $data) + { + $c360FieldMapping = [ + 'enable_magic_checkout_cart_page' => 'enable_1cc', + 'enable_magic_checkout_test_mode' => 'enable_1cc_test_mode', + 'enable_magic_checkout_buy_now' => 'enable_1cc_pdp_checkout', + 'enable_magic_checkout_mini_cart' => 'enable_1cc_mini_cart_checkout', + 'enable_cod_intelligence' => 'rzp_cod_intelligence_enable', + 'enable_razorpay_trusted_business_widget' => 'rzp_rtb_enable', + 'enable_razorpay_affordability_widget' => 'rzp_afd_enable' + ]; + + $field = $this->get_field_key($key); + + $defaults = array( + 'title' => '', + 'type' => 'multicheckbox', + 'description' => '', + 'desc_tip' => false, + 'options' => array(), + ); + + $data = wp_parse_args( $data, $defaults ); + + ob_start(); + ?> + + + + + +
+ $optionLabelDesc) : ?> + plugin_id . $this->id . '_' . 'enable_magic_checkout_group') + { + $option_checked = $this->getSetting($c360FieldMapping[$optionKey]); + } + elseif (isset($c360FieldMapping[$optionKey])) + { + $option_checked = get_option($c360FieldMapping[$optionKey]); + } + ?> +
+

+ +
+ + + 'enable_1cc', + 'enable_magic_checkout_test_mode' => 'enable_1cc_test_mode', + 'enable_magic_checkout_buy_now' => 'enable_1cc_pdp_checkout', + 'enable_magic_checkout_mini_cart' => 'enable_1cc_mini_cart_checkout' + ]; + + foreach ($magicC360Mapping as $c360Field => $oneCCField) + { + if (isset($data[$this->plugin_id . $this->id . '_' . $c360Field]) === true) + { + $savedData[$oneCCField] = "yes"; + } + elseif (isset($data[$this->plugin_id . $this->id . '_' . $oneCCField]) === false) + { + $savedData[$oneCCField] = "no"; + } + } + + // For other checkout360 settings + $checkout360Settings = [ + 'enable_cod_intelligence' => 'rzp_cod_intelligence_enable', + 'enable_razorpay_trusted_business_widget' => 'rzp_rtb_enable', + 'enable_razorpay_affordability_widget' => 'rzp_afd_enable' + ]; + + foreach ($checkout360Settings as $c360Field => $c360Flag) + { + if ($c360Field === 'enable_razorpay_trusted_business_widget' and + isset($data[$this->plugin_id . $this->id . '_' . $c360Field]) === true) + { + $data = [ + "rtb_widget_enabled" => true, + ]; + $rtbEnable = $this->rzpPostInstallationCall('save', $data); + + if (isset($rtbEnable['rtb_eligibility']) === false) + { + update_option($c360Flag, "yes"); + } + else + { + echo "
+

We are sorry you are not Eligible to opt RTB.

+
"; + update_option($c360Flag, "no"); + } + } + elseif (isset($data[$this->plugin_id . $this->id . '_' . $c360Field]) === true) + { + update_option($c360Flag, "yes"); + } + elseif (isset($data[$this->plugin_id . $this->id . '_' . $c360Field]) === false) + { + update_option($c360Flag, "no"); + } + } + + return update_option($optionKey, apply_filters('woocommerce_settings_api_sanitized_fields_' . $this->id, $savedData), 'yes'); + } + + return $saved; + } + + public function rzpPostInstallationCall($event, $data = []) + { + try + { + $api = $this->getRazorpayApiInstance(); + $key_id = $this->getSetting('key_id'); + + $postInstallationPayload = [ + "event" => $event, + "mode" => (substr($key_id, 0, 8) === 'rzp_live') ? 'live' : 'test', + "data" => $data + ]; + + $result = $api->request->request('POST', 'app/woocommerce/api/woocommerce-post-installation', $postInstallationPayload); + + return $result; + } + catch (\Exception $e) + { + rzpLogError($e->getMessage()); + + return ['checkout360_status' => 'no']; + } + } + /** * @param boolean $hooks Whether or not to * setup the hooks on @@ -270,6 +430,7 @@ public function __construct($hooks = true) $is1ccAvailable = false; $isAccCreationAvailable = false; $merchantPreferences = []; + $checkout360Available = get_option('rzp_checkout360_status'); $merchantPreferences = get_transient(self::ONE_CC_MERCHANT_PREF); @@ -303,6 +464,12 @@ public function __construct($hooks = true) $isAccCreationAvailable = true; } + if (empty($checkout360Available) === true) + { + $response = $this->rzpPostInstallationCall('install'); + $checkout360Available = ($response['checkout360_status'] === true) ? 'yes' : 'no'; + update_option('rzp_checkout360_status', $checkout360Available); + } if ($is1ccAvailable) { $this->visibleSettings = array_merge($this->visibleSettings, array( @@ -324,6 +491,31 @@ public function __construct($hooks = true) )); } + if ($checkout360Available === "yes") + { + //remove 1cc fields + $magicSettingsToRemove = [ + 'enable_1cc', + 'enable_1cc_test_mode', + 'enable_1cc_pdp_checkout', + 'enable_1cc_mini_cart_checkout', + '1cc_min_cart_amount', + '1cc_min_COD_slab_amount', + '1cc_max_COD_slab_amount', + ]; + $this->visibleSettings = array_diff($this->visibleSettings, $magicSettingsToRemove); + + //add checkout 360 fields + $checkout360VisibleFields = [ + 'checkout360_header', + 'checkout360_subheader', + 'configure_checkout360', + 'enable_magic_checkout_group', + 'enable_cod_configurations_group', + 'enhance_your_checkout_group', + ]; + $this->visibleSettings = array_merge($this->visibleSettings, $checkout360VisibleFields); + } } $this->init_form_fields(); @@ -431,6 +623,80 @@ public function init_form_fields() ), ); + $checkout360Settings = array( + 'checkout360_header' => array( + 'title' => __('Upgrade to Razorpay Checkout360'), + 'type' => 'title', + ), + 'checkout360_subheader' => array( + 'title' => '

' . __('Advanced COD | Address Pre-Fills | Smart Coupons | COD Intelligence | Trust and Affordability').'

', + 'type' => 'title', + ), + 'configure_checkout360' => array( + 'title' => '' . __('Configure Checkout360 Settings').'', + 'type' => 'title', + ), + 'enable_magic_checkout_group' => array( + 'title' => __('Enable Magic Checkout'), + 'type' => 'multicheckbox', + 'label' => __('Enable Magic Checkout', $this->id), + 'options' => array( + 'enable_magic_checkout_cart_page' => array( + 'label' => __('Enable Magic Checkout', $this->id), + 'description' => __('Magic Checkout will launch when customer checkout with their cart', $this->id) + ), + 'enable_magic_checkout_buy_now' => array( + 'label' => __('Enable Magic Checkout On Buy Now Button', $this->id), + 'description' => __('Magic Checkout will launch when customer clicks on Buy Now on products page', $this->id) + ), + 'enable_magic_checkout_mini_cart' => array( + 'label' => __('Enable Magic Checkout On Mini Cart', $this->id), + 'description' => __('Magic Checkout will launch when checkout from mini cart', $this->id) + ), + 'enable_magic_checkout_test_mode' => array( + 'label' => __('Enable Magic Checkout On Test Mode', $this->id), + 'description' => __('Only logged in admin users will see Magic Checkout', $this->id) + ) + ) + ), + 'enable_cod_configurations_group' => array( + 'title' => __('Enable COD Intelligence'), + 'type' => 'multicheckbox', + 'options' => array( + 'enable_cod_intelligence' => array( + 'label' => __('Enable COD Intelligence', $this->id), + 'description' => __('Set up rules on Razorpay Dashboard to show/hide and charge for COD orders', $this->id) + ), + 'enable_cod_configuratiopn' => array( + 'label' => __('Set-up smart COD rules & RTO Prediction here', $this->id), + 'description' => __("Use Razorpay's RTO intelligence to block COD for high risk users", $this->id), + 'link' => 'http://dashboard.razorpay.com/magic' + ) + ) + ), + 'enhance_your_checkout_group' => array( + 'title' => __('Enhance Your Checkout'), + 'type' => 'multicheckbox', + 'options' => array( + 'enable_razorpay_trusted_business_widget' => array( + 'label' => __('Enable Razorpay Trusted Business Widget', $this->id), + 'description' => __('', $this->id) + ), + 'enable_razorpay_affordability_widget' => array( + 'label' => __('Enable Razorpay Affordability Widget', $this->id), + 'description' => __('', $this->id) + ), + 'enable_giftcards_coupons' => array( + 'label' => __('Set-up gift cards and coupons here', $this->id), + 'description' => __("", $this->id), + 'link' => 'http://dashboard.razorpay.com/magic' + ) + ) + ) + ); + + $defaultFormFields = array_merge( $defaultFormFields, $checkout360Settings ); + do_action_ref_array( 'setup_extra_setting_fields', array( &$defaultFormFields ) ); foreach ($defaultFormFields as $key => $value) @@ -446,6 +712,8 @@ public function init_form_fields() { try { + $checkout360status = (get_option('rzp_checkout360_status') === 'yes') ? true : false; + if (isset($_POST['woocommerce_razorpay_key_id']) and empty($_POST['woocommerce_razorpay_key_id']) === false and isset($_POST['woocommerce_razorpay_key_secret']) and @@ -467,8 +735,11 @@ public function init_form_fields() throw new Exception("Error in Api call."); } - update_option('rzp_afd_enable', 'no'); - update_option('rzp_rtb_enable', 'no'); + if ($checkout360status === false) + { + update_option('rzp_afd_enable', 'no'); + update_option('rzp_rtb_enable', 'no'); + } foreach ($merchantPreferences['assigned_features'] as $preference) { @@ -478,33 +749,39 @@ public function init_form_fields() add_action('woocommerce_sections_checkout', 'addSubSection'); add_action('woocommerce_settings_tabs_checkout', 'displayAffordabilityWidgetSettings'); add_action('woocommerce_update_options_checkout', 'updateAffordabilityWidgetSettings'); - update_option('rzp_afd_enable', 'yes'); + if ($checkout360status === false) + { + update_option('rzp_afd_enable', 'yes'); + } break; } } - $rtbActivationStatus = $api->request->request('GET', 'rtb?key_id=' . $key_id); - - if (isset($rtbActivationStatus['widget_enabled']) and - $rtbActivationStatus['widget_enabled'] === true) + if ($checkout360status === false) { - $this->form_fields['rtb_widget_title'] = array( - 'title' => '' . __('Razorpay Trusted Business'). '', - 'type' => 'title' - ); - - $this->form_fields['enable_rtb_widget'] = array( - 'title' => __('RTB Widget Enable/Disable'), - 'type' => 'checkbox', - 'desc' => __('Enable RTB Widget?'), - 'default' => 'no', - 'id' => 'rzp_rtb_enable' - ); - update_option('rzp_rtb_enable', 'yes'); - } + $rtbActivationStatus = $api->request->request('GET', 'rtb?key_id=' . $key_id); - update_option('rzp_afd_feature_checked', 'yes'); - update_option('rzp_rtb_feature_checked', 'yes'); + if (isset($rtbActivationStatus['widget_enabled']) and + $rtbActivationStatus['widget_enabled'] === true) + { + $this->form_fields['rtb_widget_title'] = array( + 'title' => '' . __('Razorpay Trusted Business'). '', + 'type' => 'title' + ); + + $this->form_fields['enable_rtb_widget'] = array( + 'title' => __('RTB Widget Enable/Disable'), + 'type' => 'checkbox', + 'desc' => __('Enable RTB Widget?'), + 'default' => 'no', + 'id' => 'rzp_rtb_enable' + ); + update_option('rzp_rtb_enable', 'yes'); + } + + update_option('rzp_afd_feature_checked', 'yes'); + update_option('rzp_rtb_feature_checked', 'yes'); + } } catch (\Exception $e) { @@ -535,6 +812,43 @@ protected function triggerValidationInstrumentation($data) $trackObject->rzpTrackDataLake('formfield.validation.error', $properties); } + public function autoPostInstallationCheck() + { + $response = $this->rzpPostInstallationCall('evaluate'); + + $checkout360Available = ($response['checkout360_status'] === true) ? 'yes' : 'no'; + + update_option('rzp_checkout360_status', $checkout360Available); + + // remove all checkou360 settings + if ($response['merchant_status'] === 'existing_checkout360_merchant' and + $checkout360Available === 'no') + { + $checkout360Fields = [ + 'enable_1cc', + 'enable_1cc_test_mode', + 'enable_1cc_pdp_checkout', + 'enable_1cc_mini_cart_checkout', + 'rzp_cod_intelligence_enable' + ]; + $optionKey = parent::get_option_key(); + $savedData = get_option($optionKey); + + foreach ($checkout360Fields as $field) + { + if ($field === 'rzp_cod_intelligence_enable')) + { + delete_option($field); + } + else + { + $savedData[$field] = 'no'; + } + } + update_option($optionKey, apply_filters('woocommerce_settings_api_sanitized_fields_' . $this->id, $savedData), 'yes'); + } + } + public function autoEnableWebhook() { $webhookExist = false; @@ -1152,6 +1466,12 @@ public function getDefaultCheckoutArguments($order) $productinfo = "Order $orderId"; + $hidePaymentMethods = []; + if (get_option('enable_cod_intelligence') === 'yes') + { + $hidePaymentMethods['method'] = "cod"; + } + return array( 'key' => $this->getSetting('key_id'), 'name' => html_entity_decode(get_bloginfo('name'), ENT_QUOTES), @@ -1163,7 +1483,14 @@ public function getDefaultCheckoutArguments($order) ), 'order_id' => $razorpayOrderId, 'callback_url' => $callbackUrl, - 'prefill' => $this->getCustomerInfo($order) + 'prefill' => $this->getCustomerInfo($order), + 'config'=> [ + 'display'=> [ + 'hide'=> [ + $hidePaymentMethods + ] + ] + ] ); } @@ -1270,6 +1597,21 @@ protected function createRazorpayOrderId($orderId, $sessionKey) $this->autoEnableWebhook(); } + // Every hour post installation check + $getPostInstallationFlag = get_option('rzp_post_installation_update_at'); + if (empty($getPostInstallationFlag) == false) + { + if ($getPostInstallationFlag + 3600 < time()) + { + $this->autoPostInstallationCheck(); + } + } + else + { + update_option('rzp_post_installation_update_at', $time); + $this->autoPostInstallationCheck(); + } + $razorpayOrderId = $razorpayOrder['id']; // Storing the razorpay order id in transient for 5 hours time. @@ -2935,11 +3277,13 @@ function razorpay_woo_plugin_links($links) function trigger_affordability_widget() { + $checkout360status = (get_option('rzp_checkout360_status') === 'yes') ? true : false; if (empty(get_option('rzp_afd_enable')) === false and get_option('rzp_afd_enable') === 'yes') { - if (empty(get_option('rzp_afd_feature_checked')) === true or - get_option('rzp_afd_feature_checked') === 'no') + if ((empty(get_option('rzp_afd_feature_checked')) === true or + get_option('rzp_afd_feature_checked') === 'no' ) and + $checkout360status === false) { try { @@ -2981,8 +3325,11 @@ function trigger_affordability_widget() function trigger_rtb_widget() { - if (empty(get_option('rzp_rtb_feature_checked')) === true or - get_option('rzp_rtb_feature_checked') === 'no') + $checkout360status = (get_option('rzp_checkout360_status') === 'yes') ? true : false; + + if ((empty(get_option('rzp_rtb_feature_checked')) === true or + get_option('rzp_rtb_feature_checked') === 'no') and + $checkout360status === false) { try { @@ -3007,11 +3354,15 @@ function trigger_rtb_widget() } } - if (empty(get_option('woocommerce_razorpay_settings')) === false and + if ((empty(get_option('woocommerce_razorpay_settings')) === false and isset(get_option('woocommerce_razorpay_settings')['enable_rtb_widget']) === true and get_option('woocommerce_razorpay_settings')['enable_rtb_widget'] === 'yes' and empty(get_option('rzp_rtb_enable')) === false and - get_option('rzp_rtb_enable') === 'yes') + get_option('rzp_rtb_enable') === 'yes') or + $checkout360status === true and + empty(get_option('rzp_rtb_enable')) === false and + get_option('rzp_rtb_enable') === 'yes' + ) { $key_id = get_option('woocommerce_razorpay_settings')['key_id']; echo '