Subscribing a customer to a price (or plan)

For your convenience, dj-stripe provides a djstripe.models.Customer.subscribe method that will try to charge the customer immediately unless you specify charge_immediately=False

price = Price.objects.get(nickname="one_price")
customer = Customer.objects.first()
customer.subscribe(price=price)

# If you still use legacy Plans...
plan = Plan.objects.get(nickname="one_plan")
customer = Customer.objects.first()
customer.subscribe(plan=plan)

However in some cases djstripe.models.Customer.subscribe might not support all the arguments you need for your implementation. When this happens you can just call the official stripe.Customer.subscribe().

See this example from tests.apps.example.views.PurchaseSubscriptionView.form_valid.

Note that PaymentMethods can be used instead of Cards/Source by substituting

# Add the payment method customer's default
customer.add_payment_method(payment_method)

instead of

# Add the source as the customer's default card
customer.add_card(stripe_source)

in the above example. See djstripe.models.Customer.add_payment_method.