【问题标题】:Firebase: How to trigger HTTPs onRequest function within a Realtime Database onCreate function?Firebase:如何在实时数据库 onCreate 函数中触发 HTTPs onRequest 函数?
【发布时间】:2019-06-24 09:24:32
【问题描述】:

在我的 VueJS 电子商务应用程序中单击“结帐”按钮后,将在我的 Firebase“订单”子节点中创建一个包含订单参数的新“订单”字段。我已经创建了一个实时数据库 onCreate 'newBuyerOrder' 功能,一旦创建了新的“订单”字段,就会向用户发送一封电子邮件,通知他这个新订单。现在,我还想调用我使用 HTTPs onRequest 函数构建的 REST API“/checkout”,以通过 Paypal REST SDK 处理订单。我该怎么做?

我尝试过的一种解决方法是构建 HTTPs onCall 函数,客户端浏览器可以调用该函数以使用订单参数通过 Paypal 处理订单,并使用“newBuyerOrder”onCreate 函数单独发送电子邮件。但不幸的是,HTTPs onCall 不允许客户端重定向。而且,你瞧,在进行 Paypal REST 调用时需要客户端重定向,因此 HTTPs onCall 不适用于我的目的。

在函数/package.json中

"dependencies": {
    "@sendgrid/mail": "^6.3.1",
    "firebase-admin": "~6.0.0",
    "firebase-functions": "^2.1.0",
    "paypal-rest-sdk": "^1.8.1"
}

在函数/src/index.ts中

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
import * as sendgrid from  '@sendgrid/mail'
import * as paypal from  'paypal-rest-sdk'

// init firebase admin
admin.initializeApp()

// set sendgrid api in function config
const SENDGRID_API_KEY = ...

// set paypal api in function config
paypal.configure({
  ...
});

// setup paypal payment object and redirect user to paypal payment 
page
export const checkout = functions.https.onRequest((req, res) => {
// 1.Set up a payment information object, Build PayPal payment 
request
  const payReq = JSON.stringify({
    ...
  })
// 2.Initialize the payment and redirect the user.
  paypal.payment.create(payReq, (error, payment) => {
    if (error) {
      // handle error
    } else {
      // redirect to paypal approval link
      for (let i = 0; i < payment.links.length; i++) {
        if (payment.links[i].rel === 'approval_url') {
          res.redirect(302, payment.links[i].href)
        }
      }
    }
  })
})


// send email and trigger paypal checkout api given new buyer order
export const newBuyerOrder = functions.database
.ref('users/{userId}/orders/{orderId}')
.onCreate((snapshot, context) => 
    // expected solution to call 'checkout' REST API from above
    // send email via sendgrid
    const msg = {...}
    return sendgrid.send(msg)
})

我希望在实时数据库中创建新的订单字段并且客户端被重定向到 Paypal 批准页面后调用“/checkout”API。

【问题讨论】:

    标签: firebase vuejs2 google-cloud-functions paypal-rest-sdk


    【解决方案1】:

    从另一个 Cloud Functions 调用一个 Cloud Functions 几乎从来都不是一个好主意。一方面,您需要为两次调用付费,而其中的工作只需一次即可完成。有更好的方法来重用代码。

    例如,您可以在实时数据库触发的云函数中包含支付代码?

    或者您可以提取该 Cloud Function 的业务功能,并将其放入常规 JavaScript 函数中,以便您从实时数据库触发的函数中调用。


    数据库触发器来自实时数据库到 Cloud Functions。不涉及客户端应用程序代码,因此也无法重定向。

    如果您想在操作完成后将响应发送回客户端,您通常会将客户端的响应写回数据库中客户端监视的位置。例如,您可以将响应写入:/users/{userId}/order_results/{orderId},然后客户端可以wait for a value at this location

    【讨论】:

    • 嗨@Frank van Puffelen,感谢您的快速回复。我的问题是客户端重定向。似乎只有 HTTPs onRequest 可以这样做,而不是实时数据库 onCreate。如果您有代码示例,我将不胜感激。再次感谢!
    • 我也为此写了一个答案。
    • 感谢@Frank van Puffelen 编辑回复。也许我的问题并不清楚。我想要做的是在 HTTPs onRequest 函数中使用 res.redirect(302, payment.links[i].href) 将客户端重定向到 paypal rest api。此步骤不能跳过,否则付款将无法处理。而且由于实时数据库 onCreate 无法重定向,我必须以某种方式将我的数据库参数传递给 HTTPs onRequest。有什么建议吗?
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2018-09-14
    • 2017-12-13
    • 1970-01-01
    • 2020-06-05
    • 2020-08-24
    • 2021-12-27
    • 2022-09-26
    相关资源
    最近更新 更多