10.3 Implementacija Stripe-a
Struktura Projekta
/ForgeAI # root repozitorija
├── /docs
├── /Dokumentacija-Writerside
├── /ForgeAI_django
│ ├── manage.py
│ ├── /ForgeAI_django
│ │ ├── __pycache__
│ │ ├── __init__.py
│ │ ├── asgi.py
│ │ ├── wsgi.py
│ │ ├── urls.py
│ │ ├── settings.py
│ ├── __pycache__
│ ├── /backend_logika
│ ├── /prompting_handler
│ ├── /stripe_pretplata
│ ├── Korisnik.py
├── /ForgeAI_env
│ ├── /Scripts
│ │ ├── activate.bat
├── /MIDI_python_parser
│ ├── chords.py
│ ├── custom_midi_gen.py
│ ├── drums.py
│ ├── main.py
│ ├── midi_to_format.py
├── llama3_test.py
├── .env
├── .gitignore
├── README.md
Kreiranje Aplikacije
python manage.py startapp stripe_pretplata
Ova komanda kreira novu Django aplikaciju pod nazivom stripe_pretplata.
Dodavanje Aplikacije u settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'backend_logika',
'prompting_handler',
'stripe_pretplata'
]
Ovdje se dodaje stripe_pretplata aplikacija u listu instaliranih aplikacija u settings.py datoteci.
Instalacija Stripe Paketa
pip install stripe
Ova komanda instalira Stripe paket koji ćemo koristiti za integraciju plaćanja. Važno je napomenuti da se ovo pokreće unutar Python virtualnog okruženja.
Kreiranje Produkta na Stripe Dashboard-u
Dodavanje novog produkta: U sekciji Product Catalogue dodajemo novi produkt.
Postavljanje jedinstvenog ključa za cijenu: Ključ za cijenu mora biti jedinstven jer se koristi u kodu za kasnije pretraživanje.
Aktivacija Stripe Customer Portala: Omogućava korisnicima da upravljaju svojim pretplatama putem Stripe-ovog korisničkog portala.
Stripe CLI
Instalacija Stripe CLI-a prema zvaničnoj dokumentaciji: Stripe CLI Dokumentacija
Preuzimanje Stripe CLI za Windows: Stripe CLI za Windows
Ekstraktovanje i postavljanje stripe.exe u C:\Stripe direktorij. Dodavanje stripe.exe u Path varijablu okruženja:
$env:Path += ";C:\Stripe\stripe.exe"
Provjera Stripe CLI verzije:
stripe --version
Konfiguracija .env Datoteke
U .env datoteku dodajemo Stripe API ključeve:
STRIPE_SECRET_KEY=<sk_test_51>
STRIPE_PUBLIC_KEY=<pk_test_51>
STRIPE_WEBHOOK_SECRET=<whsec_51>
Kreiranje Tabela u Bazi Podataka
U ovoj sekciji ćemo opisati tabele koje se kreiraju u bazi podataka:
Tabela users
Sadrži podatke o korisnicima, uključujući njihovo ime, avatar URL, adresu za naplatu i metode plaćanja.
Tabela customers
Privatna tabela koja sadrži mapiranje korisničkih ID-ova na Stripe ID-ove.
Tabela products
Sadrži informacije o proizvodima kreiranim i upravljanim u Stripe-u.
Tabela prices
Sadrži informacije o cijenama proizvoda, uključujući tip cijene i interval naplate.
Tabela subscriptions
Sadrži informacije o pretplatama korisnika, uključujući status, ID cijene i vremenske oznake.
Dodavanje Templates Direktorija u Aplikaciju
Unutar aplikacije stripe_pretplata kreiramo novi templates direktorij i dodajemo sljedeće HTML datoteke:
pretplati.html
uspjeh.html
otkazi.html
pretplati.html Boilerplate
<!DOCTYPE html>
<html>
<head>
<title>Subscribe to a cool new product</title>
<script src="https://js.stripe.com/v3/"></script>
</head>
<body>
<header>
<p>
Logged in as {{ request.user.email }}
</p>
</header>
<section>
<div class="product">
<div class="description">
<h3>Starter - Monthly tennis ball delivery 🎾</h3>
<h5>$20.00 / month</h5>
</div>
</div>
<form class="checkout-form" action="{% url 'create-checkout-session' %}" method="POST">
{% csrf_token %}
<input type="hidden" name="price_lookup_key" value="standard_monthly" />
<button id="checkout-and-portal-button" type="submit">Checkout</button>
</form>
</section>
</body>
</html>
<style>
.product {
display: flex;
justify-content: center;
padding: 20px 10px;
border: 1px dashed lightgreen;
}
.checkout-form {
display: flex;
justify-content: center;
padding: 20px 10px;
}
</style>
uspjeh.html
<!DOCTYPE html>
<html>
<head>
<title>Thanks for your order!</title>
<link rel="stylesheet" href="style.css">
<script src="client.js" defer></script>
</head>
<body>
<section>
<div class="product Box-root">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14px" height="16px" viewBox="0 0 14 16" version="1.1">
<defs/>
<g id="Flow" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="0-Default" transform="translate(-121.000000, -40.000000)" fill="#E184DF">
<path d="M127,50 L126,50 C123.238576,50 121,47.7614237 121,45 C121,42.2385763 123.238576,40 126,40 L135,40 L135,56 L133,56 L133,42 L129,42 L129,56 L127,56 L127,50 Z M127,48 L127,42 L126,42 C124.343146,42 123,43.3431458 123,45 C123,46.6568542 124.343146,48 126,48 L127,48 Z" id="Pilcrow"/>
</g>
</g>
</svg>
<div class="description Box-root">
<h3>Subscription to Starter plan successful!</h3>
</div>
</div>
<div> User = {{request.user}} </div>
<form action="{% url 'direct-to-customer-portal' %}" method="POST">
{% csrf_token %}
<input type="hidden" id="session-id" name="session_id" value="" />
<button id="checkout-and-portal-button" type="submit">Manage your billing information</button>
</form>
</section>
</body>
</html>
otkazi.html
<!DOCTYPE html>
<html>
<head>
<title>Checkout canceled</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<section>
<p>Picked the wrong subscription? Shop around then come back to pay!</p>
</section>
</body>
</html>
Dodavanje Koda u views.py
U views.py dodajemo funkcije za upravljanje pretplatama, uključujući kreiranje sesija za naplatu, upravljanje korisničkim portalom i obradu webhook događaja. Ovdje su najvažniji dijelovi koda:
subscribe: Funkcija koja prikazuje stranicu za pretplatu.
cancel: Funkcija koja prikazuje stranicu za otkazivanje.
success: Funkcija koja prikazuje stranicu za uspješ
nu pretplatu.
views.py - Primjer Koda
import stripe
from django.conf import settings
from django.shortcuts import render, redirect
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
stripe.api_key = settings.STRIPE_SECRET_KEY
def subscribe(request):
return render(request, 'stripe_pretplata/pretplati.html')
def cancel(request):
return render(request, 'stripe_pretplata/otkazi.html')
def success(request):
return render(request, 'stripe_pretplata/uspjeh.html')
@csrf_exempt
def create_checkout_session(request):
if request.method == 'POST':
domain_url = 'http://localhost:8000/'
price_lookup_key = request.POST['price_lookup_key']
try:
checkout_session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=[
{
'price_data': {
'currency': 'usd',
'product_data': {
'name': 'Starter Subscription',
},
'unit_amount': 2000,
'recurring': {
'interval': 'month',
},
},
'quantity': 1,
},
],
mode='subscription',
success_url=domain_url + 'stripe_pretplata/uspjeh.html',
cancel_url=domain_url + 'stripe_pretplata/otkazi.html',
)
return JsonResponse({
'id': checkout_session.id
})
except Exception as e:
return JsonResponse({
'error': str(e)
})
Kreiranje URL Mappings u urls.py
U urls.py datoteci dodajemo URL mappings za nove funkcije:
from django.urls import path
from . import views
urlpatterns = [
path('pretplati/', views.subscribe, name='pretplati'),
path('otkazi/', views.cancel, name='otkazi'),
path('uspjeh/', views.success, name='uspjeh'),
path('create-checkout-session/', views.create_checkout_session, name='create-checkout-session'),
path('direct-to-customer-portal/', views.direct_to_customer_portal, name='direct-to-customer-portal'),
]
Last modified: 04 June 2024