3

我正在使用库连接到我的 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 部分并获取我的请求的返回值?

4

2 回答 2

7

您只需保存返回的“访问令牌”和“令牌秘密”即可解决此问题。步骤:

  • 使用 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);
于 2014-08-27T09:21:42.587 回答
0

当您第一次请求 Etsy 商店时,您需要保存访问令牌,然后可以将相同的访问令牌用于以后的调用。这将阻止您在通过 API 请求 Etsy 商店时一次又一次地单击 ALLOW ACCESS。

于 2017-11-17T12:21:15.730 回答