Обновление снизу
Я пытаюсь создать страницу регистрации в моем приложении Android, которое регистрирует пользователей для подписки через Stripe. То, на чем я застрял, - это добавление источника оплаты из Android через облачную функцию и получение токена от Stripe.
Я решил, что автоматически добавляю недавно созданного пользователя в Stripe. А также создание подписки, когда (/users/{userId}/membership/token
) записывается или изменяется.
Вкл. Android Я могу получить данные кредитной карты через ввод ..
PaymentMethodCreateParams.Card card = cardInputWidget.getPaymentMethodCard();
Затем мне нужно отправить это в мою облачную функцию, используя ..
mFunctions = FirebaseFunctions.getInstance();
mFunctions.getHttpsCallable("addPaymentSource")
.call()
.addOnCompleteListener(task -> {
...
Поскольку у меня возникают проблемы с поиском информации по этому вопросу, вот все, что у меня есть для этой облачной функции (Javascript)
exports.addPaymentSource = functions.https.onCall((data, context) =>{
const pm = await stripe.paymentMethods.attach('pm_678', {customer: 'cus_123'});
return admin.firestore().collection('users').doc(user.uid).get('membership').set({token: token});
}
Мне нужно получить номер клиента, который сохраняется по адресу - /users/ndomuser.uid‹/customerId '. Также передайте метод оплаты через мой http-вызов данных и передайте / получите user_id (который был бы создан задолго до всего этого).
Я зашел так далеко, просматривая это видео на YouTube и преобразовывая мой код. Платежи по подписке с Stripe, Angular и Firebase
Я также довольно часто ссылался на примеры облачных функций Stripe. Одна проблема заключается в том, что все, кажется, используют этот код (ниже), который не работает в моей реализации. Большинство руководств / примеров не используются для подписок.
// Add a payment source (card) for a user by writing a stripe payment source token to Cloud Firestore
exports.addPaymentSource = functions.firestore.document('/stripe_customers/{userId}/tokens/{pushId}').onCreate(async (snap, context) => {
const source = snap.data();
const token = source.token;
if (source === null){
return null;
}
try {
const snapshot = await admin.firestore().collection('stripe_customers').doc(context.params.userId).get();
const customer = snapshot.data().customer_id;
const response = await stripe.customers.createSource(customer, {source: token});
return admin.firestore().collection('stripe_customers').doc(context.params.userId).collection("sources").doc(response.fingerprint).set(response, {merge: true});
} catch (error) {
await snap.ref.set({'error':userFacingMessage(error)},{merge:true});
return reportError(error, {user: context.params.userId});
}
});
Обновление:
Внесены небольшие изменения, чтобы попытаться заставить это работать ..
exports.addPaymentSource = functions.https.onCall((data, context) =>{
///users/{userId}/membership/token
// Create Payment Method
const paymentMethod = stripe.paymentMethods.create(
{
type: 'card',
card: {
number: '4242424242424242',
exp_month: 5,
exp_year: 2021,
cvc: '314',
},
}).then(pm => {
console.log('paymentMethod: ', paymentMethod.id);
return stripe.paymentMethods.attach(paymentMethod.id, { customer: 'cus_HCQNxmI5CSlIV5' })
.then(pm => {
return admin.firestore().collection('users').doc(user.uid).get('membership').set({token: pm.id});
});
});
});
Я уже близко, проблема в том, что paymentMethod.id 'undefined'