4

我目前正在使用客户端 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 密钥并动态获取这些密钥?

4

3 回答 3

1

更新:下面描述的获取消费者密钥的方法将不起作用一旦生成了消费者密钥,就不再可能从数据库中获取它。存储在这个新表中的消费者密钥与在管理屏幕中生成并传递给最终用户的消费者密钥不同。它似乎是一个经过 SHA256 散列的密钥版本。这更安全(以前存储在 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 需要知道这些细节。

于 2015-10-22T11:14:48.677 回答
0

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

背景资料:

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

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

于 2015-07-10T14:29:53.543 回答
0

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

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

于 2015-08-28T08:54:14.773 回答