I'm using Stripe element to create subscriptions and everything is fine ... except when quantity payment intent is $0
From the Stripe PaymentIntent docs:
The minimum amount is $0.50 US or equivalent in charge currency.
Here I have the method to create a payment intention with the stripe element
# Here I created an object of type subscription incompletely (@subscription)
# In such a way that the user can enter their credit card and with the help of
# @subscriptions confirm if everything is fine
def checkout
@subscription = Stripe::Subscription.create(
customer: current_user.stripe_customer_id, # stripe customer_id for suscription
items: [{
price: params[:price] # attached price of suscription plans
}],
payment_behavior: 'default_incomplete', # PaymentIntent with status=incomplete
expand: ['latest_invoice.payment_intent'] # return the payment_intent data
)
end
And it displays a checkout.html.erb where it will allow the user to place their card and then pay
# checkout.html.erb
<form id="payment-form">
<div >
<label for="card-element">
<!-- Debit/credit card -->
</label>
<div id="card-element">
<!-- a Stripe Element will be inserted here -->
</div>
<!-- Used to display Elements errors -->
<div id="card-errors" role="alert"></div>
</div>
<button id="submit">Submit Payment</button>
</form>
<script>
// Initialize stripe elements
var stripe = Stripe("<%= ENV['STRIPE_PUBLISHABLE_KEY'] %>");
var elements = stripe.elements();
var cardElement = elements.create('card');
cardElement.mount('#card-element');
var formElement = document.getElementById('payment-form');
formElement.addEventListener('submit', function(event) {
event.preventDefault();
# here I create the payment intention but when the plan has a subscription of $ 0
# it
# does not recognize me neither the field client_secret nor the payment_intent
stripe.confirmCardPayment("<%=
@subscription.latest_invoice.payment_intent.client_secret %>", {
payment_method: { card: cardElement }
}).then(function(result) {
if (result.error) {
console.log(result.error.message);
window.location.reload();
} else {
window.location.href = "/" ;
}
});
});
In short, everything works fine for me except when the payment intention is $ 0 and the documentation says "the minimum is 0.50"
Is there a way to create a subscription with $ 0 (that the user has to insert a valid credit / debit card in order to subscribe even if the amount is $ 0)?
For example: When we subscribe to herokuapp without putting a dollar to obtain more privileges we need even a valid card, so we can subscribe to heroku privileges
Thanks for your time
CodePudding user response:
For Subscriptions that are created with payment_behavior: default_incomplete
and the first Invoice is $0 you should be getting back a Setup Intent at pending_setup_intent
(see api ref). You can't use a Payment Intent for this because Stripe won't generate a Payment Intent for the Invoice if no payment is due.
You can use this SetupIntent to collect payment details with the Card element and then use stripe.confirmCardSetup
(see api ref) to finish configuring the card for future usage.