【问题标题】:WooCommerce REST Client API - Programmatically get consumer key and secretWooCommerce REST Client API - 以编程方式获取消费者密钥和秘密
【发布时间】:2015-09-28 10:46:17
【问题描述】:

我目前正在使用客户端 API 来实现一个简单的用户前端来上传产品。函数client->products->create() 似乎工作正常,但我无法解决一个问题。

每次上传产品时,vendor 都设置为admin 用户,而不是当前登录的用户。有没有办法通过API 设置vendor?有人做过吗?

这是我创建的在提交表单时被 AJaX 调用的函数(我故意将键和网站字段留空):

function addProduct()
{

  $options = array(
    'debug'           => false,
    'return_as_array' => false,
    'validate_url'    => false,
    'timeout'         => 30,
    'ssl_verify'      => false,
  );

  try {

    $client = new WC_API_Client('', '', '', $options);

    $productName = $_POST["productname"];
    $price = $_POST["price"];
    $discountPrice = $_POST["discountPrice"];
    $description = $_POST["description"];
    $shortDescription = $_POST["shortDescription"];
    $authorId = 5;

    $client->products->create(array('title' => $productName, 'type' => 'simple', 'regular_price' => $price, 'description' => $description));
  } catch (WC_API_Client_Exception $e) {

    echo $e->getMessage() . PHP_EOL;
    echo $e->getCode() . PHP_EOL;

    if ($e instanceof WC_API_Client_HTTP_Exception) {

      print_r($e->get_request());
      print_r($e->get_response());
    }
  }

  echo ("Publicado" . $authorId);

  // Una función AJaX en WordPress debe siempre terminarse con die().
  die();
}

问题似乎出在消费者密钥和消费者秘密上,那么,有没有办法以编程方式为客户端提供 API 密钥并动态获取这些密钥?

【问题讨论】:

    标签: wordpress api woocommerce product woocommerce-rest-api


    【解决方案1】:

    UPDATE:下面描述的获取消费者密钥的方法将不起作用一旦生成了消费者密钥,就无法再从数据库中获取它了。存储在这个新表中的消费者密钥与在管理屏幕中生成并传递给最终用户的消费者密钥不同。它appears to be an SHA256 hashed a version 这个键。这更安全(以前存储在 wp_usermeta 中的消费者密钥和秘密等同于存储明文密码,因为任何有权访问该数据的人都可以作为这些用户中的任何一个登录 API),但少了一点方便的。赢一些,输一些,但要在安全上取胜。


    您的new WC_API_Client() 将在选项前使用三个参数:$store_url、$consumer_key 和 $consumer_secret。

    WC 商店中用于访问 API 的任何用户都需要消费者密钥或消费者密码。消费者密钥将识别哪个用户 API 将以哪个用户身份运行,并且该用户将链接到通过 API 创建的任何实体。

    直到最近,您还可以像这样为用户获取这两条信息:

    $consumer_key = get_user_meta($user_id, 'woocommerce_api_consumer_key', true);
    $consumer_secret = get_user_meta($user_id, 'woocommerce_api_consumer_secret', true);
    

    其中 $user_id 是将创建项目的用户的 ID。如果您希望当前登录的用户能够以他们的名义创建项目,则需要为该用户提供消费者密钥和秘密,并且需要在适当的 WC/WP 组中允许他们这样做。

    请注意,如果您这样做,那么用户还可以访问 WC 的管理页面来创建这些项目,而不仅仅是通过 API。

    在更高版本的 WC 中,用户元数据项已移至单独的表:wp_woocommerce_api_keys,因此您需要查看那里而不是用户元数据。

    这将为您获取给定用户 ID 的使用者密钥和秘密:

    global $wpdb;
    $key = $wpdb->get_row( $wpdb->prepare("
        SELECT consumer_key, consumer_secret, permissions
        FROM {$wpdb->prefix}woocommerce_api_keys
        WHERE user_id = %d
    ", $user_id), ARRAY_A);
    

    结果是这样的:

    array(3) {
      ["consumer_key"]=>
      string(64) "58043812eee6aa75c80407f8eb9cec025825f138eb7d60118af66cf4b38060fa"
      ["consumer_secret"]=>
      string(43) "cs_1da716412bb9680d8b06b09160872b7e54416799"
      ["permissions"]=>
      string(10) "read_write"
    }
    

    当然,我假设您正在使用 API 来“循环”到当前站点,而不是访问远程站点。即使在当前站点上使用 WC API 创建产品也比通过 PHP 对象 API 方便得多。

    我还没有找到任何公共 WC 方法来获取这些详细信息;它们都是私有的,并假设只有 WC 需要知道这些细节。

    【讨论】:

    • 我试过这个方法,我可以从数据库中获取密钥和秘密。不幸的是,当我使用 API 时,它告诉我消费者密钥无效。当我从 Woocommerce 管理面板生成它们时,密钥类似于 "ck_"
    • @Luke47 是的,没错。请参阅此答案顶部的注释。密钥和秘密在 WC 设置页面中给出以生成令牌。在那之后,您将无法再次从数据库中获取使用者密钥 - 仅存储一个散列。这是最近 WC 版本的更改,从 ~4.3.0(可能稍早)。
    • 感谢您的回答,杰森。与此同时,我们重新设计了我们的访问机制并通过实际上避免它来解决这个问题:-)
    • 只要你能通过 WC 或 WP 核心课程,那么你应该没问题。如果您要直接访问数据库,请注意 WC 处理微妙关系,其他插件可能会挂接到 API 函数中。这些很容易被忽视。我认为随着 API 的成熟,它会变得更容易使用,并且使用它将有助于避免更多的数据问题。
    • 感谢您的建议。实际上,我们只需要一种方法来识别哪个用户正在使用我们的应用程序,因此我们通过 OAuth2 和 WP Rest API 实现了这一点。其他一切都通过 WC Rest API 完成。
    【解决方案2】:

    是的,您需要在代码中进行如下精细定制:

    背景资料:

    每个用户的消费者密钥、消费者密钥和读/写权限(如果为该用户生成 WooCommerce API 密钥)存储在 wordpress 的 usermeta 表中,meta_keys 为“woocommerce_api_consumer_key'、'woocommerce_api_consumer_secret' 和 'woocommerce_api_key_permissions'。

    因此,您只需要先获取当前用户 id,然后将上述用户的元值分配给一些变量并将它们作为参数发送。

    【讨论】:

    • 谢谢!我想我已经做到了,仍然存在一个问题,当用户上传产品时,即使他们的权限设置为红色/写入,它也会显示错误 401,表示用户没有读取产品的权限。有什么建议吗?
    • 检查该网站特定用户元的 woocommerce_api_key_permissions 设置并在任何地方使用它之前回显相同并让我知道结果。
    • 设置为“read_write”,我也在user_metadata数据库中确认了这一点。
    • 现在已经过时了。最新版本 WC 中的密钥(肯定是 2.4.7,但不确定何时更改)存储在单独的表 wp_woocommerce_api_keys 中,而不是存储在用户元数据中。我还没有找到一个 API 来解决这个问题,但是直接访问该表将为您提供任何具有 API 令牌的用户的使用者密钥、秘密和权限。
    【解决方案3】:

    我认为问题在于以编程方式为您希望使用 woocommerce 服务的女巫为该客户生成 API 密钥,因为密钥为每个用户所有,对其他用户没有用处。

    我的建议是查看 woocommerce 的管理源代码。

    【讨论】:

    • 告诉提问者去查看代码以找到答案的答案是没有用的。
    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 2016-04-14
    • 2011-09-08
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多