Я пытаюсь интегрировать интернет-магазин моей компании (написанный на php / Laravel) с Xero таким образом, чтобы я мог создать счет для каждого заказа. Для этого я создал приложение Private Xero, сгенерировал сертификат, необходимый для аутентификации Oauth, и добавил его в приложение Xero, так что теперь у меня есть ключ и секретный ключ.
Я посмотрел на официальную оболочку php и обнаружил, что она очень устарела и не подходит для интеграции в мое приложение, поэтому, учитывая малое количество взаимодействий с Xero, я решил попробовать напрямую вызвать API.
Я использую Guzzle и подписчика Guzzle Oauth, но пытаюсь отправить правильно аутентифицированный запрос.
Поскольку мое приложение Xero является приватным, следующий абзац должен применяться к моему запросу (как упомянуто в области разработки Xero):
Примечание. Для частных приложений токен и секретный пользователь также используются в качестве токена доступа и секретного.
Поэтому я создаю запрос примерно так:
$stack = HandlerStack::create();
$middleware = new Oauth1([
'consumer_key' => config('services.xero.key'),
'consumer_secret' => config('services.xero.secret'),
'signature_method' => Oauth1::SIGNATURE_METHOD_RSA,
]);
$stack->push($middleware);
$client = new Client([
'base_uri' => 'https://api.xero.com/api.xro/2.0/',
'handler' => $stack,
]);
$res = $client->request('GET', 'Contacts');
dd($res);
Однако я получаю следующее исключение:
[GuzzleHttp \ Exception \ ClientException] Ошибка клиента:GET https://api.xero.com/api.xro/2.0/Contacts
в результате
в401 Unauthorized
ответ:
oauth_problem = consumer_key_unknown&oauth_problem_advice = Потребительские% 20key% 20was% 20not% 20recognised
Насколько я могу судить, я правильно настроил приложение Xero и сгенерировал ключ и секретный ключ пользователя, но я не могу отладить это.
Любой совет, как сделать правильный запрос?
У меня была та же проблема, что и у вас. Это сработало для меня:
$middleware = new Oauth1([
'consumer_key' => config('services.xero.key'),
'token' => config('services.xero.key'),
'private_key_file' => config('services.xero.path_to_my_private_key.pem'),
'private_key_passphrase' => config('services.xero.private_key_passphrase'),
'signature_method' => Oauth1::SIGNATURE_METHOD_RSA,
]);
$stack = GuzzleHttp\HandlerStack::create();
$stack->push($middleware);
$options = [
'base_uri' => 'https://api.xero.com/',
'handler' => $stack
];
$this->apiClient = new GuzzleHttp\Client($options);
В https://developer.xero.com/documentation/auth-and-limits/private-applications утверждается, что «ключ потребителя также используется в качестве токена доступа. секрет потребителя не используется для частных приложений». вот как я узнал этот конфиг.
Других решений пока нет …