Firestore - облачная функция - получает информацию о пользователе Stripe с помощью onRequest для Android - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь получить информацию о зарегистрированном пользователе из моего приложения Android после запуска функции onRequest, когда пользователь регистрируется для учетной записи Stripe Standard Connect . Причина этого в том, что я хотел бы добавить Stripe accountId пользователя в базу данных пользователя в Firestore, чтобы я мог отслеживать, к какому пользователю привязаны учетные записи Stripe Connect.

Я видел это сообщение , которое отправляет меня на эту ссылку однако я не слишком уверен в том, как вызвать его с моей облачной функцией onRequest.

Вот мой функция облака:

const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
const stripeToken = require('stripe')(functions.config().stripe.token);
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser')();
const app = express();
app.use(cors({ origin: true }));

exports.stripeCreateOathResponseToken = functions.https.onRequest((req, res) => {

    let rawbody = req.rawBody;
    console.log("rawbody: " + rawbody); // <-- usually comes back with req.rawbody
    console.log("request.body.account: " + req.body.account); // <-- returns stripe account number
    return stripeToken.oauth.token({
        grant_type: 'authorization_code',
        code: req.query.code, //<-- works with onRequest ((req, res)
    }).then(function (response) {
        return res.redirect('http://MyWebSite.com/') //<-- works with onRequest
    })
.then(function(response){

        return addAccountToFirebase() //<-- shows error in firebase log but still executes
        // error: Error: Can't set headers after they are sent.

        return exports.app; // shows error: Error: Can't set headers after they are sent.

    })
.catch(error => {
        res.send(error)
    })
});

function addAccountToFirebase(user) {
    user = stripeToken.auth().customer.email
    return admin.firestore().collection('Users').doc(user.email).update({userStripeCusId: customer.id});
}

код с веб-сайта firebase декодирование и проверка токена userID

// Express middleware that validates Firebase ID Tokens passed in the Authorization HTTP header.
// The Firebase ID token needs to be passed as a Bearer token in the Authorization HTTP header like this:
// `Authorization: Bearer <Firebase ID Token>`.
// when decoded successfully, the ID Token content will be added as `req.user`.
const validateFirebaseIdToken = async (req, res, next) => {
  console.log('Check if request is authorized with Firebase ID token');

  if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
      !(req.cookies && req.cookies.__session)) {
    console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.',
        'Make sure you authorize your request by providing the following HTTP header:',
        'Authorization: Bearer <Firebase ID Token>',
        'or by passing a "__session" cookie.');
    res.status(403).send('Unauthorized');
    return;
  }

  let idToken;
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
    console.log('Found "Authorization" header');
    // Read the ID Token from the Authorization header.
    idToken = req.headers.authorization.split('Bearer ')[1];
  } else if(req.cookies) {
    console.log('Found "__session" cookie');
    // Read the ID Token from cookie.
    idToken = req.cookies.__session;
  } else {
    // No cookie
    res.status(403).send('Unauthorized');
    return;
  }

  try {
    const decodedIdToken = await admin.auth().verifyIdToken(idToken);
    console.log('ID Token correctly decoded', decodedIdToken);
    req.user = decodedIdToken;
    console.log("req.user: " + req.user + " from exports.app")
    next();
    return;
  } catch (error) {
    console.error('Error while verifying Firebase ID token:', error);
    res.status(403).send('Unauthorized');
    return;
  }
};

app.use(cors);
app.use(cookieParser);
app.use(validateFirebaseIdToken);

exports.app = functions.https.onRequest(app);

Вот пример того, как я ' может добавить идентификатор клиента Stripe с помощью onCreate Call

// When a user is created, register them with Stripe
exports.createStripeCustomerOG = functions.auth.user().onCreate(async (user) => {
  const customer = await stripeToken.customers.create({email: user.email});
  return admin.firestore().collection('Users').doc(user.email).update({userStripeCusId: customer.id});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...