php gajal गजले 5 के साथ ओएथ का उपयोग कैसे करें(या, बेहतर, गज़ले 6 के साथ)



ग़ज़ल की बारीकियां (2)

अब प्लगइन OauthSubscriber केवल OauthSubscriber 6 के लिए उपलब्ध है। फिर से परीक्षण करने के बाद, मुझे बग मिला है: यह विधि signUsingHmacSha1() जो कि किसी भी तरह से एक umpersand (&) जोड़ता है और हस्ताक्षर करने के लिए स्ट्रिंग और यह WooCommerce से त्रुटि का कारण बनता है ।

मैंने गीथहब पर एक मुद्दा खोल दिया है और बग को ठीक करने के लिए पुल अनुरोध भेजा है

गजले 6 का उपयोग करते हुए WooCommerce API V2 से कनेक्ट करने का सही तरीका (एक बार बग तय हो गया है! आप कनेक्ट होने वाले WooCommerce API के संस्करण की देखभाल करें: API v3 अभी भी काम नहीं करता! ) यह है:

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

जैसा कि बताया गया है, यह कनेक्शन केवल WooCommerce API के संस्करण 2 के साथ काम करता है।

मैं यह समझने की जांच कर रहा हूं कि वी 3 काम क्यों नहीं करता

मैं गज़ले 5 का उपयोग करके WooCommerce API से कनेक्ट करने की कोशिश कर रहा हूं (गज़ले 6 में ओआउथ विकल्प नहीं है)। Woocommerce को कार्य करने के लिए ऑथ प्रमाणन विधि की आवश्यकता है

यह कोड मैं उपयोग कर रहा हूं:

<?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"...'

यह कोड एक देता है

woocommerce_api_authentication_error: अमान्य हस्ताक्षर - उपलब्ध हस्ताक्षर मेल नहीं खाते हैं

शुद्ध कर्ल कार्यों का उपयोग करना ( इस पैकेज का उपयोग करते हुए मैंने कुछ फ़ंक्शंस रखे हैं जो मुझे यहां मिले हैं ), इसके बजाय, यह काम करता है और मुझे सभी आदेश और अन्य डेटा मैं प्राप्त करना चाहता हूं

कुछ अन्य विवरण

गज़ले 5 और ओअथ का उपयोग करने के लिए मैं उन संगीतकार संकुलों का उपयोग करता हूं:

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

ऐसा लगता है कि कुछ चीजें हैं जो हस्ताक्षर बनाने में भिन्न हैं: पुस्तकालय द्वारा बनाई गई एक, जो मैंने अब तक काम करता है, लेकिन getSignature() प्लगइन द्वारा बनाई गई एक ( विधि getSignature() का उपयोग करके getSignature() लिए और नहीं त्रुटि का पता लगाने के लिए मुझे ऑउट का उपयोग करने के लिए उपयोग नहीं किया जाता है I क्या कोई ऐसा व्यक्ति है जो मुझे समस्या की पहचान करने में सहायता कर सकता है?


Answer #1

@ एरेन्डीर का उत्तर अद्यतन करना

अपने पुल अनुरोध में, एरेन्डीर ने लिखा:

मेरे मामले में, मैंने संपादन किया क्योंकि मैं WooCommerce API संस्करण 2 से कनेक्ट करने का प्रयास कर रहा था, लेकिन एपीआई के उस संस्करण को सही तरीके से ओअथ कोर 1.0 ए स्पेस लागू नहीं किया गया था। वास्तव में, उन्होंने एपीआई के संस्करण 3 में यह समस्या तय की। वी 3 और पुराने संस्करणों के बीच अंतर देखें

स्रोत: https://github.com/guzzle/oauth-subscriber/pull/42#issuecomment-185631670

इसलिए, अपना जवाब ठीक से काम करने के लिए, हमें wc-api / v2 / के बजाय wc-api / v3 / उपयोग करने की आवश्यकता है।

निम्नलिखित कोड, गज़ले 6, ओअथ और 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();




guzzle