https://github.com/ydaniels/django-saas-billing
Fastest django app you'll ever user that provides paypal, stripe and cryptocurrency ( bitcoin) payment for your django drf saas app mvps subscription and billings. supports normal, Flat rate: Good-better-best, usage billing
https://github.com/ydaniels/django-saas-billing
billingsystem bitcoin django django-rest-framework drf mvp payment-gateway paypal saas stripe subscribe subscriber subscription subscriptions
Last synced: about 1 month ago
JSON representation
Fastest django app you'll ever user that provides paypal, stripe and cryptocurrency ( bitcoin) payment for your django drf saas app mvps subscription and billings. supports normal, Flat rate: Good-better-best, usage billing
- Host: GitHub
- URL: https://github.com/ydaniels/django-saas-billing
- Owner: ydaniels
- License: isc
- Created: 2020-04-08T00:28:26.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-02-12T01:09:11.000Z (over 1 year ago)
- Last Synced: 2025-07-10T21:41:28.063Z (3 months ago)
- Topics: billingsystem, bitcoin, django, django-rest-framework, drf, mvp, payment-gateway, paypal, saas, stripe, subscribe, subscriber, subscription, subscriptions
- Language: Python
- Homepage:
- Size: 101 KB
- Stars: 13
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.rst
- License: LICENSE
Awesome Lists containing this project
README
drf-saas-billing
======================================|build-status-image| |pypi-version|
Overview
--------Fastest django app you'll ever user that provides paypal, stripe and cryptocurrency ( bitcoin) payment for your django drf saas app subscription and billings. supports normal, Flat rate: Good-better-best, usage billing
based on https://github.com/ydaniels/drf-django-flexible-subscriptionsRequirements
------------- Python (2.7, 3.3, 3.4+)
- Django (1.6, 1.7, 1.8+)
- Django REST Framework (2.4, 3.0, 3.1+)Installation
------------Install using ``pip``\ …
.. code:: bash
$ pip install django-saas-billing
Setup
-------.. code:: python
# settings.py
INSTALLED_APPS = [
...,
'rest_framework',
'subscriptions_api',
'cryptocurrency_payment', #for crypto payments
'saas_billing'
]
SUBSCRIPTIONS_API_SUBSCRIPTIONTRANSACTION_MODEL = 'saas_billing.SubscriptionTransaction'
SAAS_BILLING_MODELS = {
'stripe': {
'plan': 'saas_billing.StripeSubscriptionPlan',
'cost': 'saas_billing.StripeSubscriptionPlanCost',
'subscription': 'saas_billing.StripeSubscription'
},
'paypal': {
'plan': 'saas_billing.PaypalSubscriptionPlan',
'cost': 'saas_billing.PaypalSubscriptionPlanCost',
'subscription': 'saas_billing.PaypalSubscription'
}
}
SAAS_BILLING_AUTH = {
'stripe': {
'PUBLISHABLE_KEY': 'Your Publishable Key',
'LIVE_KEY': 'You Live key can be test or live',
'CANCEL_URL': 'Where you want to redirect to if user cancels payment',
'SUCCESS_URL': ' Where to redirect to if subscription is successful'
},
'paypal': {
'CLIENT_ID': 'Your paypal rest client id',
'CLIENT_SECRET': 'Your paypal rest secret id',
'TOKEN': None,
'ENV': 'live|development',
'CANCEL_URL': 'Where to redirect to if subscription fails',
'SUCCESS_URL': 'Where to redirect to if subscription is successful',
'WEB_HOOK_ID': 'Your paypal rest webhook id'
}
}CRYPTOCURRENCY_PAYMENT = {
"BITCOIN": {
"CODE": "btc",
"BACKEND": "merchant_wallet.backends.btc.BitcoinBackend",
"FEE": 0.00,
"REFRESH_PRICE_AFTER_MINUTE": 15,
"REUSE_ADDRESS": False,
"ACTIVE": True,
"MASTER_PUBLIC_KEY": 'PUT_YOUR_WALLET_MASTER_PUBLIC_KEY',
"CANCEL_UNPAID_PAYMENT_HRS": 24,
"CREATE_NEW_UNDERPAID_PAYMENT": True,
"IGNORE_UNDERPAYMENT_AMOUNT": 10,
"IGNORE_CONFIRMED_BALANCE_WITHOUT_SAVED_HASH_MINS": 20,
"BALANCE_CONFIRMATION_NUM": 1,
"ALLOW_ANONYMOUS_PAYMENT": False,
"DERIVATION_PATH": "m/0",
"ADDRESS_TYPE": "p2wpkh"
}
}
DFS_DEFAULT_PLAN_COST_ID = 'Optional Put plan cost id here for new user to be automatically subscribed to this plan or subscription to be downgraded here'
.. code-block:: pythonpath('', include('saas_billing.webhook_urls')) #Compulsory for webhook register url webhook on paypal and stripe
#create webhook url https://yourdomain.com/billing/stripe/webhook/
#https://yourdomain.com/billing/paypal/webhook/
path('api/subscriptions/', include('subscriptions_api.urls')),
path('api/', include('saas_billing.urls')),
Usage
-----Step 1
------- Regsiter webhook urls on paypal and stripe
.. code-block:: bash
https://yourdomain/billing/stripe/webhook/ #Please use ngrok on localhost
https://yourdomain/billing/paypal/webhook/- Register signal in apps.py for crypto payments to activate subscription when crypto payment gets paid
.. code-block:: python
#apps.py
class MyAppConfig(AppConfig):def ready(self):
import saas_billing.signalsStep 2
-------.. code-block:: python
python manage.py migrate
- Create Your Plans and PlanCost from django admin.. code-block:: python
from subscription_api.models import SubscriptionPlan, PlanCost, MONTH
free_plan = SubscriptionPlan(plan_name='Free Plan', features='{"can_perform_action": false, "token_limit": 3}', group=optional_already_created_group_obj_user_will_be_added_to)
free_plan.save()pro_plan = SubscriptionPlan(plan_name='Pro Plan', features='{"can_perform_action": true, "token_limit": 10}', group=already_created_group_obj).save()
pro_plan.save()
PlanCost(plan=pro_plan, recurrence_unit=MONTH, cost=30, min_subscription_quantity=20).save() #30$/month #min_subscription_quantity user must subscribe upto quantity to use this cost
Tips
----
.. code-block:: python#In your code or views you can use
if not user.subscription.plan.can_perform_action:
print('I am a free user')
else:
print('I am a pro user')
# features is a json dict that can be accessed from plan and group is normal django group that user will belong to# You should be able to implement most subscriptions access and permissions with the feautures and django groups
Step 3
------- Generate Paypal and Stripe Plans and Pricing by using command below
.. code-block:: python
python manage.py billing gateway all # Create all plans on stripe.com and paypal.com
python manage.py billing gateway # Create only on paypal.com or Stripe.com
python manage.py billing gateway --action # Activate or Deactivate plansTips
-----Getting Active Subscriptions Of a User
------------------------------------------.. code-block:: python
subscription = request.user.subscriptions.filter(active=True).first() #if you only allow a subscription per user
subscription.transactions.all() #returns all transaction payment of this subscriptions
request.user.subscriptions.filter(active=True).all() #for all subscriptions if you allow multiple subscription per user.. code-block:: python
transactions = request.user.subscription_transactions.all() #Returns all payment trasnsaction for this user
Building A Payment And Active Subscription View
------------------------------------------------.. code-block:: python
from saas_billing.models import SubscriptionTransaction #import this to show crypto payments
from subscriptions_api.base_models import BaseSubscriptionTransaction # use this to only show paypal & stripe paymentclass BillingView(ListView):
model = BaseSubscriptionTransaction
context_object_name = 'payment_transactions'
template_name = 'transactions.html'def get_queryset(self):
return self.request.user.subscription_transactions.order_by('-date_transaction')def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['active_subscription'] = self.request.user.subscriptions.filter(active=True).first()
return context.. code-block:: html
Date
Subscription
Amount
Status
{% for tran in payment_transactions %}
{{ tran.payment_transactions }}
{{ tran.subscription_name }}
${{ tran.amount }}
Paid
{% endfor %}
Step 4
--------How To Subscribe A User to a Plan Cost
---------------------------------------
-Send a post request using ajax or axios with data { gateway: , quantity: 1 } to url below where ${id} is the plan cost id under subscriptions plans and quantity is optional for usage pricing.. code-block:: javascript
// post data { gateway: , quantity: 1 } quantity allows use to use usage biling
'/api/plan-costs/${id}/init_gateway_subscription/'- For paypal redirect user to payment_link value from returned data
.. code-block:: javascript$.ajax({url: '/api/plan-costs/${id-of-cost}/init_gateway_subscription/', { gateway: 'paypal', quantity: 1 }}).then((post_return_data) => {
window.open(post_return_data.payment_link, '_blank').focus();
})
- For stripe start session with session id returned from post requsest using stripe javascript sdk.. code-block:: javascript
(post_return_data) => {
var stripe = window.Stripe(YOUR_STRIPE_PUBLIC_KEY)
return stripe.redirectToCheckout({ sessionId: post_return_data.session_id })
}
**Thats all you need to start accepting subscriptions, subscriptions are activated or deactivated automatically and notification are sent to users automatically**Tips Api URL To use in frontend app for drf users
------------------------------------------------.. code-block:: python
'/api/subscriptions/subscription-plans/' #Get all plans to display in frontend
'/api/subscriptions/get_active_subscription/' # Returns active UserSubscription Object for the current logged in user
'/api/subscriptions/${id}/unsubscribe_user/' # Unsubscribe user from subscription with ${id}
'/api/transactions/' # Get payment transactions
'/api/transactions/${id}/' # Get single payment transaction with ${id}
-Testing
-------Install testing requirements.
.. code:: bash
$ pip install -r requirements.txt
Run with runtests.
.. code:: bash
$ ./runtests.py
You can also use the excellent `tox`_ testing tool to run the tests
against all supported versions of Python and Django. Install tox
globally, and then simply run:.. code:: bash
$ tox
Documentation
-------------To build the documentation, you’ll need to install ``mkdocs``.
.. code:: bash
$ pip install mkdocs
To preview the documentation:
.. code:: bash
$ mkdocs serve
Running at: http://127.0.0.1:8000/To build the documentation:
.. code:: bash
$ mkdocs build
.. _tox: http://tox.readthedocs.org/en/latest/
.. |build-status-image| image:: https://secure.travis-ci.org/ydaniels/drf-saas-billing.svg?branch=master
:target: http://travis-ci.org/ydaniels/drf-saas-billing?branch=master
.. |pypi-version| image:: https://img.shields.io/pypi/v/drf-saas-billing.svg
:target: https://pypi.python.org/pypi/drf-saas-billing