Estoy tratando de configurar un botón para que el usuario administre su suscripción con Stripe Customer Portal y su integración de Firebase.
Problema, la documentación es válida para la versión anterior de Firebase (8) y estoy usando la nueva, Firebase 9.
Estamos del lado del cliente y esto es React.js.
Este es su código js para llamar a la función (puede ver el código completo aquí: https://github.com/stripe-samples/firebase-subscription-payments/blob/master/public/javascript/app.js ):
const functionLocation = 'us-east1'; const functionRef = firebase .app() .functions(functionLocation) .httpsCallable('ext-firestore-stripe-subscriptions-createPortalLink'); const { data } = await functionRef({ returnUrl: window.location.origin }); window.location.assign(data.url); });Con Firebase 9 debería ser algo como esto:
const functions = getFunctions(firebaseApp) export async function goToBillingPortal() { const functionRef = httpsCallable(functions, 'ext-firestore-stripe-subscriptions-createPortalLink'); const { data } = await functionRef({ returnUrl: window.location.origin }); window.location.assign(data.url); }La consola muestra 3 errores:
Access to fetch at 'https://us-central1-xxxxxxxxd76.cloudfunctions.net/ext-firestore-stripe-subscriptions-createPortalLink' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request. service.ts:206 POST https://us-central1-xxxxxxx76.cloudfunctions.net/ext-firestore-stripe-subscriptions-createPortalLink net::ERR_FAILED Uncaught (in promise) FirebaseError: internalAparentemente, el problema es que necesito especificar la ubicación del servidor (por ejemplo, us-central1) pero no puedo entender cómo hacerlo con Firebase 9. Todas las guías son para Firebase 8.
He probado diferentes cosas como:
const functions = getFunctions(firebaseApp).location("us-central1")o
const functionRef = httpsCallable(functions, 'ext-firestore-stripe-subscriptions-createPortalLink').location("us-central1")pero no funciona
¿Ideas?
También se puede definir dónde implementar con .region() , que creo que incluso acepta una lista:
const CLOUD_FUNCTIONS_REGION = "us-east1"; exports.billing_portal = functions.region( CLOUD_FUNCTIONS_REGION ).https.onCall( async (data, context: CallableContext) => { } );