paiement stripe valide avec key api cashless

This commit is contained in:
Jonas 12t 2021-09-26 19:54:07 +04:00
parent cb5f6f941c
commit f666d24eff
5 changed files with 203 additions and 105 deletions

View File

@ -28,7 +28,6 @@ class retour_stripe(View):
else: else:
stripe.api_key = configuration.stripe_api_key stripe.api_key = configuration.stripe_api_key
if paiement_stripe.status != Paiement_stripe.VALID : if paiement_stripe.status != Paiement_stripe.VALID :
checkout_session = stripe.checkout.Session.retrieve(paiement_stripe.id_stripe) checkout_session = stripe.checkout.Session.retrieve(paiement_stripe.id_stripe)
@ -36,8 +35,11 @@ class retour_stripe(View):
paiement_stripe.status = Paiement_stripe.PENDING paiement_stripe.status = Paiement_stripe.PENDING
if checkout_session.expires_at > datetime.now().timestamp() : if checkout_session.expires_at > datetime.now().timestamp() :
paiement_stripe.status = Paiement_stripe.EXPIRE paiement_stripe.status = Paiement_stripe.EXPIRE
paiement_stripe.save()
elif checkout_session.payment_status == "paid": elif checkout_session.payment_status == "paid":
paiement_stripe.status = Paiement_stripe.PAID paiement_stripe.status = Paiement_stripe.PAID
paiement_stripe.save()
# on vérifie si les infos sont cohérente avec la db : Never Trust Input :) # on vérifie si les infos sont cohérente avec la db : Never Trust Input :)
metadata_stripe_json = checkout_session.metadata metadata_stripe_json = checkout_session.metadata
@ -59,6 +61,8 @@ class retour_stripe(View):
# on check si il y a un rechargement de carte cashless dans la commande # on check si il y a un rechargement de carte cashless dans la commande
if metadata_db.get('recharge_carte_uuid') : if metadata_db.get('recharge_carte_uuid') :
logger.info(f'{timezone.now()} retour stripe pour rechargement carte : {metadata_db.get("recharge_carte_uuid")}')
print (f'{timezone.now()} retour stripe pour rechargement carte : {metadata_db.get("recharge_carte_uuid")}')
return postPaimentRecharge(paiement_stripe, request) return postPaimentRecharge(paiement_stripe, request)
@ -66,9 +70,9 @@ class retour_stripe(View):
else: else:
paiement_stripe.status = Paiement_stripe.CANCELED paiement_stripe.status = Paiement_stripe.CANCELED
paiement_stripe.save()
return HttpResponse(f'Le paiement a été annulé.') return HttpResponse(f'Le paiement a été annulé.')
paiement_stripe.save()
return HttpResponse(f'ok {uuid_stripe}') return HttpResponse(f'ok {uuid_stripe}')

View File

