WooCommerce REST客户端API - 以编程方式获取消费者密钥和密钥

时间:2015-07-09 20:52:41

标签: wordpress api woocommerce client product

我目前正在使用客户端API来实现上传产品的简单用户前端。函数client-> products-> create()似乎运行正常,但我怎么也无法解决一个问题。每次上传产品时,供应商都会设置为admin用户而不是当前登录的用户。有没有办法通过API设置供应商?有人这样做了吗?

这是我创建的函数,在提交表单时由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密钥并动态获取这些密钥?

3 个答案:

答案 0 :(得分:0)

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

背景资料:

每个用户的消费者密钥,消费者密钥和读/写权限(如果为这些用户生成WooCommerce API密钥)存储在wordpress的usermeta表中,meta_keys为&# 39; woocommerce_api_consumer_key ',' woocommerce_api_consumer_secret '和' woocommerce_api_key_permissions '分别

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

答案 1 :(得分:0)

我认为问题是以编程方式生成该客户的API密钥,因为您希望使用woocommerce服务,因为每个用户拥有密钥并且对其他用户没有用。

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

答案 2 :(得分:0)

更新:获取下面描述的消费者密钥的方法将无效; 生成后,无法再从数据库中获取使用者密钥。存储在此新表中的使用者密钥与在管理屏幕中生成并传递给最终用户的用户密钥不同。这个密钥的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需要知道这些细节。