Выполнение запросов к хранилищу ETSY, обеспечивающему автоматический доступ к PHP OAUTH
Я использую библиотеку для подключения к своему магазину ETSY и извлекаю данные из квитанций, чтобы перенести их на мой личный веб-сайт (базу данных).
Сделав запрос с помощью OAuth, я попадаю на сайт ETSY для "Разрешить доступ"
https://www.etsy.com/images/apps/documentation/oauth_authorize.png
Затем мне нужно вручную нажать "Разрешить доступ", и мой запрос будет выполнен и отобразит запрошенные данные.
Я хотел бы избежать процесса ручного нажатия на "Разрешить доступ", поскольку я хочу, чтобы на моем личном сайте автоматически отображалась информация, полученная из заказов ETSY.
Вот мой текущий код для страницы etsyRequest.php:
$credentials = new Credentials(
$servicesCredentials['etsy']['key'],
$servicesCredentials['etsy']['secret'],
$currentUri->getAbsoluteUri()
);
// Instantiate the Etsy service using the credentials, http client and storage mechanism for the token
/** @var $etsyService Etsy */
$etsyService = $serviceFactory->createService('Etsy', $credentials, $storage);
if (!empty($_GET['oauth_token'])) {
$token = $storage->retrieveAccessToken('Etsy');
// This was a callback request from Etsy, get the token
$etsyService->requestAccessToken(
$_GET['oauth_token'],
$_GET['oauth_verifier'],
$token->getRequestTokenSecret()
);
// Send a request now that we have access token
$result2 = json_decode($etsyService->request('/receipts/111111'));
//echo 'result: <pre>' . print_r($result, true) . '</pre>';
echo $result2->results[0]->seller_user_id;
Как я могу автоматизировать часть Allow Access и получить возвращенное значение для моего запроса, просто запустив эту страницу?
2 ответа
Эту проблему можно решить, просто сохранив возвращенные "токен доступа" и "секрет токена". Шаги, чтобы сделать это:
- Сделав запрос с помощью OAuth, вы попадаете на сайт ETSY для "Разрешить доступ". после разрешения он покажет вывод oauth_verifier. После того, как вы введете этот пин-код в свой код, он установит "токен доступа" и "секрет токена" для вашего запроса. Вам просто нужно сохранить их в переменных или базе данных.
- в следующий раз, когда вы создадите любой запрос к etsy, вам просто нужно установить эти "токен доступа" и "секрет токена" с вашими oauth_consumer_key и oauth_consumer_secret. В этот момент вам не нужен вывод oauth_verifier. он будет работать, если вы отзовете разрешение у вашего etsy учетная запись.
Я сделал это в своем Java-коде, потому что я столкнулся с той же проблемой, и она работает.(Извините, я недостаточно хорош в php), вот мой пример кода, может это поможет
public void accessEtsyAccount(String consumer_key, String consumer_secret, String requestToken, String tokenSecret, String shopName) throws Throwable{
OAuthConsumer consumer = new DefaultOAuthConsumer(
consumer_key, consumer_secret
);
if(StringUtils.isBlank(requestToken) || StringUtils.isBlank(tokenSecret) ){
OAuthProvider provider = new DefaultOAuthProvider(
"https://openapi.etsy.com/v2/oauth/request_token",
"https://openapi.etsy.com/v2/oauth/access_token",
"https://www.etsy.com/oauth/signin");
System.out.println("Fetching request token from Etsy...");
// we do not support callbacks, thus pass OOB
String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
System.out.println("Request token: " + consumer.getToken());
System.out.println("Token secret: " + consumer.getTokenSecret());
System.out.println("Now visit:\n" + authUrl
+ "\n... and grant this app authorization");
if(Desktop.isDesktopSupported()){
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(new URI(authUrl));
} catch (IOException | URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("xdg-open " + authUrl);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Enter the PIN code and hit ENTER when you're done:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String pin = br.readLine();
System.out.println("Fetching access token from Etsy...");
provider.retrieveAccessToken(consumer, pin);
} else {
consumer.setTokenWithSecret(requestToken, tokenSecret);
}
System.out.println("Access token: " + consumer.getToken());
System.out.println("Token secret: " + consumer.getTokenSecret());
URL url = new URL("https://openapi.etsy.com/v2/private/shops/"+shopName+"/transactions");
HttpURLConnection request = (HttpURLConnection) url.openConnection();
consumer.sign(request);
System.out.println("Sending request to Etsy...");
request.connect();
System.out.println("Response: " + request.getResponseCode() + " "
+ request.getResponseMessage());
System.out.println("Payload:");
InputStream stream = request.getInputStream();
String stringbuff = "";
byte[] buffer = new byte[4096];
while (stream.read(buffer) > 0) {
for (byte b: buffer) {
stringbuff += (char)b;
}
}
System.out.print(stringbuff);
Вам необходимо сохранить токен доступа, когда вы впервые запросили хранилище Etsy, а затем этот же токен можно использовать для последующих вызовов. Это предотвратит повторное нажатие кнопки "РАЗРЕШИТЬ НА ДОСТУП" при запросе хранилища Etsy через API.