Я не могу заменить ключ sk_test на ключ sk_live в Stripe с помощью облачных функций Firebase - PullRequest
0 голосов
/ 14 мая 2018

У меня есть приложение React Native, работающее на базе Firebase. Я интегрировал с Stripe. Токен создается клиентом, а облачная функция firebase создает заряд с этим токеном. Я собрал приложение и проверил платежи с помощью клавиш test в Stripe.

Я заменил тестовые клавиши на живые клавиши.

Действующий открытый ключ работает в приложении React Native и успешно создает токен.

вот функция для создания кода токена в приложении React Native

import Stripe from 'react-native-stripe-api';

async payByCard() {
    const { user } = this.props;
    const uid = user.uid;
    const { number, exp_month, exp_year, cvc } = this.state;
    this.setState({ loading: true });
    const apiKey = 'pk_live_#######################';
    const client = new Stripe(apiKey);
    try {
      const token = await client.createToken({
         number,
         exp_month,
         exp_year,
         cvc,
      });
      this.props.addToken({ token }, uid);
    } catch (error) {
      this.setState({ error: error.message, loading: false });
    }
  }

Облачные функции Firebase все еще используют секретный тестовый ключ.

вот громкая функция для создания заряда.

import * as functions from 'firebase-functions';
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const stripe = require('stripe')(functions.config().stripe.testkey)

export const stripeCharge = functions.database
  .ref('/payments/{userUid}/{paymentUid}')
    .onWrite((change, context) => {
      const payment = change.after.val();
      const userUid = context.params.userUid;
      const paymentUid = context.params.paymentUid;

      if (!payment || payment.charge || !payment.pendingBasket) return;

      return admin.database()
        .ref(`/users/${userUid}`)
        .once('value')
        .then(snapshot => {
          return snapshot.val();
        })
        .then(customer => {
          const amount = Number(payment.pendingBasket.total * 100).toFixed(0)
          const idempotency_key = paymentUid;
          const source = payment.token.id;
          const currency = 'gbp';
          const description = `Athalens ${customer.address.FirstName} ${customer.address.LastName} - ${customer.address.PostCode}`
          const charge = {amount, currency, description, source};

          return stripe.charges.create(charge, { idempotency_key });
        }).catch((error) => {
          console.log('error 1 =' + error.message);
          admin.database()
            .ref(`/payments/${userUid}/${paymentUid}/status`)
            .set(error.message)
        })
        .then(charge => {
          admin.database()
            .ref(`/payments/${userUid}/${paymentUid}/charge`)
            .set(charge)
            if (charge.status === "succeeded") {
              customerOrders(userUid, paymentUid)
              photographerUid(userUid, paymentUid)
              clearBasket(userUid)
              confirmation(userUid, paymentUid);
            } else {
              decline(userUid, paymentUid)
            }
        }).catch((error) => {
          console.log('error 2 =' + error.message);
        })
    })

Процесс загрузки секретного ключа в firebase, который я делаю:

1. Williams-MBP:~ williamgoodhew$ cd /Users/williamgoodhew/projects/athalens/athalens_server_code/basket/functions

2. Williams-MBP:functions williamgoodhew$ firebase functions:config:set stripe.token=“sk_live_#################”

3. Williams-MBP:functions williamgoodhew$ firebase deploy --only functions

Когда я тестирую систему реальных платежей, создается токен, но плата не взимается. и я получаю следующую ошибку в журнале облачных функций:

No such token: tok_############; a similar object exists in live mode, but a test mode key was used to make this request.

1 Ответ

0 голосов
/ 16 мая 2018

Я связался с Firebase, и это было моей глупой ошибкой.

В моей облачной функции я инициализировал свой тестовый ключ "

const stripe = require ('stripe') (functions.config (). Stripe.testkey)

"вместо использования" stripe.token ".

Я изменил stripe.testkey на stripe.token.и все работало нормально.

...