首页 > 解决方案 > firebase 功能与 xero-node 的集成

问题描述

尝试创建一个由某些数据库或 onRequest 事件触发的 firebase 函数,该事件在 Xero 上创建付款以更好地管理传入的发票。

不确定我是否了解如何从 firebase 函数运行(如果可能)xero-node 库。

我一直在搞乱这两者,它似乎不像用秘密 ID 初始化对象和调用我期望的函数那么简单:

const xero = new XeroClient({
  clientId: '230823jff',
  clientSecret: 'sdfh39fhsdaf',
  redirectUris: [`http://localhost:3000/xero`],
  scopes: 'openid profile email accounting.transactions offline_access'.split(' '),
})

xero.accountingApi.getInvoices('tennetid093242')

看起来我需要使用以下内容生成访问密钥(在 12 分钟后到期):

let consentUrl = await xero.buildConsentUrl()
res.redirect(consentUrl)

搞乱邮递员中的api,这个流程感觉就像我让它变得比它应该的更复杂。

有没有办法我可以用管理范围或其他东西初始化它而不必担心访问密钥......或者我应该在客户端使用 xero-node......(当然不是)

有带有 xero-node 的 expressjs 版本,所以我是否可以通过将 redirectUri 设置为另一个 firebase 函数的地址来获取会话密钥来与 firebase onrequest 函数等效?


我慢慢地到某个地方..

我的 firebase 函数如下所示:

const xero = new XeroClient({
  clientId: '123213123123',
  clientSecret: '123123123123',
  redirectUris: ['http://localhost:5001/example/us-central1/xeroAuthCode'],
  scopes: ['openid', 'profile', 'email', 'accounting.transactions', 'accounting.settings', 'offline_access']
})

exports.xeroInit = functions.https.onRequest(async (req, res) => {
  let consentUrl = await xero.buildConsentUrl()
  res.redirect(consentUrl)
})

exports.xeroAuthCode = functions.https.onRequest(async (req, res) => {
  let tokenSet = await xero.apiCallback(req.url)
  console.log(tokenSet)
})

这个想法是我调用 xeroInit 并将令牌发送到 xeroAuth 这似乎有效,因为控制台记录 req.url 给出:

/?code=c5105f6ce943....230a23fsadf&scope=openid%20profile%20email%20accounting.transactions%20accounting.settings&session_state=tFC6G9Go_zBguCjIpy8-9gl6-9SWLTlUmY5CXMq49es.3c42d9ca9e53285596193bf423f791f3

但是我在尝试设置它时收到此错误 apiCallback

TypeError: Cannot read property 'callbackParams' of undefined

使用纯 express 应用程序进行测试,这非常有效,我希望这是 firebase 函数模拟器的错误...

因为这与 express 一起使用,所以我在我的 firebase 函数中使用 express 并使用 request.url 调用 apiCallback 工作......当我让它完全适用于想要一起使用 firebase 和 xero-node 的其他人时,我会更新答案。

标签: node.jsfirebasegoogle-cloud-platformgoogle-cloud-functionsxero-api

解决方案


编辑:啊,我认为您需要做的只是第二次使用以下方法初始化客户端:

await xero.initialize()

需要调用它来在 XeroClient 上设置相关的 openid-client

buildConsentUrl 还在后台调用await xero.initialize(),因此由于您在初始线程中调用它,因此它正确设置了客户端。由于 firebase 函数是孤立的,我认为您只需要调用 initialize() fn。



您需要让您希望通过 API 与之通信的 Xero 组织的用户通过整个 OAuth2.0 流程来生成 access_token。

我建议查看一个很好的示例应用程序,它显示了整个流程:https ://github.com/XeroAPI/xero-node-oauth2-app/blob/master/src/app.ts#L172


您的目标是帮助许多用户使用您的应用程序对他们的组织进行读写吗?或者您只是想为单个组织连接和自动化东西?

如果您尝试执行第二个操作,此视频将展示如何在 REST 客户端中生成初始 access_token 并将其插入您的代码流以不断刷新。https://www.youtube.com/watch?v=Zcf_64yreVI


推荐阅读