需要帮助使用 python-quickbooks 库和 Quickbooks 会计 API
Need Help Using python-quickbooks library and Quickbooks Accounting API
我正在尝试为 Python 实施 Quickbooks API,以根据交易生成发票,并将它们发送到我的 quickbooks 帐户。我正在使用 this python 库来访问 API,该库目前的版本为 0.5.1,可在 PyPI 上使用。我在将我的应用程序连接到 Quickbooks Online 时遇到问题。
我已经在 Quickbooks 上创建了一个开发者帐户,并且可以访问我的应用程序令牌、消费者密钥和消费者机密。图书馆 github 页面上的指南让我感到困惑,因为在 "Connecting your application to 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'
因为我收到错误,所以一定是哪里出了问题,但我现在不知道该去哪里。
我找到了问题的答案。在阅读了这个 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)
我正在尝试为 Python 实施 Quickbooks API,以根据交易生成发票,并将它们发送到我的 quickbooks 帐户。我正在使用 this python 库来访问 API,该库目前的版本为 0.5.1,可在 PyPI 上使用。我在将我的应用程序连接到 Quickbooks Online 时遇到问题。
我已经在 Quickbooks 上创建了一个开发者帐户,并且可以访问我的应用程序令牌、消费者密钥和消费者机密。图书馆 github 页面上的指南让我感到困惑,因为在 "Connecting your application to 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'
因为我收到错误,所以一定是哪里出了问题,但我现在不知道该去哪里。
我找到了问题的答案。在阅读了这个 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)