Reputation: 1972
I'm trying to use IDS to access our own data in QBO from a java-based web app. I've found some examples (such as the example in ipp-java-devkit) and have assembled about 20 lines of code just to connect and authenticate...and I don't have anything working yet. The docs seem to be oriented around building a 3rd-party app to sell to other companies so that they can access their own data from the app. I understand the need for extra security in that case, but surely I should not need to create an application in the Intuit App Store simply to access our own data?
Does anyone know of an example or tutorial on how to do this?
Upvotes: 1
Views: 202
Reputation: 27952
Per Intuit's FAQ, Intuit Anywhere/IDS is only supposed to be used for SaaS applications (e.g. an app you're trying to sell to other people, which allows them to connect their QuickBooks files to your app).
From the FAQs:
Q: What are the requirements for implementing Intuit Anywhere?
A: Your app must:
Be a web app available for use within a browser, that is sold as service (SaaS, including transactional pricing based) offering that you sell to multiple customers. Mobile extensions to your SaaS app are supported.
Pass the Security Review prior to going live with customers.
And:
Q: I want to integrate my custom (non-SaaS, single-tenant) solution with Intuit Anywhere. > Can I do this?
A: Not today, but we are considering it.
Since what you're trying to build doesn't fall into that pattern, you are not eligible to use IDS.
You should use qbXML instead.
On our QuickBooks integration wiki we have some examples of connecting to QuickBooks Online in Java.
You should register in DESKTOP mode with Intuit, and then you can use code like this to exchange data:
import java.net.*;
import java.io.*;
import javax.net.ssl.*;
// WARNING SUPER SLOPPY DEMO CODE - YOU SHOULD CLEAN THIS UP AND MAKE THIS PRETTY IF YOU USE IT!
public class Test {
protected static String _appID = "134476472";
protected static String _appLogin = "test.www.yourdomain.com";
protected static String _connTicket = "TGT-47-1sRm2nXMVfm$n8hb2MZfVQ";
protected static String _appURL = "https://webapps.quickbooks.com/j/AppGateway";
/**
* @param args
*/
public static void main(String[] args) {
// First, we need to sign on to QBOE
String xml = "<?xml version=\"1.0\" ?>" +
"<?qbxml version=\"6.0\"?>" +
"<QBXML>" +
" <SignonMsgsRq>" +
" <SignonDesktopRq>" +
" <ClientDateTime>2007-01-02T01:02:35</ClientDateTime>" +
" <ApplicationLogin>" + Test._appLogin + "</ApplicationLogin>" +
" <ConnectionTicket>" + Test._connTicket + "</ConnectionTicket>" +
" <Language>English</Language>" +
" <AppID>" + Test._appID + "</AppID>" +
" <AppVer>1</AppVer>" +
" </SignonDesktopRq>" +
" </SignonMsgsRq>" +
"</QBXML>";
String out = "";
try {
out = Test._doRequest(xml);
System.out.println(out);
}
catch (Exception ex) {
System.out.println("Something bad happened: " + ex.getMessage());
}
// Parse out the connection ticket
String sessTicket = out.substring(291, 330);
System.out.println("Session ticket: " + sessTicket);
// Send an actual request
String xml2 = "<?xml version=\"1.0\" ?>" +
"<?qbxml version=\"6.0\"?>" +
"<QBXML> " +
" <SignonMsgsRq>" +
" <SignonTicketRq>" +
" <ClientDateTime>2006-09-20T15:49:26</ClientDateTime>" +
" <SessionTicket>" + sessTicket + "</SessionTicket>" +
" <Language>English</Language> " +
" <AppID>" + Test._appID + "</AppID>" +
" <AppVer>1</AppVer>" +
" </SignonTicketRq>" +
" </SignonMsgsRq>" +
" <QBXMLMsgsRq onError=\"continueOnError\">" +
" <CustomerQueryRq requestID=\"2\" />" +
" </QBXMLMsgsRq>" +
"</QBXML>";
try {
System.out.println(Test._doRequest(xml2));
}
catch (Exception ex) {
System.out.println("Something bad happened: " + ex.getMessage());
}
}
protected static String _doRequest(String xml) throws Exception {
String xmlOut = null;
try
{
URL url= new URL(Test._appURL);
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Content-Type", "application/x-qbxml");
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.println(xml); //XML Input
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine = "";
xmlOut = "";
StringBuffer strOut = new StringBuffer();
while ((inputLine = in.readLine()) != null)
{
strOut.append(inputLine);
}
xmlOut = strOut.toString();
in.close();
}
catch(ConnectException conEx)
{
System.out.println("Connection is unavailable. (ConnectException in SecureEnterpriseSocketSession class) " + conEx);
throw new Exception(conEx.getMessage());
}
catch(MalformedURLException malformedURLEx)
{
System.out.println("Invalid URL. Cannot Connect. (MalformedURLException in SecureEnterpriseSocketSession class) " + malformedURLEx);
throw new Exception(malformedURLEx.getMessage());
}
catch(IOException ioEx)
{
System.out.println("Invalid URL. Cannot Connect. (IOException in SecureEnterpriseSocketSession class) " + ioEx);
throw new Exception(ioEx.getMessage());
}
return xmlOut;
}
}
Upvotes: 1