如何使用java SDK在令牌过期后重新连接到QBO API

时间:2014-05-13 15:04:48

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

我正在尝试编写一个应用程序,它将通过java spring引擎连接到Quickbooks Online API,提取一些数据并对其进行转换,并通过电子邮件发送到某个地方。

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

我找到了这个答案:Disconnecting app in quickbooks v3 api讨论断开连接(并告诉你编辑你的ia.properties文件以包含我做过的断开网址,添加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(如果是这样,我应该使用什么)?

这里有一个网址:https://appcenter.intuit.com/Playground/OAuth/IA/,可让您以更短的时间连接应用,但使用该功能似乎没有帮助 - 我无法找到访问令牌和访问令牌秘密。

我已经在线查看(无法找到比我上面提到的SO问题更多的内容)和IPP liveconnect论坛。我还查看了示例QB java代码:https://github.com/IntuitDeveloperRelations/QuickbooksV3API-Java/但是这是针对webapp的,所以我没有发现它有用。我还阅读了断开连接文档: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。

1 个答案:

答案 0 :(得分:1)

您可以查看此帖子(重新断开连接)。

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,您可以通过C2QB(三脚OAuth流程)。

使用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();
        }
    }

}

由于