【问题标题】:Need Help Using python-quickbooks library and Quickbooks Accounting API需要帮助使用 python-quickbooks 库和 Quickbooks Accounting API
【发布时间】:2016-09-11 23:00:43
【问题描述】:

我正在尝试为 Python 实现 Quickbooks API,以根据交易生成发票,并将其发送到我的 Quickbooks 帐户。我正在使用this python 库来访问 API,该 API 当前版本为 0.5.1,可在 PyPI 上使用。我无法将我的应用程序连接到 Quickbooks Online。

我在 Quickbooks 上创建了一个开发者帐户,并且可以访问我的应用令牌、消费者密钥和消费者密码。图书馆 github 页面上的指南让我感到困惑,因为在“将您的应用程序连接到 Quickbooks Online”下,步骤 1 和 2 似乎相关但彼此独立;主要是因为客户端变量的重新初始化。

我是否应该有多个名为 client 的 Quickbook 对象,但在我的代码中重新初始化它?

我的代码如下所示:

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)

使用此代码我得到错误:

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'

因为我收到了错误,所以肯定有问题,但我不知道现在该去哪里。

【问题讨论】:

    标签: python web2py quickbooks-online


    【解决方案1】:

    我找到了问题的答案。在阅读了这个thread 之后,他们有同样的错误,我对图书馆在做什么有了更好的了解;主要是幕后进行的流程。我最终发现我提供的回调 url 是错误的。选择一个回调 url,它指向您在上面的代码运行的位置。我还选择将大部分变量存储在数据库中,以便我可以轻松访问它们以备将来使用。我的代码现在看起来像这样:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多