How to pass existing subscription details on stripe during checkout - javascript

I’ve different subscription plan on stripe starting from Zero. When customer sign up, I’m creating a subscription with free plan by default.
In the future, customer want to upgrade the plan through checkout session, how can I pass my existing subscription details to the checkout session to update the plan tagged to the subscription ID instead of creating multiple subscriptions.
I gone through the stripe create checkout session Doc but I couldn’t find a way to pass subscription ID in checkout session.
Any help would be much appreciated

You are trying to update an existing Subscription through a CheckoutSession, that is not supported.
If a customer uses Checkout to sign up for a new Price, that creates a completely new Subscription object. You cannot pass an existing Subscription ID as Checkout cannot modify that.
You should use Checkout in mode: setup to collect card details from your customer. This setup mode only collects card details but does not charge or create a Subscription on that Customer.
Then in your server-side code after you receive the checkout.session.completed webhook event, update the existing Subscription to switch from the "free" Price to the "paid" Price: https://stripe.com/docs/api/subscriptions/update

Related

How to get payout data in Stripe Connect?

I'm adding Stripe Connect to my app to send payments to the users,I need to create a payment dashboard where each user can see all the payments that were sent to them( like payment history). I've read here https://stripe.com/docs/api/payouts/create that I can retrieve list of all payouts or individual payout(by submitting payout id), but I can't find information on how to get payout data per user. For example, if I have user John Doe, I want to get all the payout information for John only with 1 API call, is it possible in Stripe Connect?
If you want to retrieve the list of payments on the connected account, you should retrieve the list of Charges using the stripeAccount header.
You can also make use of the auto-pagination built into Stripe SDKs to loop through the list.
Example
for await (const charge of stripe.charges.list({stripeAccount: 'connected_account_id'})) {
// Do something with charge
console.log(charge);
}
You may want to reach out to Stripe to check if you're eligible to use this beta where you can embed a payments dashboard component into your site : https://stripe.com/docs/connect/get-started-connect-embedded-uis
If I understand goodly your question, you want to retrieve connected accounts' payouts.
You have to know that payout api using is when you move money on your account. In the other hand, if you want to move money to any connected account you need to use transfert api.
Code
You need to know user connect account
const stripe = require('stripe')('API_KEY');
const transfers = await stripe.transfers.list({
destination: 'acct_id.....',
});

Update Stripe credit card that was saved with SetupIntent

I've saved the credit card for later usage with SetupIntent to the customer. Let's say that the user wants to edit his card (expiration/cvc/billing, etc..) after 5 days.
What would be the workflow for it?
Documentation got me confused because they propose to create a new SetupIntent and attach it to the customer. If that's so, what should we do with the previously added card?
For very good privacy reasons, there's very little you can "edit" on a user's payment methods. Stripe allows an almost unlimited number of paymentMethods attached to a customer. The recommended flow (as I also answered on Discord) is to attach the new paymentMethod - you can simply delete the previous one(s). When you query the API for a customer's payment Methods (list), they are returned in reverse chronological order - the first one is the most recent.

How to prevent shopping cart alterations in another tab when paymentintent is already created

Has anyone figured out a solution to this? I seem to have gotten to the same conclusion with no solution.
If I were to go the my app's checkout page, the payintent is created in the backend (explained the process below). So no after the payIntent is created, if i open a new tab and go the menu and add a new menu item, firestore will show the new (correct) total, but since the payment intent is created stripe charges the old (wrong) total.
What I am doing is
Every time the page loads, I send a GET request to my backend which verifies the identity of the user (using firestore/firebase).
Checks if there is a payment intent (payement intents are stored in firestore corresponding to the user)
A. if payintent does not exist under user create one
B. if payintent does exist retrieve payintent from stripe and check if it has .status===succeeded. IF it has succeeded create a new one and if it has not succeeded update the old one. The amount for all payIntents is calculated using total in firestore
(and ofc if the users cart is empty a payintent is not created)
Send back to the frontend the payInent.clienSecret and cart items to populate page
From the front end using stripe elements and confirmPayment confirm the payment
(using ngrok the page loads in about 800-1200ms so not too bad i think)
Possible solutions are using webhooks, when payintent is processing check and update the pricing but that seems like duct taped solution (if it were to even work). OR using webhooks when payment has succeeded update the payment, again seems like a duct tape solution (if it were to even work).
EDIT: possible solution 3 cofirmPayment in the backend but according to documentation that takes away 3ds authentication which is the reason I am doing confirmPayment in the front end anyways
SOLUTION: The missing piece is that you need to update the Payment Intent's amount when something is added to their cart. Once you add that I think that will solve your issue.
So a function to create payment intent and update payment intent (when there is already a payment intent created) on add to cart. And then a final update paymentIntent on the checkout page whenever they delete an item or if they edit the item
Thank you Justin Michael
I'm not sure I completely understand your question. If you confirm a Payment Intent client-side using its client secret the Payment Intent will attempt to charge whatever the current amount set on it is. Stripe will never use a previous or "old" amount.
As far as a solution, I recommend you retrieve the Payment Intent client-side using Stripe.js when your customer clicks on your "pay" button and see if the currently-set amount on the Payment Intent matches what you're currently displaying to them. If it doesn't match abort the payment process, update your state client-side based on the latest version of the Payment Intent you just retrieved, prompt the customer to confirm the new amount, and ask them to click on "pay" again.

Stripe - add a card for customer without payment

I have a customer that is logged into my application.
const customerId = '1234';
I want him to be able to add a card so he can use it later for purchasing items in my shop.
But theres many of possible requests and im not really sure which one should be used in such situation.
createSource();
createPaymentMethod();
createSetupIntent();
What is the proper way in Stripe to add a card by customer?
You'd use Setup Intents which will facilitate the authentication and saving of payment details to an existing Customer object. There's a guide here on how to achieve this.

Charging a saved card in stripe

I want to charge a saved card in stripe. But while charging the save card I also want user to enter the CVV, just as an additional check (kind of like what happens in amazon).
So far I've tried payment intent and payment method. So while creating the payment intent I'll pass the payment method id, which is in format of card_***. And I can see that the payment_intent.succeeded event on stripe dashboard and even in webhook. But in this flow I'm unable to ask the user for CVV information.
Is there anyway to achieve this through Stripe.
Here's some useful links that I found.
payment method
This is the link that I followed to achieve, it's just that I also want to ask for CVV before actual charging.
stripe doc for charging saved card
It is possible to recollect the CVC from your customer. As you mentioned, you’ll reuse the existing Payment Method, but additionally you’ll include a cardCvc element on the page where your customer can provide the CVC for their card. Then when you’re making the call to confirm the payment, you’ll pass that element into the payment_method_options.card.cvc parameter.
This is covered in more detail here:
https://stripe.com/docs/payments/save-during-payment-cards-only#web-recollect-cvc

Categories