Grasshopper27
Grasshopper27

Reputation: 123

Stripe Payment Error: Must provide source or customer

I've been trying to implement a payment method for a shopping cart using card information attached to the user via a subscription model. And while the latter works fine, whenever I attempt to create a charge for the cart, I get the "Must provide source or error."

Here's some code to get started. Let me know if you need more.

checkouts_controller.rb

 def create

   customer = Stripe::Customer.create(
   source: params[:stripeToken],
   email: '[email protected]',
 )

   charge = Stripe::Charge.create(
   amount: current_cart.total,
   currency: 'usd',
   description: "Order ##{current_cart.id}"
 )

end

Error logs from Stripe Post Body

 {
   "amount": "9500",
   "currency": "usd",
   "description": "Order #1"
 }

And from the response body

 {
   "error": {
   "code": "parameter_missing",
   "doc_url": "https://stripe.com/docs/error-codes/parameter-    missing",
   "message": "Must provide source or customer.",
   "type": "invalid_request_error"
 }

}

I’m using the standard 4242 4242 4242 4242 card that is actually recorded and attached to my user via my subscription model. Card info like the brand, last four digits, expiration month and year all appear in my view when I go to add a different card. The stripe_id is also present when I check in the console.

I have checked stripe documentation and copied the snippet from their create action from https://stripe.com/docs/checkout/rails but this only trigged the error “Cannot charge a customer with no active card” despite the fact that this card is currently being used for a subscription.

So where did I goof at?

Upvotes: 2

Views: 4403

Answers (2)

hmunoz
hmunoz

Reputation: 3341

moving from comment to an answer

Hi @Grasshopper27, looks like the customer you created is not being created with the source. You should look into Dashboard -> Logs to look at the request body for the /customer creation request and see if the token is being passed in.

I would also like to note that this Rails doc is a bit outdated, you should try out updated Checkout to really simplify your integration: stripe.com/docs/payments/checkout

Upvotes: 1

Máté
Máté

Reputation: 2345

You need to make sure that the customer you create is passed in on the charge create call:

   charge = Stripe::Charge.create(
     customer: customer,
     amount: current_cart.total,
     currency: 'usd',
     description: "Order ##{current_cart.id}"
   )

Or you can use the source directly as:

   charge = Stripe::Charge.create(
     source: params[:stripeToken],
     amount: current_cart.total,
     currency: 'usd',
     description: "Order ##{current_cart.id}"
   )

Both options and examples can be found here

Upvotes: 5

Related Questions