Android Firestore Stripe - Добавить источник оплаты - PullRequest
0 голосов
/ 01 мая 2020

Обновление снизу

Я пытаюсь создать страницу регистрации в моем приложении 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'

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Хотя я не эксперт Firebase, со своей стороны Android вы хотите вызвать облачную функцию с параметрами идентификатора клиента и идентификатора PaymentMethod, чтобы передать их облачной функции.

Передавая параметры, показанные здесь: { ссылка }

Затем в облачной функции вы хотите присоединить PaymentMethod к Заказчику (как вы это делаете, используя stripe-node) и сделать его Клиент по умолчанию для подписок, как показано здесь: https://stripe.com/docs/billing/subscriptions/payment#signup -3

Затем вы должны создать подписку на клиента для конкретного плана, снова используя stripe-node, как показано здесь https://stripe.com/docs/billing/subscriptions/payment#signup -4

0 голосов
/ 05 мая 2020

Вот мой рабочий код. (Я использовал некоторые данные-заполнители для заполнения переменных)

exports.addPaymentSource = functions.https.onCall((data, context) =>{

    // Create Payment Method
    stripe.paymentMethods.create( {

        type: 'card',
        card: {
          number: '4242424242424242',
          exp_month: 5,
          exp_year: 2021,
          cvc: '314',
        },
    }) 
    .then(pm => {

         return stripe.paymentMethods.attach(pm.id, { customer: 'cus_HCCNMAAwRhNM3c' })

    })
    .then(pm => {

        console.log('final step');
        console.log('paymentMethod: ', pm.id);
        admin.firestore().collection('users').doc('LzgbQBtk0QSZi7QISIbV').set({token: pm.id});
        return admin.firestore().collection('users').doc(user.uid).collection('membership').set({token: pm.id});

        })
    .catch(error => { return null });
});

Поэтому я вручную вставил некоторые переменные, чтобы убедиться, что мои функции функционируют. Идентификатор клиента и данные карты необходимо передать из приложения Android. Эти данные карты - единственные, которые мне нужны для подписки

'pm' - это возвращенный объект Payment Method, в котором id - это переменная, которая должна быть присоединена к пользователю.

Наконец, pm.id - это токен, который должен быть сохранен внутри пожарного депо. При этом запускается моя облачная функция настройки подписки (не отображается).

Отображаемый код показывает, как избежать вложенных операторов затем, и Android прямой вызов функции firestore. Хотя это и не показано, поле данных может вызывать ключевое слово любой переменной «data.cardnbr».

Этот метод исключает любое использование SetupIntents. Несмотря на то, что это невероятно эффективно для тарификации на основе подписки, это может быть не лучшим решением для прямых платежей.

...