aditya_medhe
aditya_medhe

Reputation: 372

Stripe does not let a charge be associated with a customer with one-time source

As the title says, I am trying to make a payment using a one-time source (credit card) that is not being saved in the customer's profile. I still want to be able to record that charge on the customer's profile on Stripe.

According to the docs, this can be done by passing the customer's id in customer key in the payload sent to Stripe.customers.createCharge. However, on doing that, I receive an error stating the card is not linked with the customer (which obviously is not, and I don't want it to be).

Customer cus_*** does not have card with ID tok_visa

To get around this, temporarily I have applied the fix mentioned in this answer which basically involves creating a temporary card for the payment and then deleting it.

I was wondering how does the API not work when it is clearly documented otherwise, hope someone experienced with Stripe chimes in on the same.

Here is the code I'm trying to get to run:

await stripeService.charges.create({
    source: token, // temporary token received from Checkout
    customer: user.stripeCustomerId, // the Stripe customer ID from my database
    amount,
    currency: 'usd',
    description: 'Test charge'
});

Upvotes: 1

Views: 1922

Answers (2)

Chris Stanley
Chris Stanley

Reputation: 41

I was able to achieve this by creating the source first followed by the charge where you specify the customerId and sourceId as below:

            //Create the source first
            var options = new SourceCreateOptions
            {
                Type = SourceType.Card,
                Card = new CreditCardOptions
                {
                    Number = Number,
                    ExpYear = ExpYear,
                    ExpMonth = ExpMonth,
                    Cvc = Cvc
                },
                Currency = "gbp"
            };

            var serviceSource = new SourceService();
            Source source = serviceSource.Create(options);

            //Now do the payment
            var optionsCharge = new ChargeCreateOptions
            {
                Amount = 500,
                Currency = "gbp",
                Description = "Your description",
                SourceId = source.Id,
                CustomerId = "yourcustomerid"
            };
            var service = new ChargeService();
            service.Create(optionsCharge);

            result = "success";

Upvotes: 0

karllekko
karllekko

Reputation: 7198

The single-use sources document that you link to explicitly only works with Sources, but tok_visa will create a Card object instead. I believe that's why you get the error.

If you try the code with a Source(it has an ID like 'src_xxx') that you obtain through Elements/Checkout on your frontend with, for example, createSource, it will succeed, I've just tested it. You can also test with this code :

const src = await stripe.sources.create({
    type : "card",
    token : "tok_visa"
});

const charge = await stripe.charges.create({
    source : src.id,
    customer : "cus_xxxx",
    amount : 1000,
    currency : "usd"
});

Upvotes: 1

Related Questions