WooCommerce REST Client API - программное получение ключа и секрета потребителя

В настоящее время я использую клиентский API для реализации простого пользовательского интерфейса для загрузки продуктов. Функция client->products->create() вроде работает нормально, но я не могу решить одну проблему.

Каждый раз, когда я загружаю продукт, поставщик настраивается на пользователя с правами администратора, а не на пользователя, который в настоящее время вошел в систему. Есть ли способ установить поставщика через 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 и получить их динамически?


person Alexander Guillermo Segura Bal    schedule 09.07.2015    source источник


Ответы (3)


ОБНОВЛЕНИЕ: описанный ниже метод получения ключа потребителя не работает; невозможно получить ключ потребителя из базы данных после того, как он был сгенерирован. Ключ потребителя, хранящийся в этой новой таблице, не является тем же ключом потребителя, который генерируется на экранах администратора и передается конечному пользователю. Кажется, что имеет хеш-версию SHA256. a> этого ключа. Это более безопасно (ранее ключ и секрет потребителя, хранящиеся в 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 - это идентификатор пользователя, который будет создавать элементы. Если вы хотите, чтобы текущий вошедший в систему пользователь мог создавать элементы от своего имени, тогда этому пользователю нужно будет предоставить ключ потребителя и секрет, и он должен быть в соответствующей группе WC / WP. чтобы дать им на это разрешение.

Обратите внимание, что если вы это сделаете, то пользователь также будет иметь доступ к административным страницам для WC для создания этих элементов, а не только через API.

В более поздних версиях WC метаэлементы пользователя были перемещены в отдельную таблицу: wp_woocommerce_api_keys, поэтому вам нужно заглядывать туда, а не в мета пользователя.

Это даст вам ключ потребителя и секрет для данного идентификатора пользователя:

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 для создания продуктов даже на текущем сайте может быть намного удобнее, чем использование API объекта PHP.

Я еще не нашел никаких общедоступных методов WC для получения этих деталей; все они частные и предполагают, что только WC должен знать эти детали.

person Jason    schedule 22.10.2015
comment
Я пробовал этот метод, и я могу получить ключ и секрет из БД. К сожалению, когда я использую API, он сообщает мне, что ключ потребителя недействителен. Когда я создаю их из панели администратора Woocommerce, ключ выглядит примерно так: ck_ ‹text› - person Luke47; 27.10.2015
comment
@ Luke47 Да, верно. См. Примечание вверху этого ответа. Ключ и секрет выдаются на странице настроек WC для генерации токенов. После этого вы НЕ МОЖЕТЕ снова получить ключ потребителя из базы данных - сохраняется только хэш. Это изменение в последней версии WC, по сравнению с ~ 4.3.0 (возможно, немного раньше). - person Jason; 28.10.2015
comment
Спасибо за ответ, Джейсон. Тем временем мы переработали наш механизм доступа и решили эту проблему, фактически избегая ее :-) - person Luke47; 17.12.2015
comment
Если вы можете пройти базовые классы WC или WP, все будет в порядке. Если вы собираетесь напрямую обращаться к базе данных, просто имейте в виду, что WC обрабатывает тонкие взаимосвязи, а другие плагины могут подключаться к функциям API. Их легко не заметить. Я думаю, что по мере развития API его станет проще использовать, и его использование поможет избежать многих проблем с данными в будущем. - person Jason; 18.12.2015
comment
Спасибо за ваш совет. На самом деле нам просто нужен способ узнать, какой пользователь использует наше приложение, поэтому мы достигли этого с помощью OAuth2 и WP Rest API. Все остальное делается через WC Rest API. - person Luke47; 18.12.2015

Да, в вашем коде есть тонкая настройка, которая выглядит следующим образом:

Исходная информация:

Каждый пользовательский ключ клиента, секретный ключ потребителя и разрешения на чтение / запись (если ключи API WooCommerce созданы для этих пользователей) хранятся в таблице usermeta wordpress с мета_ключами как 'woocommerce_api_consumer_key ',' woocommerce_api_consumer_secret 'и' woocommerce_api_key_permissions 'соответственно.

Таким образом, вам просто нужно сначала получить идентификатор текущего пользователя, а затем получить мета-значение этого пользователя, как указано выше, присвоить некоторым переменным и отправить их в качестве параметра.

person Domain    schedule 10.07.2015
comment
Спасибо! Я думаю, что у меня это происходит, все еще остается одна проблема: когда пользователь загружает продукт, даже если его разрешения установлены на красный / запись, он показывает ошибку 401, говоря, что у пользователя нет разрешения на чтение продукта. Какие-либо предложения? - person Alexander Guillermo Segura Bal; 11.07.2015
comment
Проверьте, что установлено для woocommerce_api_key_permissions для этой конкретной пользовательской меты сайта, и повторите то же самое, прежде чем использовать его где-либо, и дайте мне знать результаты. - person Domain; 11.07.2015
comment
Он установлен на read_write, я также подтвердил это в базе данных user_metadata. - person Alexander Guillermo Segura Bal; 11.07.2015
comment
Это уже устарело. Ключи в последней версии WC (конечно, в 2.4.7, но не уверен, когда она изменилась) хранятся в отдельной таблице wp_woocommerce_api_keys, а не в пользовательской мета. Я еще не нашел API для этого, но прямой доступ к таблице даст вам ключ потребителя, секрет и разрешения для любого пользователя с токеном API. - person Jason; 22.10.2015

Я думаю, проблема в том, чтобы программно сгенерировать ключи API для этого клиента, ведь вы хотите использовать службу woocommerce, потому что ключи принадлежат каждому пользователю и не могут быть полезны другим пользователям.

Мой совет - посмотрите исходный код администратора woocommerce.

person and.ryx    schedule 28.08.2015
comment
Ответ, в котором спрашивающему следует просмотреть код, чтобы найти ответ, бесполезен. - person Jason; 22.10.2015