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();