promises meaning guzzlehttp example cookie php curl oauth guzzle

php - meaning - guzzle symfony



Cómo usar oAuth con Guzzle 5(o, mejor, con Guzzle 6) (2)

Estoy intentando conectarme a la API de WooCommerce usando Guzzle 5 (Guzzle 6 parece no tener opciones de OAuth oO). Woocommerce requiere el método de autenticación oAuth para funcionar.

Este es el código que estoy usando:

<?php /** * Example of usage of Guzzle 5 to get information * from a WooCommerce Store. */ require(''../vendor/autoload.php''); use GuzzleHttp/Client; use GuzzleHttp/Subscriber/Oauth/Oauth1; use GuzzleHttp/Exception/RequestException; $consumer_key = ''my_consumer_key''; // Add your own Consumer Key here $consumer_secret = ''my_consumer_secret''; // Add your own Consumer Secret here $store_url = ''http://example.com''; // Add the home URL to the store you want to connect to here $api_path = ''/wc-api/v2/''; $api_end_point = [ ''root'' => '''', ''orders'' => ''orders'' ]; $base_uri = $store_url . $api_path; $client = new Client([ ''base_url'' => $base_uri, ''defaults'' => [''auth'' => ''oauth''] ]); $oauth = new Oauth1([ ''consumer_key'' => $consumer_key, ''consumer_secret'' => $consumer_secret, ''request_method'' => ''query'' ]); $client->getEmitter()->attach($oauth); try { $res = $client->get($api_end_point[''orders'']); } catch (RequestException $e) { $res = $e; if ($e->hasResponse()) { $res = $e->getResponse(); } } print_r($res); echo $res->getStatusCode(); // "200" echo $res->getHeader(''content-type''); // ''application/json; charset=utf8'' echo $res->getBody(); // {"type":"User"...''

Este código devuelve un

woocommerce_api_authentication_error: Firma no válida: la firma proporcionada no coincide

Usar funciones de curl puro (usando este paquete en el que he puesto algunas funciones que encontré aquí ), en cambio, funciona y obtengo todos los pedidos y otros datos que quiero.

ALGUNOS OTROS DETALLES

Para usar Guzzle 5 y oAuth utilizo esos paquetes de compositores:

"require": { "guzzlehttp/guzzle": "~5.0" }, "require-dev": { "guzzlehttp/oauth-subscriber": "~0.2", },

Parece que hay algunas cosas que son diferentes en la creación de la firma: la creada por la biblioteca que he usado hasta ahora , pero la creada por el plugin oAuth ( usando el método getSignature() ) para Guzzle no lo hace. No estoy acostumbrado a usar oAuth para encontrar el error. ¿Hay alguien que pueda ayudarme a identificar el problema?


Ahora el complemento OauthSubscriber está disponible solo para Guzzle 6. Probando nuevamente, he encontrado el error: está en el método signUsingHmacSha1() que de todos modos agrega un umpersand (&) a la cadena para firmar y esto causa el error de WooCommerce .

Abrí un problema en GitHub y envié una solicitud de extracción para corregir el error.

La forma correcta de conectarse a WooCommerce API V2 con Guzzle 6 (una vez solucionado el error, cuide la versión de la API de WooCommerce que se conecta: ¡la API v3 aún no funciona! ) Es esta:

use GuzzleHttp/Client; use GuzzleHttp/HandlerStack; use GuzzleHttp/Handler/CurlHandler; use GuzzleHttp/Subscriber/Oauth/Oauth1; $options = array( // Add the home URL to the store you want to connect to here (without the end / ) ''remoteUrl'' => ''http://example.com/'', // Add your own Consumer Key here ''remoteConsumerKey'' => ''ck_4rdyourConsumerKey8ik'', // Add your own Secret Key here ''remoteSecretKey'' => ''cs_738youconsumersecret94i'', // Add the endpoint base path ''remoteApiPath'' => ''wc-api/v2/'', ); $remoteApiUrl = $options[''remoteUrl''] . $options[''remoteApiPath'']; $endpoint = ''orders''; $handler = new CurlHandler(); $stack = HandlerStack::create($handler); $middleware = new Oauth1([ ''consumer_key'' => $options[''remoteConsumerKey''], ''consumer_secret'' => $options[''remoteSecretKey''], ''token_secret'' => '''', ''token'' => '''', ''request_method'' => Oauth1::REQUEST_METHOD_QUERY, ''signature_method'' => Oauth1::SIGNATURE_METHOD_HMAC ]); $stack->push($middleware); $client = new Client([ ''base_uri'' => $remoteApiUrl, ''handler'' => $stack ]); $res = $client->get($endpoint, [''auth'' => ''oauth'');

Como se dijo, esta conexión solo funciona con la versión 2 de la API de WooCommerce.

Estoy investigando para entender por qué el V3 no funciona.


Actualización @ Respuesta de Arendre

En su solicitud de extracción, @Aerendir escribió:

En mi caso, hice la edición porque estaba tratando de conectarme a la API de WooCommerce versión 2, pero esa versión de la API no implementó correctamente la especificación OAuth Core 1.0a. De hecho, arreglaron este problema en la versión 3 de la API. Vea las diferencias entre V3 y versiones anteriores.

fuente: https://github.com/guzzle/oauth-subscriber/pull/42#issuecomment-185631670

Entonces, para hacer que su respuesta funcione correctamente, necesitamos usar wc-api / v3 / en lugar de wc-api / v2 / .

El siguiente código funciona con Guzzle 6, oauth y WooCommerce api v3:

use GuzzleHttp/Client, GuzzleHttp/HandlerStack, GuzzleHttp/Handler/CurlHandler, GuzzleHttp/Subscriber/Oauth/Oauth1; $url = ''http://localhost/WooCommerce/''; $api = ''wc-api/v3/''; $endpoint = ''orders''; $consumer_key = ''ck_999ffa6b1be3f38058ed83e5786ac133e8c0bc60''; $consumer_secret = ''cs_8f6c96c56a7281203c2ff35d71e5c4f9b70e9704''; $handler = new CurlHandler(); $stack = HandlerStack::create($handler); $middleware = new Oauth1([ ''consumer_key'' => $consumer_key, ''consumer_secret'' => $consumer_secret, ''token_secret'' => '''', ''token'' => '''', ''request_method'' => Oauth1::REQUEST_METHOD_QUERY, ''signature_method'' => Oauth1::SIGNATURE_METHOD_HMAC ]); $stack->push($middleware); $client = new Client([ ''base_uri'' => $url . $api, ''handler'' => $stack ]); $response = $client->get( $endpoint, [ ''auth'' => ''oauth'' ] ); echo $response->getStatusCode() . ''<br>''; echo $response->getHeaderLine(''content-type'') . ''<br>''; echo $response->getBody();