Isanka Thalagala
Isanka Thalagala

Reputation: 1731

Stripe Payment integration error 'No such token'

I want to integrate Stripe into my ASP.NET MVC application. So, As the first step, I'm trying to do it with simple code.

This is my simple code below,

        var customers = new CustomerService();
        var charges = new ChargeService();

        var publishableKey = "pk_test_51KseuBH1Mw1tyjglBiJls20038FcgbHr";
        StripeConfiguration.SetApiKey(publishableKey);
        StripeConfiguration.ApiKey = "sk_test_51KseuRqoYQ6YGD7TNzPp0051boOPvQ";
        var customer = customers.Create(new CustomerCreateOptions
        {
            Email = "[email protected]",
            Source = publishableKey
        });

        var charge = charges.Create(new ChargeCreateOptions
        {
            Amount = 500,
            Description = "Sample Charge",
            Currency = "usd",
            Customer = customer.Id
        });

I have tried different codes on forams. But it always returns the same error below,

No such token: 'pk_test_51KseuBHaMw1tyjglBiJls20038FcgbHr'

This is my Stripe keys,

enter image description here

Did I define secret key and publishable key incorrectly?

Upvotes: 0

Views: 1783

Answers (5)

Manish Jain
Manish Jain

Reputation: 65

You need to add secretKey in the setapikey function.

// StripeConfiguration.SetApiKey(publishableKey);
StripeConfiguration.SetApiKey(secretKey);

Upvotes: 0

Isanka Thalagala
Isanka Thalagala

Reputation: 1731

I was missing creating the card and token generate. Above I have assigned the publishable token as the source value, not generated token.

Here is the full working code.

public async Task<ProcessPaymentResult> ProcessPaymentAsync(ProcessPaymentRequest processPaymentRequest)
        {
            var processPaymentResult = new ProcessPaymentResult();

            try
            {    
                var customers = new CustomerService();
                var charges = new ChargeService();
               
                var options = new RequestOptions
                {
                    ApiKey = // your Secret Key
                };

                #region Card payment checkout                              
                var creditCardType = processPaymentRequest.CreditCardType.ToString();              
                var optionToken = new TokenCreateOptions
                {
                    Card = new TokenCardOptions
                    {
                        Number = processPaymentRequest.CreditCardNumber,
                        ExpMonth = processPaymentRequest.CreditCardExpireMonth,
                        ExpYear = processPaymentRequest.CreditCardExpireYear,
                        Cvc = processPaymentRequest.CreditCardCvv2,
                        Name = processPaymentRequest.CreditCardName,
                        Currency = _workContext.WorkingCurrency.CurrencyCode                        
                    },
                };
                var tokenService = new TokenService();
                Token paymentToken = await tokenService.CreateAsync(optionToken, options);

                #endregion

                #region Stripe Customer

                var customer = new Customer();
                var customerEmail = processPaymentRequest.CustomValues["CustomerEmail"].ToString();
                // Search customer in Stripe
                var stripeCustomer = await customers.ListAsync(new CustomerListOptions
                {
                    Email = customerEmail,
                    Limit = 1
                }, options);

                if (stripeCustomer.Data.Count==0)
                {
                    // create new customer
                    customer = await customers.CreateAsync(new CustomerCreateOptions
                    {
                        Source = paymentToken.Id,
                        Phone = processPaymentRequest.CustomValues["Phone"].ToString(),
                        Name = processPaymentRequest.CustomValues["CustomerName"].ToString(),
                        Email = customerEmail,
                        Description = $" { processPaymentRequest.CustomValues["RegisteredEmail"]};{ processPaymentRequest.CustomValues["CustomerName"] }",
                    }, options);

                }
                else
                {
                    // use existing customer
                    customer = stripeCustomer.FirstOrDefault();
                }

                #endregion

                #region Stripe charges                             

                var charge = await charges.CreateAsync(new ChargeCreateOptions
                {
                    Source = paymentToken.Id,//Customer = customer.Id,
                    Amount = (int)(Math.Round(processPaymentRequest.OrderTotal, 2) * 100),
                    Currency = _workContext.WorkingCurrency.CurrencyCode,
                    ReceiptEmail = customer.Email,
                    Description = $" { processPaymentRequest.CustomValues["RegisteredEmail"]};{ processPaymentRequest.CustomValues["CustomerName"] }",

                }, options);


                if (charge.Status.ToLower().Equals("succeeded"))
                {
                    processPaymentResult.NewPaymentStatus = PaymentStatus.Paid;
                    processPaymentResult.CaptureTransactionId = charge.Id;
                }
                else
                {
                    processPaymentResult.AddError("Error processing payment." + charge.FailureMessage);
                }
                #endregion

            }
            catch (Exception ex)
            {
                processPaymentResult.AddError(ex.Message);
            }
            return processPaymentResult;
        }

Upvotes: 0

yuting
yuting

Reputation: 1694

The source value only accepts payment source created via the Token or Sources APIs.

When creating a customer in your sample code, the Source was assigned with publishableKey which is invalid and that's probably why "No such token" was returned.

If you do not have any source created upfront, then Source should be removed from your customer creation request.

Upvotes: 0

qichuan
qichuan

Reputation: 2039

It seems you copied only the first line of the API Key.

Please make sure that you are using the complete API Key in your application, and you don't need to use publishable key in your backend integration.

Upvotes: 0

kmschaal
kmschaal

Reputation: 76

The publishable key must not be used in your backend code. It is for your client-side code, as described in the documentation: https://stripe.com/docs/keys. Moreover, the Source property on the customer describes the payment method: https://stripe.com/docs/api/customers/create?lang=dotnet. I can recommend getting started with Stripe with the quick start guide: https://stripe.com/docs/payments/quickstart.

Upvotes: 1

Related Questions