0

I am implementing Stripe intent payment in my Angular + Firebase app. I implemented Firebase function like this from example on official documentation.

My problem is that if I try to do payment with mocked card from Stripe documentation, it is working good just if I set in network tab for throttling something else than no throttling. If I set Fast 4G, slow 4G, 3G everything is working good, it trigger on button click the handleSubmit function and it will add 50€ to my stripe account. But if I set no throttling, nothing happens in my app it just refreshes the page.

Where could the problem be?

const functions = require('firebase-functions');
const stripe = require('stripe')(functions.config().stripe.secret); // Store your Stripe secret in Firebase functions config

const calculateOrderAmount = (items: any) => {
  let total = 0;
  items.forEach((item: any) => {
    total += item.amount; // Assuming `item.amount` contains the price
  });
  return total;
};

exports.createPaymentIntent = functions.https.onCall(
  async (data: any, context: any) => {
    const { items } = data; // Accept the items from the client

    const paymentIntent = await stripe.paymentIntents.create({
      amount: calculateOrderAmount(items),
      currency: 'eur',
      automatic_payment_methods: { enabled: true },
    });

    return {
      clientSecret: paymentIntent.client_secret,
      dpmCheckerLink: `https://dashboard.stripe.com/settings/payment_methods/review?transaction_id=${paymentIntent.id}`,
    };
  }

On my frontend I have code like this app.component.ts:

async ngOnInit() {
    const items = [
      { amount: 5000 }, // Example: replace with actual items from your cart
    ];
    const { clientSecret } = await this.paymentService.createPaymentIntent(
      items
    );
    console.log(clientSecret);
    const elements = await this.paymentService.loadStripeElements(clientSecret);

    if (elements) {
      this.elements = elements;
      this.paymentElement = elements.create('payment');
      this.paymentElement.mount('#payment-element');
    }
  }

  async handleSubmit() {
    const orderId = '123';
    const result = await this.paymentService.stripe.confirmPayment({
      elements: this.elements,
      confirmParams: {
        return_url: `https://localhost:4200/success-order/${orderId}`, // Replace with your success URL
      },
    });
  }

and my payment service looks like this:

async createPaymentIntent(items: any[]) {
    const createPaymentIntent = this.functions.httpsCallable(
      'createPaymentIntent'
    );
    const response = await createPaymentIntent({ items }).toPromise();
    return response;
  }

  async loadStripeElements(clientSecret: string) {
    console.log(clientSecret);
    const appearance = {
      theme: 'night',
    } as any;
    const elements = this.stripe.elements({ appearance, clientSecret });
    return elements;
  }
2
  • Can you add more logs to trace down where the specific issue is? When you click 'pay' are you saying that a payment intent id is not created?
    – pgs
    Commented Sep 26 at 13:49
  • Well, yes nothing happened, i have no logs, only thing what i see is that no POST request is created when i click on button pay, with 3G or something else, it is created
    – Alan Dolan
    Commented Sep 28 at 18:36

0