@ -460,6 +460,7 @@ input, select, textarea {
input[type="password"], input[type="password"],
input[type="email"], input[type="email"],
input[type="number"], input[type="number"],
input[type="tel"],
select { select {
height: 2.75rem; height: 2.75rem;
} }

View File

@ -9,6 +9,7 @@
<title>Scan TiBillet</title> <title>Scan TiBillet</title>
<meta charset="utf-8"/> <meta charset="utf-8"/>
{% load static %} {% load static %}
{% load humanize %}
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
<link rel="stylesheet" href="{% static 'html5up-dimension/assets/css/main.css' %}"/> <link rel="stylesheet" href="{% static 'html5up-dimension/assets/css/main.css' %}"/>
<noscript> <noscript>
@ -37,7 +38,9 @@
<nav> <nav>
<ul> <ul>
<li><a href="#recharger">Recharger</a></li> <li><a href="#recharger">Recharger</a></li>
{% if history %}
<li><a href="#historique">Historique</a></li> <li><a href="#historique">Historique</a></li>
{% endif %}
{% if carte_resto %} {% if carte_resto %}
<li><a href="/media/{{ carte_resto }}">Restaurant</a></li> <li><a href="/media/{{ carte_resto }}">Restaurant</a></li>
{% endif %} {% endif %}
@ -48,6 +51,11 @@
{% if site_web %} {% if site_web %}
<li><a href="{{ site_web }}">Site web</a></li> <li><a href="{{ site_web }}">Site web</a></li>
{% endif %} {% endif %}
{% if not email %}
<li><a href="#adherer">Adhérer</a></li>
{% endif %}
{# <li><a href="#elements">Elements</a></li>#} {# <li><a href="#elements">Elements</a></li>#}
</ul> </ul>
@ -87,16 +95,62 @@
<!-- Historique --> <!-- Historique -->
<article id="historique"> <article id="historique">
<div class="table-wrapper">
<h2 class="major">Solde</h2>
<table>
<thead>
<tr>
<th>Carte {{ numero_carte }}</th>
<th>Quantité</th>
</tr>
</thead>
<tbody>
{% for asset in assets %}
<tr>
<td>{{ asset.nom }}</td>
<td>{{ asset.qty |floatformat:2|intcomma }}</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<td colspan="1"></td>
<td>{{ total_monnaie |floatformat:2|intcomma }}</td>
</tr>
</tfoot>
</table>
</div>
<h2 class="major">Historique</h2> <h2 class="major">Historique</h2>
<h4>carte : {{ numero_carte }}</h4>
<span class="image main"><img src="images/pic02.jpg" alt=""/></span>
<p>Adipiscing magna sed dolor elit. Praesent eleifend dignissim arcu, at eleifend sapien imperdiet ac. <div class="table-wrapper">
Aliquam erat volutpat. Praesent urna nisi, fringila lorem et vehicula lacinia quam. Integer sollicitudin <table>
mauris nec lorem luctus ultrices.</p> <thead>
<p>Nullam et orci eu lorem consequat tincidunt vivamus et sagittis libero. Mauris aliquet magna magna sed <tr>
nunc rhoncus pharetra. Pellentesque condimentum sem. In efficitur ligula tate urna. Maecenas laoreet <th>Date</th>
massa vel lacinia pellentesque lorem ipsum dolor. Nullam et orci eu lorem consequat tincidunt. Vivamus <th>Qty</th>
et sagittis libero. Mauris aliquet magna magna sed nunc rhoncus amet feugiat tempus.</p> <th>Article</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{% for ligne in history %}
<tr>
<td>{{ ligne.date | naturaltime }}</td>
<td>{{ ligne.qty | floatformat:0 | intcomma }}</td>
<td>{{ ligne.article }}</td>
<td>{{ ligne.total }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</article>
<article id="adhesionsuccess">
<h2 class="major">Adhésion</h2>
<h4>Merci !</h4>
</article> </article>
<article id="success"> <article id="success">
@ -106,16 +160,24 @@
<table> <table>
<thead> <thead>
<tr> <tr>
<th>Portefeuille :</th> <th>Portefeuille</th>
<th>Quantité</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for asset in liste_assets %} {% for asset in assets %}
<tr> <tr>
<td>{{ asset }}</td> <td>{{ asset.nom }}</td>
<td>{{ asset.qty |floatformat:2|intcomma }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
<tfoot>
<tr>
<td colspan="1"></td>
<td>{{ total_monnaie |floatformat:2|intcomma }}</td>
</tr>
</tfoot>
</table> </table>
</div> </div>
<ul class="actions"> <ul class="actions">
@ -124,42 +186,41 @@
</article> </article>
<article id="error"> <article id="error">
<h2 class="major">ERREUR Rechargement</h2> <h2 class="major">ERREUR</h2>
<h3>Le paiement semble ne pas être passé. Vérifiez votre paiement ou contacter un administrateur</h3> <h3>Le paiement n'a pas fonctionné.</h3>
<h4>Vérifiez votre moyen de paiement ou contacter un administrateur</h4>
<ul class="actions"> <ul class="actions">
<li><a href="#historique" class="button primary">Voir l'historique</a></li> <li><a href="#historique" class="button primary">Voir l'historique</a></li>
</ul> </ul>
</article> </article>
<!-- Contact --> <!-- adhesion -->
<article id="external"> <article id="adherer">
<h2 class="major">Contact</h2> <h2 class="major">Adhésion {{ client_name }}</h2>
<form method="post" action="#"> <form method="post" action="#">
{% csrf_token %}
<div class="fields"> <div class="fields">
<div class="field half"> <div class="field half">
<label for="name">Name</label> <label for="name">Nom</label>
<input type="text" name="name" id="name"/> <input id="name" name="name" required="True" type="text"/>
</div>
<div class="field half">
<label for="prenom">Prénom</label>
<input id="prenom" name="prenom" required="True" type="text"/>
</div> </div>
<div class="field half"> <div class="field half">
<label for="email">Email</label> <label for="email">Email</label>
<input type="text" name="email" id="email"/> <input id="email" name="email" required="True" type="email"/>
</div> </div>
<div class="field"> <div class="field half">
<label for="message">Message</label> <label for="tel">Téléphone</label>
<textarea name="message" id="message" rows="4"></textarea> <input id="tel" name="tel" required="True" type="tel"/>
</div> </div>
</div> </div>
<ul class="actions"> <ul class="actions">
<li><input type="submit" value="Send Message" class="primary"/></li> <li><input type="submit" value="Adhérer" class="primary"/></li>
<li><input type="reset" value="Reset"/></li>
</ul> </ul>
</form> </form>
<ul class="icons">
<li><a href="#" class="icon brands fa-twitter"><span class="label">Twitter</span></a></li>
<li><a href="#" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li>
<li><a href="#" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li>
<li><a href="#" class="icon brands fa-github"><span class="label">GitHub</span></a></li>
</ul>
</article> </article>
<!-- Elements --> <!-- Elements -->
@ -415,7 +476,8 @@ print 'It took ' + i + ' iterations to sort the deck.';</code></pre>
<!-- Footer --> <!-- Footer -->
<footer id="footer"> <footer id="footer">
<p class="copyright">&copy; Untitled. Design: <a href="https://html5up.net">HTML5 UP</a>.</p> <p class="copyright"><a href="https://www.tibillet.re">TiBillet.re</a> Design: <a href="https://html5up.net">HTML5
UP</a>.</p>
</footer> </footer>
</div> </div>

View File

@ -1,3 +1,5 @@
from datetime import datetime
import requests, json import requests, json
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db import connection from django.db import connection
@ -94,10 +96,17 @@ class index_scan(View):
liste_assets = json_reponse.get('liste_assets') liste_assets = json_reponse.get('liste_assets')
email = json_reponse.get('email') email = json_reponse.get('email')
if json_reponse.get('history') :
for his in json_reponse.get('history') :
his['date'] = datetime.fromisoformat(his['date'])
return render( return render(
request, request,
self.template_name, self.template_name,
{ {
'assets': json_reponse.get('assets'),
'total_monnaie': json_reponse.get('total_monnaie'),
'history': json_reponse.get('history'),
'carte_resto': configuration.carte_restaurant, 'carte_resto': configuration.carte_restaurant,
'site_web': configuration.site_web, 'site_web': configuration.site_web,
'image_carte': carte.detail.img, 'image_carte': carte.detail.img,
@ -115,16 +124,24 @@ class index_scan(View):
elif reponse_server_cashless.status_code == 400: elif reponse_server_cashless.status_code == 400:
# Carte non trouvée # Carte non trouvée
return HttpResponse('Carte inconnue', status=status.HTTP_400_BAD_REQUEST) return HttpResponse('Carte inconnue', status=status.HTTP_400_BAD_REQUEST)
elif reponse_server_cashless.status_code in (500, 503): elif reponse_server_cashless.status_code == 403 :
# Serveur cashless hors ligne # Clé api HS
return reponse_server_cashless logger.error(reponse_server_cashless)
return HttpResponse('Forbidden', status=status.HTTP_403_FORBIDDEN)
else :
return HttpResponse(f'{reponse_server_cashless.status_code}', status=reponse_server_cashless.status_code)
def post(self, request, uuid): def post(self, request, uuid):
carte = check_carte_local(uuid) carte = check_carte_local(uuid)
if carte.detail.origine != connection.tenant: if carte.detail.origine != connection.tenant:
raise Http404 raise Http404
data = request.POST data = request.POST
print(data)
# c'est une recharge
if data.get('montant_recharge') :
reponse_server_cashless = self.check_carte_serveur_cashless(carte.uuid) reponse_server_cashless = self.check_carte_serveur_cashless(carte.uuid)
montant_recharge = float("{0:.2f}".format(float(data.get('montant_recharge')))) montant_recharge = float("{0:.2f}".format(float(data.get('montant_recharge'))))
configuration = Configuration.get_solo() configuration = Configuration.get_solo()
@ -204,6 +221,14 @@ class index_scan(View):
return HttpResponseRedirect(checkout_session.url) return HttpResponseRedirect(checkout_session.url)
elif data.get('prenom') \
and data.get('name') \
and data.get('email') \
and data.get('tel'):
print("adhésion !")
absolute_domain = request.build_absolute_uri().partition('/qr')[0]
return HttpResponseRedirect(f'{absolute_domain}/qr/{carte.uuid}#adhesionsuccess')
def postPaimentRecharge(paiementStripe: Paiement_stripe, request): def postPaimentRecharge(paiementStripe: Paiement_stripe, request):
absolute_domain = request.build_absolute_uri().partition('/stripe/return')[0] absolute_domain = request.build_absolute_uri().partition('/stripe/return')[0]
@ -227,18 +252,22 @@ def postPaimentRecharge(paiementStripe: Paiement_stripe, request):
sess = requests.Session() sess = requests.Session()
configuration = Configuration.get_solo() configuration = Configuration.get_solo()
r = sess.post(f'{configuration.server_cashless}/api/rechargementPaid', r = sess.post(
f'{configuration.server_cashless}/api/billetterie_endpoint',
headers={ headers={
'Authorization': f'Api-Key {configuration.key_cashless}' 'Authorization': f'Api-Key {configuration.key_cashless}'
}, },
data={ data={
'uuid_carte': uuid_carte, 'uuid': uuid_carte,
'qty': float(total_rechargement), 'qty': float(total_rechargement),
'uuid_commande': paiementStripe.uuid, 'uuid_commande': paiementStripe.uuid,
}) })
sess.close() sess.close()
logger.info(f"{timezone.now()} demande au serveur cashless pour un rechargement. réponse : {r.status_code} ")
print (f"{timezone.now()} demande au serveur cashless pour un rechargement. réponse : {r.status_code} ")
if r.status_code == 200: if r.status_code == 200:
# la commande a été envoyé au serveur cashless, on la met en validée # la commande a été envoyé au serveur cashless, on la met en validée
paiementStripe.status = Paiement_stripe.VALID paiementStripe.status = Paiement_stripe.VALID

View File

@ -54,6 +54,7 @@ SHARED_APPS = (
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'django.contrib.humanize',
'django_extensions', 'django_extensions',
'Administration', 'Administration',
@ -217,3 +218,4 @@ EMAIL_USE_SSL = os.environ.get('EMAIL_USE_SSL', True)
JET_SIDE_MENU_COMPACT = True JET_SIDE_MENU_COMPACT = True
JET_CHANGE_FORM_SIBLING_LINKS = False JET_CHANGE_FORM_SIBLING_LINKS = False