Я пытаюсь получить 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)