PluginProbe
Pay with Vipps and MobilePay for WooCommerce / 6.2.5
Pay with Vipps and MobilePay for WooCommerce v6.2.5
6.2.5 6.2.4 6.2.3 6.2.2 6.2.1 6.2.0 6.1.10 6.1.9 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1.0 6.0.5 6.0.4 6.0.3 6.0.2 6.0.1 6.0.0 5.4.3 5.4.2 All 187 releases
← All changes | payment/WC_Gateway_Vipps.class.php +29 -37 6.1.9 → 6.2.5 View file →
@@ -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 }