2016-09-11 6 views
0

Ich versuche, die Quickbooks API für Python zu implementieren, um Rechnungen basierend auf Transaktionen zu generieren, und senden Sie sie an meine Quickbooks-Konto. Ich benutze this Python-Bibliothek für den Zugriff auf die API, die derzeit in Version 0.5.1 und ist verfügbar auf PyPI. Ich habe Probleme, meine Anwendung mit Quickbooks Online zu verbinden.Hilfe Hilfe Python-Quickbooks-Bibliothek und Quickbooks Accounting API

Ich habe ein Entwicklerkonto auf Quickbooks erstellt und habe Zugriff auf mein App-Token, Consumer-Key und Consumer Secret. Die Anleitung auf der GitHub-Seite der Bibliothek verwirrt mich, da unter "Ihre Anwendung mit Quickbooks Online verbinden" die Schritte 1 und 2 zusammenhängen, aber in gewisser Weise unabhängig voneinander sind; hauptsächlich wegen der Reinitialisierung der Client-Variablen.

Soll ich mehrere Quickbook-Objekte mit dem Namen "client" haben, die aber im gesamten Code neu initialisiert werden?

Mein Code sieht wie folgt aus:

def create_invoice(): 
    consumer_key = 'MY-CONSUMER-KEY' 
    consumer_secret = 'MY-CONSUMER-SECRET' 

    client = QuickBooks(
     sandbox=True, 
     consumer_key=consumer_key, 
     consumer_secret=consumer_secret, 
     callback_url='https://sandbox-quickbooks.api.intuit.com', 
    ) 

    authorize_url = client.get_authorize_url() 
    request_token = client.request_token 
    request_token_secret = client.request_token_secret 

    client = QuickBooks(
     sandbox=True, 
     consumer_key=consumer_key, 
     consumer_secret=consumer_secret 
    ) 

    client.authorize_url = authorize_url 
    client.request_token = request_token 
    client.request_token_secret = request_token_secret 
    client.set_up_service() 

    client.get_access_tokens(request.vars.oauth_verifier) 

    realm_id = request.vars.realmId 
    access_token = client.access_token 
    access_token_secret = client.access_token_secret 

    client = QuickBooks(
     sandbox=True, 
     consumer_key=consumer_key, 
     consumer_secret=consumer_secret, 
     access_token=access_token, 
     access_token_secret=access_token_secret, 
     company_id=realm_id 
    ) 

    invoice = Invoice() 
    line = SalesItemLine() 
    line.LineNum = 1 
    line.Description = "description" 
    line.Amount = 100 
    line.SalesItemLineDetail = SalesItemLineDetail() 
    item = Item.all(max_results=1, qb=client)[0] 

    line.SalesItemLineDetail.ItemRef = item.to_ref() 
    invoice.Line.append(line) 

    customer = Customer.all(max_results=1, qb=client)[0] 
    invoice.CustomerRef = customer.to_ref() 

    invoice.CustomerMemo = CustomerMemo() 
    invoice.CustomerMemo.value = "Customer Memo" 
    invoice.save(qb=client) 

Mit diesem Code, den ich den Fehler:

KeyError: 'Decoder failed to handle oauth_token with data as returned by provider. A different decoder may be needed. Provider returned: oauth_problem=parameter_absent&oauth_parameters_absent=oauth_verifier' 

Weil ich bin immer der Fehler etwas nicht in Ordnung sein, aber ich bin verwirrt wohin ich jetzt gehen soll.

Antwort

0

Ich fand die Antwort auf mein Problem. Nach dem Lesen dieser , wo sie den gleichen Fehler hatten, bekam ich ein besseres Gefühl dafür, was die Bibliothek tat; hauptsächlich der Strom, der hinter den Kulissen vor sich ging. Ich fand schließlich heraus, dass die Rückruf-URL, die ich geliefert hatte, falsch war. Wählen Sie eine Callback-URL aus, die zurück zu dem Punkt führt, an dem Sie über dem Code ausgeführt werden. Ich habe auch gewählt, um die meisten meiner Variablen in einer Datenbank zu speichern, damit ich sie für zukünftige Verwendung leicht zugänglich machen kann. Mein Code sieht jetzt so aus:

def create_invoice(): 
    consumer_key = 'MY-CONSUMER-KEY' 
    consumer_secret = 'MY-CONSUMER-SECRET' 
    rows = db(db.quickbooks_info).select() 
    p = [dict(realm_id=r.realm_id, access_token=r.access_token, access_token_secret=r.access_token_secret, consumer_key=r.consumer_key, 
      consumer_secret=r.consumer_secret, authorize_url=r.authorize_url, request_token=r.request_token, request_token_secret=r.request_token_secret) 
     for r in rows] 
    if len(p) == 0: 
     client = QuickBooks(
      sandbox=True, 
      consumer_key=consumer_key, 
      consumer_secret=consumer_secret, 
      callback_url='http://127.0.0.1:8800/SNotes/default/create_invoice' 
     ) 
     authorize_url = client.get_authorize_url() 
     request_token = client.request_token 
     request_token_secret = client.request_token_secret 

     db.quickbooks_info.update_or_insert((db.quickbooks_info.consumer_key == consumer_key), 
              consumer_key=consumer_key, 
              consumer_secret=consumer_secret, 
              authorize_url=authorize_url, 
              request_token=request_token, 
              request_token_secret=request_token_secret 
             ) 
    else: 
     if p[0]['access_token'] == None and p[0]['access_token_secret'] == None and p[0]['realm_id'] == None: 
      client = QuickBooks(
       sandbox=True, 
       consumer_key=p[0]['consumer_key'], 
       consumer_secret=p[0]['consumer_secret'] 
      ) 

      client.authorize_url = p[0]['authorize_url'] 
      client.request_token = p[0]['request_token'] 
      client.request_token_secret = p[0]['request_token_secret'] 
      client.set_up_service() 
      client.get_access_tokens(request.get_vars['oauth_verifier']) 

      realm_id = request.vars.realmId 
      access_token = client.access_token 
      access_token_secret = client.access_token_secret 
      db.quickbooks_info.update_or_insert((db.quickbooks_info.consumer_key == p[0]['consumer_key']), 
               access_token=access_token, 
               access_token_secret=access_token_secret, 
               realm_id=realm_id 
              ) 
     else: 
      client = QuickBooks(
       sandbox=True, 
       consumer_key=p[0]['consumer_key'], 
       consumer_secret=p[0]['consumer_secret'], 
       access_token=p[0]['access_token'], 
       access_token_secret=p[0]['access_token_secret'], 
       company_id=p[0]['realm_id'] 
      ) 

      invoice = Invoice() 

      line = SalesItemLine() 
      line.LineNum = 1 
      line.Description = "test" 
      line.Amount = 6969 
      line.SalesItemLineDetail = SalesItemLineDetail() 
      item = Item.all(max_results=1, qb=client)[0] 

      line.SalesItemLineDetail.ItemRef = item.to_ref() 
      invoice.Line.append(line) 

      customer = Customer.all(max_results=1, qb=client)[0] 
      invoice.CustomerRef = customer.to_ref() 

      invoice.CustomerMemo = CustomerMemo() 
      invoice.CustomerMemo.value = "Customer Memo" 
      invoice.save(qb=client)