简体   繁体   中英

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

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 class="form-row">
    <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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM