| @@ -621,22 +621,8 @@ | ||
| 621 | 621 | } |
| 622 | 622 | public function shipping_details_callback_url($token='',$reference=0) { |
| 623 | 623 | return $this->make_callback_urls('vipps_shipping_details',$token,$reference); |
| 624 | 624 | } |
| 625 | - // Callback for the consetn removal callback. Must use template redirect directly, because wc-api doesn't handle DELETE. | |
| 626 | - // IOK 2018-05-18 | |
| 627 | - public function consent_removal_callback_url () { | |
| 628 | - $queryargs = []; | |
| 629 | - $url = home_url("/", 'https'); | |
| 630 | - if ( !get_option('permalink_structure')) { | |
| 631 | - $queryargs['vipps-consent-removal']=1; | |
| 632 | - } else { | |
| 633 | - $url = trailingslashit(home_url('vipps-consent-removal', 'https')); | |
| 634 | - } | |
| 635 | - // And we need to add an empty "callback" query arg as the very last arg to receive the actual callback. | |
| 636 | - // We can't use add_query_arg for that, as an empty argument will remove the equals-sign. | |
| 637 | - return add_query_arg($queryargs, $url) . "&callback="; | |
| 638 | - } | |
| 639 | 625 | |
| 640 | 626 | // Allow user to select the template to be used for the special Vipps MobilePay pages. IOK 2020-02-17 |
| 641 | 627 | public function get_theme_page_templates() { |
| 642 | 628 | if (!$this->page_templates) { |
| @@ -648,22 +634,8 @@ | ||
| 648 | 634 | } |
| 649 | 635 | return $this->page_templates; |
| 650 | 636 | } |
| 651 | 637 | |
| 652 | - // We can't use get_pages to get a default list of pages for our settings, because it triggers | |
| 653 | - // actions that can be used by other plugins. Therefore we must use the database directly and cache the results. IOK 2023-08-22 | |
| 654 | - public function get_pagelist () { | |
| 655 | - if (!$this->page_list) { | |
| 656 | - global $wpdb; | |
| 657 | - $page_list = array(''=>__('Use a simulated page (default)', 'woo-vipps')); | |
| 658 | - foreach($wpdb->get_results("SELECT ID,post_title FROM {$wpdb->prefix}posts WHERE post_type='page' and post_status='publish'") as $page) { | |
| 659 | - $page_list[$page->ID] = $page->post_title; | |
| 660 | - } | |
| 661 | - $this->page_list = $page_list; | |
| 662 | - } | |
| 663 | - return $this->page_list; | |
| 664 | - } | |
| 665 | - | |
| 666 | 638 | // Check to see if the product in question can be bought with express checkout IOK 2018-12-04 |
| 667 | 639 | public function product_supports_express_checkout($product) { |
| 668 | 640 | // IOK 2023-12-12 Can only support express checkout for Vipps - not MobilePay (yet!) |
| 669 | 641 | // IOK 2025-09-01 Now supports mobilepay |
| @@ -1073,9 +1045,8 @@ | ||
| 1073 | 1045 | global $Vipps; |
| 1074 | 1046 | |
| 1075 | 1047 | // Used for defaults in the admin interface; however this functions is called a loot more often than that. |
| 1076 | 1048 | $page_templates = $this->get_theme_page_templates(); |
| 1077 | - $page_list = $this->get_pagelist(); | |
| 1078 | 1049 | |
| 1079 | 1050 | $orderprefix = $Vipps->generate_order_prefix(); |
| 1080 | 1051 | |
| 1081 | 1052 | // Default handling based on other parameters and earlier values. |
| @@ -1093,9 +1064,8 @@ | ||
| 1093 | 1064 | |
| 1094 | 1065 | // We will only show the Checkout options if the user has activated the feature (thus creating the pages involved etc). IOK 2021-10-01 |
| 1095 | 1066 | $vipps_checkout_activated = get_option('woo_vipps_checkout_activated', false); |
| 1096 | 1067 | |
| 1097 | - | |
| 1098 | 1068 | // This is used for new options,to set reasonable defaults based on older settings. We can't use WC_Settings->get_option for this unfortunately. |
| 1099 | 1069 | $current = get_option('woocommerce_vipps_settings'); |
| 1100 | 1070 | // New defaults based on old defaults |
| 1101 | 1071 | $default_static_shipping_for_checkout = 'no'; |
| @@ -1620,22 +1590,24 @@ | ||
| 1620 | 1590 | 'description' => __('Turn this on to add support for Woos Order Attribution API for Checkout and Express Checkout. Some stores have reported problems when using this API together with Vipps, so be sure to test this if you turn it on.', 'woo-vipps'), |
| 1621 | 1591 | ), |
| 1622 | 1592 | |
| 1623 | 1593 | 'vippsspecialpagetemplate' => array( |
| 1624 | - 'title' => sprintf(__('Override page template used for the special %1$s pages', 'woo-vipps'), Vipps::CompanyName()), | |
| 1594 | + 'title' => sprintf(__('Legacy: Override page template used for the special %1$s page', 'woo-vipps'), Vipps::CompanyName()), | |
| 1625 | 1595 | 'label' => sprintf(__('Use specific template for %1$s', 'woo-vipps'), Vipps::CompanyName()), |
| 1626 | 1596 | 'type' => 'select', |
| 1627 | 1597 | 'options' => $page_templates, |
| 1628 | - 'description' => sprintf(__('Use this template from your theme or child-theme to display all the special %1$s pages. You will probably want a full-width template and it should call \'the_content()\' normally.', 'woo-vipps'), Vipps::CompanyName()), | |
| 1598 | + 'description' => sprintf(__('Use this template from your theme or child-theme for the special %1$s page.<br>Legacy: This is not necessary anymore - you should instead choose a template by editing the page like any other page.','woo-vipps'), Vipps::CompanyName()), | |
| 1629 | 1599 | 'default' => ''), |
| 1630 | 1600 | |
| 1601 | + // Deprecated, not shown anymore: TODO: remove this option in future. LP 2026-09-01 | |
| 1631 | 1602 | 'vippsspecialpageid' => array( |
| 1632 | 1603 | 'title' => sprintf(__('Use a real page ID for the special %1$s pages - neccessary for some themes', 'woo-vipps'), Vipps::CompanyName()), |
| 1633 | 1604 | 'label' => __('Use a real page ID', 'woo-vipps'), |
| 1634 | 1605 | 'type' => 'select', |
| 1635 | - 'options' => $page_list, | |
| 1606 | + 'options' => [], | |
| 1636 | 1607 | 'description' => sprintf(__('Some very few themes do not work with the simulated pages used by this plugin, and needs a real page ID for this. Choose a blank page for this; the content will be replaced, but the template and other metadata will be present. You only need to use this if the plugin seems to break on the special %1$s pages.', 'woo-vipps'), Vipps::CompanyName()), |
| 1637 | - 'default'=>''), | |
| 1608 | + 'default' => '' | |
| 1609 | + ), | |
| 1638 | 1610 | |
| 1639 | 1611 | 'sendreceipts' => array( |
| 1640 | 1612 | 'title' => __("Send receipts and order confirmation info to the customers' app on completed purchases.", 'woo-vipps'), |
| 1641 | 1613 | 'label' => sprintf(__("Send receipts to the customers %1\$s app", 'woo-vipps'), Vipps::CompanyName()), |
| @@ -3218,9 +3190,13 @@ | ||
| 3218 | 3190 | $is_base64 = $shipping_table ? ( $shipping_table['_is_base64'] ?? false) : false; |
| 3219 | 3191 | |
| 3220 | 3192 | if (is_array($shipping_table) && isset($shipping_table[$key])) { |
| 3221 | 3193 | $decoded = $is_base64 ? @base64_decode($shipping_table[$key]) : $shipping_table[$key]; |
| 3222 | - $shipping_rate = $decoded ? @unserialize($decoded) : null; | |
| 3194 | + | |
| 3195 | + // Ensure no shop manager has injected an evil object (that they would have had to add as a plugin) here. IOK 2026-09-18 | |
| 3196 | + $shipping_rate = $decoded ? @unserialize($decoded, ['allowed_classes' => [WC_Shipping_Rate::class]]) : null; | |
| 3197 | + $shipping_rate = is_a($shipping_rate,'WC_Shipping_Rate') ? $shipping_rate : null; | |
| 3198 | + | |
| 3223 | 3199 | if (!$shipping_rate) { |
| 3224 | 3200 | $this->log(sprintf(__("%1\$s: Could not deserialize the chosen shipping method %2\$s for order %3\$d", 'woo-vipps'), Vipps::ExpressCheckoutName(), $method, $order->get_id()), 'error'); |
| 3225 | 3201 | $this->log(sprintf(__("Serialized data was %1\$s", 'woo-vipps'), $decoded), 'error'); |
| 3226 | 3202 | } else { |
| @@ -3786,9 +3762,9 @@ | ||
| 3786 | 3762 | } |
| 3787 | 3763 | do_action('woo_vipps_payment_complete_at_shutdown', $order, $this); |
| 3788 | 3764 | } catch (Exception $e) { |
| 3789 | 3765 | // This is/should be non-critical so just log it. |
| 3790 | - $this->log(sprintf(__("Could not do all payment-complete actions on %1\$s order %2\$d: %3\$s ", 'woo-vipps'), Vipps::CompanyName(), $orderid, $e->etMessage()), "error"); | |
| 3766 | + $this->log(sprintf(__("Could not do all payment-complete actions on %1\$s order %2\$d: %3\$s ", 'woo-vipps'), Vipps::CompanyName(), $orderid, $e->getMessage()), "error"); | |
| 3791 | 3767 | } |
| 3792 | 3768 | } |
| 3793 | 3769 | |
| 3794 | 3770 | // This is run on payment complete. Per default will it only add a link to the order confirmation page, but |
| @@ -3895,9 +3871,9 @@ | ||
| 3895 | 3871 | |
| 3896 | 3872 | $contents = WC()->cart->get_cart_contents(); |
| 3897 | 3873 | $contents = apply_filters('woo_vipps_create_express_checkout_cart_contents',$contents); |
| 3898 | 3874 | try { |
| 3899 | - $cart_hash = md5(json_encode(wc_clean($contents)) . WC()->cart->total); | |
| 3875 | + $cart_hash = WC()->cart->get_cart_hash(); | |
| 3900 | 3876 | $order = new WC_Order(); |
| 3901 | 3877 | $order->set_status('pending'); |
| 3902 | 3878 | $order->set_payment_method($this); |
| 3903 | 3879 | if ($ischeckout) { |
| @@ -3908,8 +3884,9 @@ | ||
| 3908 | 3884 | } |
| 3909 | 3885 | // We use 'checkout' as the created_via key as per requests, but allow merchants to use their own. IOK 2022-09-15 |
| 3910 | 3886 | $created_via = apply_filters('woo_vipps_express_checkout_created_via', 'checkout', $order, $ischeckout); |
| 3911 | 3887 | $order->set_created_via($created_via); |
| 3888 | + $order->set_cart_hash($cart_hash); | |
| 3912 | 3889 | |
| 3913 | 3890 | $dummy = sprintf(__('Vipps Express Checkout', 'woo-vipps')); // this is so gettext will find this string. |
| 3914 | 3891 | $dummy = sprintf(__('Vipps Checkout', 'woo-vipps')); // this is so gettext will find this string. |
| 3915 | 3892 | |
| @@ -4134,8 +4111,23 @@ | ||
| 4134 | 4111 | // If enabling this, ensure the page in question exists |
| 4135 | 4112 | if ($this->get_option('vipps_checkout_enabled') == 'yes') { |
| 4136 | 4113 | update_option('woo_vipps_checkout_activated', true, true); // This must be true here, but still, make sure |
| 4137 | 4114 | Vipps::instance()->maybe_create_vipps_pages(); |
| 4115 | + } | |
| 4116 | + | |
| 4117 | + // Ensure special page has the necessary shortcode. LP 2026-09-01 | |
| 4118 | + $special_page = get_post(Vipps::get_special_page_id()); | |
| 4119 | + if ($special_page && !has_shortcode($special_page->post_content, 'vipps_special_page')) { | |
| 4120 | + $new_content = $special_page->post_content . "\n\n<!-- wp:shortcode -->[vipps_special_page]<!-- /wp:shortcode -->"; | |
| 4121 | + wp_update_post([ | |
| 4122 | + 'ID' => Vipps::get_special_page_id(), | |
| 4123 | + 'post_content' => $new_content, | |
| 4124 | + ]); | |
| 4125 | + } else if (!Vipps::get_special_page_id()) { | |
| 4126 | + // We shouldn't really get here, the page should be ensured to exist in init. LP 2026-09-03 | |
| 4127 | + /* translators: %s is current method name */ | |
| 4128 | + $this->log(sprintf(__('Missing special page in %s, attempting to fix', 'woo-vipps'), 'process_admin_options'), 'warning'); | |
| 4129 | + Vipps::instance()->ensure_special_page_exists(); | |
| 4138 | 4130 | } |
| 4139 | 4131 | |
| 4140 | 4132 | return $saved; |
| 4141 | 4133 | } |