php WooCommerce order_key是否总是唯一的?

bn31dyow  于 2023-05-05  发布在  PHP
关注(0)|答案(2)|浏览(146)

wc order_key是否始终唯一?
对/wp-json/wc/v3/orders的API调用导致-〉{..“id”:123,...,“order_key”:“wc_order_ru4mFC4nNfDAE”,...}。
下面的代码显示wc_order类中的set_order_key函数。他们使用子字符串,但我不能找出$value的来源。

public function set_order_key( $value ) {
    $this->set_prop( 'order_key', substr( $value, 0, 22 ) );
}

我想使用order_key来同步一个远程电报机器人的数据库,它处理订阅表。

7gcisfzg

7gcisfzg1#

简单地说:NO,它不是真的随机。
解释深入到WooCommerce函数并调用如何生成订单,但最终取决于加密安全的伪随机PHP函数-random_int()
在WooCommerce插件中进行简单的搜索和跟踪(版本:6.7.0)显示了以下调用堆栈:

  1. includes/wc-order-functions.php:158 wc_generate_order_key()
  2. wp-includes/pluggable.php:2564 wp_generate_password()
  3. wp-includes/pluggable.php:2564 wp_rand()
  4. PHP原生库random_int()
    由于最终函数是伪随机的,而不是真正随机的(这并不总是可能的),因此它仅提供非常低的重复概率,但这种可能性从未被消除。
    此函数是否满足您的随机性要求取决于您的预期用例。但是WooCommerce获取子字符串的方法可能会破坏你的交易。结果置换的“随机性”受到set_order_key()〉substr(len=22)的限制,最大结果计数置换达到wp_generate_password() charset ^ 22。最终,这个数字仍然是有限的,而不是理论上的无限。

对于您的用例,由于您正在开发与其他平台的集成,您可以接管您端的权限,并在您的数据库(可能在另一个表上)上生成新的订阅ID,将您的ID反馈到woo-commerce并通过update_post_meta()存储。在这种情况下,您将摆脱上述排列限制,并拥有自己的故事。

3qpi33ja

3qpi33ja2#

在实践中,,您可以依赖它是唯一的,特别是对于订单。请记住,这些随机字符串不是以加密方式使用的。并且创建订单的最大可能速率不足以达到有意义的冲突概率。
订单键是在处理保存订单的类中生成的。它是在每次您没有将订单键作为参数传递时创建的(我猜这是用户下订单时的默认行为)。

class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements \WC_Object_Data_Store_Interface, \WC_Order_Data_Store_Interface {
    // ...
    /**
     * Method to create an order in the database.
     *
     * @param \WC_Order $order
     */
    public function create( &$order ) {
        if ( '' === $order->get_order_key() ) {
            $order->set_order_key( wc_generate_order_key() );
        }
    // ...
    }
// ...
}

substr只是对自定义ID的大小设置上限。22是绰绰有余,以避免碰撞。WooCommerce本身只使用13个字符的长顺序键。但有62个可能的字符。这产生62 ^ 13种可能性,或

200,028,539,268,669,788,905,472

假设你的商店惊人地达到了10亿订单。如果它是完全随机分布的,那么遇到一次碰撞的机会只有0.0002499%。一个更合理的数字,比如1万个订单,给你的机会是0.0000000000022%。您可以验证这些计算here(使用100000000、62和13作为参数)。
与最近生成的值冲突的机会甚至比这更低。该价值可能是在许多年前产生的(假设订单创建的实际速度)。

相关问题