Cloud Firebase Stripe Connect - Получить код авторизации / токен доступа, состояние и т. Д. - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь получить Stripe Express Подключиться для работы с моими функциями Cloud Firebase.

До сих пор я смог настроить мое приложение Android, чтобы открыть браузер и начать процесс регистрации с некоторыми предварительно заполненными формами, однако, как только мой клиент будет отправлен на завершенный экран (в тестовом режиме) со специальным URL-адресом я не могу получить информацию из этого URL-адреса, следуя инструкции , приведенной . Я застреваю на шаге 4.

Это источники, которые я просматривал на прошлой неделе, но не могу собрать их вместе

1) https://firebase.google.com/docs/functions/http-events#using_existing_express_apps

2) Параметры в облачных функциях Firebase HTTPS

3) Функции Firebase Stripe Connect

В настоящее время я у меня установлен веб-крючок в Stripe, и я получаю ответные ответы всякий раз, когда вручную выполняю свою облачную функцию, однако с возвращенным ответом об успехе я не могу получить значения своего состояния или кода авторизации.

----- ------------ обновление --------------------

вот код, который я использую для отправки их к URL (заполненная форма подключения)

val openURL = Intent(Intent.ACTION_VIEW)
                    openURL.data = Uri.parse(
                            "https://connect.stripe.com/express/oauth/authorize?" +
                                    "redirect_uri=http://YourNeighborsBookshelf.com&" +
                                    "client_id=ca_32D88BD1XXXXXXXXXXXXXXXXXXXXXXXXXX&" +
                                    "state=" + mAuth.currentUser!!.uid +

                                    "&stripe_user[email]=" + userEmail +
                                    "&stripe_user[phone_number]=" + userPhoneNumberStripped +
                                    "#/")

                    startActivity(openURL)

---------- конец обновления ---------------

Вот URL, который я пытаюсь получить из кода и значений состояний из

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

Это ошибка, которую я получаю в функциях Stripe:

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
    });

});

Я также пробовал этот, который дает мне код успеха 200, но возвращает значения как undefined

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)
}));

Любая и вся помощь / направление приветствуется.

---------------------------- обновление 27.02.2020 ------- -------------------- -

Я думаю, что добился определенного прогресса в этом вопросе. Я заставил мой webhook корректно сработать, см. Этот пост . Теперь я также получаю полный ответ request.rawbody, который я вижу как на панели мониторинга полосы в виде полосы, так и в журнале облачных функций Firebase.

Одной из проблем на этом пути было то, что всякий раз, когда я звонил response.send(), я получал сообщение об ошибке response.send() is not a function, хотя многие другие источники указывали на использование 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);
}));

при запуске кода выше, я теперь получаю эту ошибку:


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)
...