Node.js 云Firebase条带连接-检索授权代码/访问令牌、状态等

Node.js 云Firebase条带连接-检索授权代码/访问令牌、状态等,node.js,firebase,google-cloud-functions,stripe-payments,Node.js,Firebase,Google Cloud Functions,Stripe Payments,我正在尝试让Stripe Express Connect与我的Cloud Firebase函数一起工作 到目前为止,我已经能够设置我的Android应用程序来打开浏览器,并使用一些预先填充的表单开始注册过程。但是,一旦我的客户端使用特殊的URL发送到完成的屏幕(使用测试模式),我就无法从该URL中检索以下URL中的信息。我在第四步被卡住了 这些是我在过去一周里一直在寻找的信息来源,但似乎无法把它们放在一起 (一) (二) (三) 目前,我在Stripe中设置了一个webhook,每当我手动执行我

我正在尝试让Stripe Express Connect与我的Cloud Firebase函数一起工作

到目前为止,我已经能够设置我的Android应用程序来打开浏览器,并使用一些预先填充的表单开始注册过程。但是,一旦我的客户端使用特殊的URL发送到完成的屏幕(使用测试模式),我就无法从该URL中检索以下URL中的信息。我在第四步被卡住了

这些是我在过去一周里一直在寻找的信息来源,但似乎无法把它们放在一起

(一)

(二)

(三)

目前,我在Stripe中设置了一个webhook,每当我手动执行我的云函数时,我都会返回响应,但是返回成功响应后,我无法获取我的状态或授权代码值

--------------更新-----------------

下面是我用来将它们发送到URL(填写的连接表单)的代码

----------更新结束---------------

这是我试图从中获取代码和状态值的URL

https://connect.stripe.com/connect/default/oauth/test?code=ac_XXXXXXXXXXXXXXXXX&state=YYYYYYYYYYYYYYY

这是我在条带函数中遇到的错误:

Test webhook error: 500
Response
Error: could not handle the request
这是我在firebase函数日志中看到的错误:

Error: Invalid JSON received from the Stripe API
    at IncomingMessage.res.once (/srv/node_modules/stripe/lib/StripeResource.js:182:13)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
这是我的代码,虽然我不太确定当URL转到成功/重定向URL时如何调用它:

exports.stripeCreateOathResponseToken = functions.https.onRequest((req, res) => {
    // res.send("code: " + req.query.code); // doesnt work here
    // res.send("state: " + req.query.state);  // doesnt work here


    return stripe.oauth.token({
        grant_type: 'authorization_code',
        // code: req.query.code, // doesnt work for some reason
        code: "<code given in url hardcoded>",  // first shows as "authorization code does not belong to you" then shows "code has expired" after trying again a few minutes later
        state: req.query.state,  // not sure if this is working

    // }).then(function (res) {
    }).then(function (response) {
        // asynchronously called

        // return res.send("code: " + res.query.code)
        return response.stripe_user_id;
        // return response.stripe_user_id; // this doesnt work
        // return request.query.code; // this doesnt work
    });

});
感谢所有帮助/指导

------------------------------------更新日期:2020年2月27日------------------------

我想我在这个问题上取得了一些进展。我已经让我的webhook正确启动了。我现在还得到了完整的
request.rawbody
响应,我可以在stripe webhook仪表板和firebase cloud函数日志中看到这些响应

过程中的一个问题是,每当我调用
response.send()
,我都会收到一个错误,说
response.send()不是一个函数
,尽管许多其他来源显示正在使用
response.send()
。如果有人能对这件事有更多的了解,那将是有益的

看来我还有最后一个问题要解决。请参阅下面的错误信息

代码

const admin = require('firebase-admin');
// const database = admin.database();
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
const Chatkit = require('@pusher/chatkit-server');
const stripeToken = require('stripe')(functions.config().stripe.token);
const stripeWebhooks = require('stripe')(functions.config().keys.webhooks);
const express = require('express');
const cors = require('cors');
const endpointSecret = functions.config().keys.signing; //<-- is this correct?
const request = require('request-promise');
const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));


