Home > Software engineering >  How to create subscriptions with payment intent equal to $ 0 in stripe or some alternative to it?
How to create subscriptions with payment intent equal to $ 0 in stripe or some alternative to it?

Time:12-23

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.

  • Related