Thursday, August 27, 2015

QuickBooks Web Connector with WCF services

I have been working a project to try and get some backend data plugged into QuickBooks so we can push that data into QuickBooks. We are using desktop QuickBooks hosted by another provided so our integration options are limited. We ended up using the QuickBooks Web Connector. First let me say that documentation on this front is limited and what you can find is normally old. Here is some of the reference we were able to find:
Web connector overview
QuickBooks error codes
Helpful UI for how to construct QuickBooks API calls
Web connector SDK
QBWC Dev Guide
You will need to create a QWC file and here is a QWC Example.
One of the biggest issues we ran into was all the documents and examples we could find were based on the older ASMX services. Because of this we struggle for a bit on understanding how the service needed to be attributed. So here is what our WCF service contract ended need to be set as.
 

   [GeneratedCode("wsdl", "4.6.57.0")]

   [WebServiceBinding(Name = "QuickBookConnectorService", Namespace = "http://developer.intuit.com/")]

   public class QuickBookConnectorService : QBWebConnectorSvc, IQuickBookConnector

   {

       /// <summary>Provides a way for web-service to notify QBWC of it's version. This version string shows up in 

       /// the More Information pop-up dialog in QBWC.</summary>

       /// <returns>The <see cref="string"/>.</returns>

       [OperationContract(Action = "http://developer.intuit.com/serverVersion")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override string serverVersion()

       {

       }

 

       /// <summary>Optional callback allows the web service to evaluate the current web connector version and react to it.</summary>

       /// <param name="strVersion">The version of the QB web connector supplied in the web connector's call to clientVersion</param>

       /// <returns>The <see cref="string"/>See QB Dev guide for details on return values</returns>

       [OperationContract(Action = "http://developer.intuit.com/clientVersion")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override string clientVersion(string strVersion)

       {

       }

 

       /// <summary>The authenticate.</summary>

       /// <param name="strUserName">The username the connector should be running as to authenticate.</param>

       /// <param name="strPassword">The password the connector should be running as to authenticate.</param>

       /// <returns>The <see cref="string[]"/>Must contain 2 elements. 1) NONE, NVU, BUSY, string.empty or Company file name. 

       /// 2) Value noted how long to postpone the update 

       /// 3) Sets lower limit on how often QBWC can call 

       /// 4) Sets the min run seconds</returns>

       [OperationContract(Action = "http://developer.intuit.com/authenticate")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override string[] authenticate(string strUserName, string strPassword)

       {

       }

 

       /// <summary>Tells your web service about an error the web connector encountered in its attempt to connect to QuickBooks or QuickBooks POS.</summary>

       /// <param name="ticket">The ticket from the web connector. This is the session token your web service returned to the web connector's

       ///  authenticate call, as the first element of the returned string array</param>

       /// <param name="hresult">The HRESULT (in HEX) from the exception thrown by the request processor</param>

       /// <param name="message">The error message that accompanies the HRESULT from the request processor.</param>

       /// <returns>The <see cref="string"/>.</returns>

       [OperationContract(Action = "http://developer.intuit.com/connectionError")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override string connectionError(string ticket, string hresult, string message)

       {

       }

 

       /// <summary>The web connector's invitation to the web service to send a request.</summary>

       /// <param name="ticket">The ticket from the web connector. This is the session token your web service returned to the web connector's

       ///  authenticate call, as the first element of the returned string array.</param>

       /// <param name="strHCPResponse">Only for the first sendRequestXML call in a data exchange session will this parameter contains response 

       /// data from a HostQuery, a CompanyQuery, and a PreferencesQuery request. This data is provided at the outset of a data exchange because

       /// it is normally useful for a web service to have this data.In the ensuing data exchange session, subsequent sendRequestXML calls from 

       /// the web processor do not contain this data, (only an empty string is supplied) as it is assumed your web service already has 

       /// it for the session. </param>

       /// <param name="strCompanyFileName">The company file being used in the current data exchange.</param>

       /// <param name="qbXMLCountry">The country version of QuickBooks or QuickBooks POS product being used to access the company. .</param>

       /// <param name="qbXMLMajorVers">The qb xml major vers.</param>

       /// <param name="qbXMLMinorVers">The qb xml minor vers.</param>

       /// <returns>The <see cref="string"/>Either string of "NoOp" to tell the QBWC to pause or a valid qbXML string</returns>

       [OperationContract(Action = "http://developer.intuit.com/sendRequestXML")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override string sendRequestXML(

           string ticket,

           string strHCPResponse,

           string strCompanyFileName,

           string qbXMLCountry,

           int qbXMLMajorVers,

           int qbXMLMinorVers)

       {

       }

 

       /// <summary>Returns the data request response from QuickBooks or QuickBooks POS.</summary>

       /// <param name="ticket">The ticket from the web connector. This is the session token your web service returned to the web connector's

       ///  authenticate call, as the first element of the returned string array.</param>

       /// <param name="response">Contains the qbXML response from QuickBooks or qbposXML response from QuickBooks POS.</param>

       /// <param name="hresult">The hresult and message could be returned as a result of certain errors that could occur when 

       /// QuickBooks or QuickBooks POS sends requests is to the QuickBooks/QuickBooks POS request processor

       /// via the ProcessRequest call.If this call to the request processor resulted in an error (exception) instead of a 

       /// response, then the web connector will return the corresponding HRESULT and its text message in the hresult and message 

       /// parameters.If no such error occurred, hresult and message will be empty strings.</param>

       /// <param name="message">See above under hresult.</param>

       /// <returns>The <see cref="int"/>A positive integer less than 100 represents the percentage of work completed.</returns>

       [OperationContract(Action = "http://developer.intuit.com/receiveResponseXML")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override int receiveResponseXML(string ticket, string response, string hresult, string message)

       {

       }

 

       /// <summary>Allows your web service to return the last web service error, normally for display to the user, before 

       /// causing the update action to stop.</summary>

       /// <param name="ticket">The ticket from the web connector. This is the session token your web service returned to the web connector's 

       /// authenticate call, as the first element of the returned string array.</param>

       /// <returns>The message <see cref="string"/> describing the problem and any other information that you want your user to see</returns>

       [OperationContract(Action = "http://developer.intuit.com/getLastError")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override string getLastError(string ticket)

       {

       }

 

       /// <summary>Tells your web service that the web connector is finished with the update session</summary>

       /// <param name="ticket">The ticket from the web connector. This is the session token your web service returned to the web connector's 

       /// authenticate call, as the first element of the returned string array</param>

       /// <returns>The <see cref="string"/>Specify a string that you want the web connector to display to the user showing the status of

       /// the web service action on behalf of your user.This string will be displayed in the web connector UI in the status column.</returns>

       [OperationContract(Action = "http://developer.intuit.com/closeConnection")]

       [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]

       public override string closeConnection(string ticket)

       {

       }
Consolibyte has some good information on his wiki as well.






2 comments:

thea thomas said...

Excellent article to read. feel free to visit our site. If you want an IT Company and solution provider that provides Quickbook software solution, feel free to visit us. We are QBM IT Services, aside from quickbooks, we offer also different it services, like cuztomized web-base sytem, responsive website, payroll system, networking, and we can supply computer with specs that you want to request.

QuickBooks Hosting said...

QuickBooks Hosting
https://www.myqbhost.com/quickbooks-hosting.html