exports.stripeCreateOathResponseToken = functions.https.onRequest(cors((request, res) => {
    // Get the signature from the request header
    let sig = request.headers["stripe-signature"];

    let rawbody = request.rawBody;

    console.log("rawbody: " + rawbody);
    console.log("request.body: " + request.body);
    console.log("request.query.code: " + request.query.code);
    console.log("request.query.body: " + request.query.body);
    console.log("request.query.state: " + request.query.state);

    return stripeWebhooks.webhooks.constructEvent(request.rawBody, sig, endpointSecret);
}));


当你说“发送到已完成屏幕”时,你在哪里发送它们?您需要将它们发送到一些服务器端代码将处理您的
导出;这就是你正在做的吗?你如何将你收到的授权代码传递给你的云功能(条带工作流的第3步)??这不清楚。@floatingLomas,我将它们发送到成功/重定向URL<代码>https://connect.stripe.com/connect/default/oauth/test?code=ac_XXXXXXXXXXXXXXXXX&state=YYYYYYYYYYYYYYY
这是用户通过其Express系统成功注册Stripe Connect时的测试模式成功页面。您可以在web浏览器中尝试该URL,它会出现。在LIVEMODE中,它将是我实际的网站页面。@RenaudTarnec,我已经用您要求的信息更新了我的问题代码。对于步骤3,我让我的android应用程序通过一个包含必要条带信息的意图打开一个web浏览器。我无法使用webview,因为它无法加载[表单],我对此提出了一个问题,但仍然无法解决。()@Cflux这是他们用来连接的URL,它不是重定向URL。您应该将Firebase应用程序的URL作为重定向URL。
exports.stripeCreateOathResponseToken = functions.https.onRequest(cores((req, res) => {

    const authCode = req.query.code;
    const stateCode = req.query.state;


    return res.send("code: " + req.query.code + " state: " + req.query.state);
    // return res.send("code: " + req.body.code + " state: " + req.body.state); // <-- doesnt work

    return res.send("\nauthCode: " + authCode + "\nstateCode: " + stateCode)
}));
const admin = require('firebase-admin');
// const database = admin.database();
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
const Chatkit = require('@pusher/chatkit-server');
const stripeToken = require('stripe')(functions.config().stripe.token);
const stripeWebhooks = require('stripe')(functions.config().keys.webhooks);
const express = require('express');
const cors = require('cors');
const endpointSecret = functions.config().keys.signing; //<-- is this correct?
const request = require('request-promise');
const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));


exports.stripeCreateOathResponseToken = functions.https.onRequest(cors((request, res) => {
    // Get the signature from the request header
    let sig = request.headers["stripe-signature"];

    let rawbody = request.rawBody;

    console.log("rawbody: " + rawbody);
    console.log("request.body: " + request.body);
    console.log("request.query.code: " + request.query.code);
    console.log("request.query.body: " + request.query.body);
    console.log("request.query.state: " + request.query.state);

    return stripeWebhooks.webhooks.constructEvent(request.rawBody, sig, endpointSecret);
}));


Error: No signatures found matching the expected signature for payload. Are you passing the raw request body you received from Stripe? https://github.com/stripe/stripe-node#webhook-signing
    at Object.verifyHeader (/srv/node_modules/stripe/lib/Webhooks.js:117:13)
    at Object.constructEvent (/srv/node_modules/stripe/lib/Webhooks.js:12:20)
    at exports.stripeCreateOathResponseToken.functions.https.onRequest.cors (/srv/index.js:383:36)
    at corsMiddleware (/srv/node_modules/cors/lib/index.js:204:7)
    at cloudFunction (/srv/node_modules/firebase-functions/lib/providers/https.js:49:9)
    at /worker/worker.js:783:7
    at /worker/worker.js:766:11
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)