【问题标题】:How can I reconnect to the QBO API after token expiration using the java SDK令牌过期后如何使用 java SDK 重新连接到 QBO API
【发布时间】:2014-05-13 15:04:47
【问题描述】:

我正在尝试编写一个应用程序,该应用程序将通过 java spring 引擎连接到 Quickbooks Online API,将一些数据下拉并转换,然后通过电子邮件发送到某个地方。

我已经完成了所有这些工作,但我现在的问题是我的 QBO 令牌的 180 天到期。我想重新连接。 (我使用的是 1.2.0 版的 ipp-java-qbapihelper 和 2.0.3 版的 ipp-v3-java-devkit)。

我找到了这个答案:Disconnecting app in quickbooks v3 api,它谈到了断开连接(并告诉您编辑 ia.properties 文件以包含断开连接的 url,我这样做了,添加了 disconnect_url=https://appcenter.intuit.com/api/v1/Connection/Disconnect)。

由于此应用程序的一个版本目前正在生产中,我创建了另一个应用程序并通过以下步骤将其连接到 QBO:http://www.mooreds.com/wordpress/archives/1396 我已验证新应用程序可以通过检索客户来连接到 QBO。

现在我只是想重新连接。我的总体思路是:

  • 尝试重新连接
  • 如果失败,正常连接,因为我在180天内
  • 如果成功,请使用新的访问令牌(并将它们存储起来,以便后续调用可以使用它们)。

但是,我无法重新连接或断开连接。如果我写这样的代码:

IAPlatformClient client = new IAPlatformClient();
client.disconnect(consumerKey, consumerSecret, accessToken, accessTokenSecret);

我收到此错误消息:

Error Code: 100,Error Message: Error Revoking Access for authId=xxx, realmId=, appToken=xxxx

realmId 是空白的,这对我来说很有趣。我看不到任何在 IAPlatformClient 上设置 realmid 的方法或如何使用此类的示例。而且 appToken 和我用来生成上下文的 apptoken 不同。

如果我尝试重新连接:

IAPlatformClient client = new IAPlatformClient();
client.reConnect(consumerKey, consumerSecret, accessToken, accessTokenSecret);

我收到此错误消息:

Caused by: Error Code: null,Error Message: Failed to disconnect: java.lang.NullPointerException null

这是因为我正在使用处于开发模式的应用程序吗?这只是一个在我们公司周围移动数据的内部应用程序,所以我不确定是否需要将其移动到生产状态。

我不应该使用 IAPlatformClient(如果是,我应该使用什么)?

这是一个 url:https://appcenter.intuit.com/Playground/OAuth/IA/,它可以让您连接一个持续时间较短的应用程序,但使用它似乎没有帮助——我找不到访问令牌和访问令牌秘密。

我查看了网上(找不到比我上面提到的 SO 问题更多的内容)和 IPP liveconnect 论坛。我还查看了示例 QB java 代码:https://github.com/IntuitDeveloperRelations/QuickbooksV3API-Java/,但它是面向 web 应用程序的,所以我发现它并不是那么有用。我还阅读了断开连接文档:https://developer.intuit.com/docs/0025_quickbooksapi/0053_auth_auth/oauth_management_api#Reconnect,很遗憾我没有收到任何记录在案的错误消息。

liveconnect 论坛有这个帖子:https://intuitpartnerplatform.lc.intuit.com/questions/800930-reconnect-c-or-net-example,但它并没有太大帮助。我还从 PHP https://intuitpartnerplatform.lc.intuit.com/questions/806889-how-should-i-call-reconnect-api-using-php 中查看了这个示例,它看起来相当不错,但不能转换为 java。

【问题讨论】:

    标签: java intuit-partner-platform quickbooks-online


    【解决方案1】:

    你可以看看这篇文章(Re - Disconnect)。

    Disconnecting app in quickbooks v3 api

    您是否尝试过

    中提到的'https://appcenter.intuit.com/api/v1/connection/reconnect'

    https://developer.intuit.com/docs/0025_quickbooksapi/0053_auth_auth/oauth_management_api#Reconnect

    我不确定 Disconnect API 的行为(因为我还没有使用它)。 断开(或不断开)后,要获得一组新的 accessToken 和 AccessSecret,您可以通过stand C2QB(3-legged OAuth flow)。

    使用 sampleQBOV3App 或使用 OAuthPlayground。 https://appcenter.intuit.com/Playground/OAuth

    更新 - 在不使用 java devkit 的情况下添加工作代码。

    import java.io.InputStream;
    import java.io.StringWriter;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    import oauth.signpost.OAuthConsumer;
    import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
    import oauth.signpost.exception.OAuthCommunicationException;
    import oauth.signpost.exception.OAuthExpectationFailedException;
    import oauth.signpost.exception.OAuthMessageSignerException;
    import oauth.signpost.signature.AuthorizationHeaderSigningStrategy;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.http.HttpHost;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpRequestBase;
    import org.apache.http.impl.client.DefaultHttpClient;
    
    import com.intuit.ipp.data.Account;
    import com.intuit.ipp.exception.FMSException;
    import com.intuit.ipp.net.MethodType;
    import com.intuit.ipp.services.DataService;
    
    public class POCWithoutDevkitTest {
    
        private DataService service;
        private OAuthConsumer oAuthConsumer;
        private static String realmID = null;
        public static final String TEMPLATE_CONTENT_BOUNDARY = "\r\n\r\n--%s\r\nContent-Disposition: form-data; name=\"%s\" %s\r\n%s\r\n";
    
        public POCWithoutDevkitTest() {
            realmID = "122294642099";
            String consumerKey = "AAAAA";
            String consumerSecret = "BBBBB";
            String accessToken = "CCCCC";
            String accessTokenSecret = "DDDDD";
    
            setupContext(consumerKey, consumerSecret, accessToken, accessTokenSecret);
        }
    
        public void setupContext(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) {
                this.oAuthConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
                oAuthConsumer.setTokenWithSecret(accessToken, accessTokenSecret);
                oAuthConsumer.setSigningStrategy(new AuthorizationHeaderSigningStrategy());
        }
    
        public void authorize(HttpRequestBase httpRequest) throws FMSException {
            try {
                oAuthConsumer.sign(httpRequest);
            } catch (OAuthMessageSignerException e) {
                throw new FMSException(e);
            } catch (OAuthExpectationFailedException e) {
                throw new FMSException(e);
            } catch (OAuthCommunicationException e) {
                throw new FMSException(e);
            }
        }
    
        public void executeGetRequest(String customURIString){
            DefaultHttpClient client = new DefaultHttpClient();
            client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
    
            HttpRequestBase httpRequest = null;
            URI uri = null;
    
            try {
                uri = new URI(customURIString);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
    
            String methodtype = "GET";
    
            if (methodtype.equals(MethodType.GET.toString())) {
                httpRequest = new HttpGet(uri);
            }
    
            httpRequest.addHeader("content-type", "application/xml");
            httpRequest.addHeader("Accept","application/xml");
    
            try {
                authorize(httpRequest);
            } catch (FMSException e) {
                e.printStackTrace();
            }
    
    
            HttpResponse httpResponse = null;
            try {
                HttpHost target = new HttpHost(uri.getHost(), -1, uri.getScheme());
                httpResponse = client.execute(target, httpRequest);
                System.out.println("Connection status : " + httpResponse.getStatusLine());
    
                InputStream inputStraem = httpResponse.getEntity().getContent();
    
                StringWriter writer = new StringWriter();
                IOUtils.copy(inputStraem, writer, "UTF-8");
                String output = writer.toString();
    
                System.out.println(output);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    
        public static void main(String args[]) {
            POCWithoutDevkitTest withoutDevkitClient = new POCWithoutDevkitTest();
            withoutDevkitClient.executeGetRequest("https://appcenter.intuit.com/api/v1/connection/reconnect");
        }
    
        private void testCall() {
            try {
                this.service.findAll(new Account());
            } catch (FMSException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    谢谢

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2019-08-05
    • 2021-04-21
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多