Bug #9039
paiement sans être loggué
0%
Description
C'est peut-être quelque chose dont on aurait besoin; à discuter un peu avant de réfléchir à la manière de faire.
Demandes liées
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
Pour la manière je ne saurai dire, mais pour l'usage ce qui était évoqué pour Orléans c'est la possibilité d'avoir une URL qui permette de payer une facture/un pannier sans authentification; la page devra donner des informations minimales sur le paiement, juste un intitulé, les dates d'émission et de limite de paiement et un montant et non pas la totalité de la facture ou son PDF.
Mis à jour par Thomas Noël il y a plus de 8 ans
C'est très utile pour permettre à une personne de demander à un tiers de régler une facture. Ceci étant, il faut permettre le paiement tout en diffusant un minimum d'information sur l'objet à payer ; typiquement pas d'accès au PDF détaillant la facture (lieu de scolarisation des enfants, pointages horaires, etc).
Ce qui est en place à Orléans :- une URL permet d'accéder à une vue HTML de la facture (avec info minimale, typiquement description+montant dû) ; cette URL comporte un "secret" (code sur 6 à 10 caractère), un code d'accès
- cette vue de la facture est enrichie si un utilisateur est loggué et qu'il est propriétaire de la facture (on lui présente aussi les détails, lien vers le PDF, etc)
Cette URL "avec un petit code" peut être envoyée au compte lié à la facture dans un mail, ce qui lui permet de la payer rapidement sans se logguer, mais aussi de la diffuser à qui il veut, pour en demander le paiement.
NB: on ajoute un "petit code secret" car les numéros de factures sont en général séquentiels et très faciles à deviner, donc une URL https://lingo/invoice/F987123/ ne suffit pas, on doit y ajouter https://lingo/invoice/F987123/?code=7J9jd81
A noter que dans ce cadre, on ne permet pas de grouper un ensemble de factures à payer... ça serait un peu plus compliqué à faire, je pense, ergonomiquement surtout (faire une interface compréhensible par celui qui envoie les choses à payer, puis par celui qui doit les payer).
Voilà, à voir comment on veut généraliser/améliorer.
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Lié à Development #25547: Permettre le paiment en ligne pour un usager sans compte ajouté
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Sujet changé de paiement sans être loggué (?) à paiement sans être loggué
Parce que la question est revenue, concernant des éléments à payer qui arriveraient via wcs, (et donc la notion de panier dans combo), pour suivre les commentaires posés ci-dessus le plan pourrait être d'offrir un accès direct à un "basketitem" pour payer celui-ci, comme on a lingo/item/(?P<regie_id>[\w,-]+)/(?P<item_crypto_id>[\w,-]+)/ aujourd'hui pour les factures.
Mis à jour par Emmanuel Cazenave il y a plus de 4 ans
Je remet les élément posés par Fred dans la thread de mail "Paiement en ligne obligatoire pour les collectivités, chiffrage de #9039".
1/ autoriser l'API l'ajout d'éléments à payer ne précisant pas
d'usager :
@ -125,7 +125,7
@ class AddBasketItemApiView(View):
elif request.GET.get('email'):
user = User.objects.get(email=request.GET.get('email'))
else:
- raise Exception('no user specified')
+ user = None
except User.DoesNotExist:
raise Exception('unknown user')2/ inclure un bout de signature dans l'URL, pour faire genre, (il y a
aussi un truc de crypto_id pour les factures, je ne sais plus trop
pourquoi on s'était trouvé à faire ça)
@ -166,7 +166,7
@ class AddBasketItemApiView(View):
item.save()
item.regie.compute_extra_fees(user=item.user)- payment_url = reverse('basket-item-pay-view', kwargs={'item_id': item.id})
+ payment_url = reverse('basket-item-pay-view', kwargs={'item_id': item.id, 'signature': XXX})
return JsonResponse({'result': 'success', 'id': str(item.id),
'payment_url': request.build_absolute_uri(payment_url)})3/ lors du paiement, s'il y a cette signature, ne pas vérifier
l'usager,
@ -406,16 +406,18
@ class PayView(PayMixin, View):
class BasketItemPayView(PayMixin, View):
def get(self, request, *args, **kwargs):
next_url = request.GET.get('next_url') or '/'
- if not (request.user and request.user.is_authenticated()):
- return HttpResponseForbidden()
+ if not valid_signature(...):
+ if not (request.user and request.user.is_authenticated()):
+ return HttpResponseForbidden(('No item payment allowed for anonymous users.'))item = BasketItem.objects.get(pk=kwargs['item_id'])
regie = item.regie
if regie.extra_fees_ws_url:
return HttpResponseForbidden(_('No item payment allowed as extra fees set.'))- if item.user != request.user:
- return HttpResponseForbidden()
+ if not valid_signature(...):
+ if item.user != request.user:
+ return HttpResponseForbidden(('Wrong item: payment not allowed.'))return self.handle_payment(request, regie, [item], [], next_url)
Mis à jour par Emmanuel Cazenave il y a plus de 4 ans
- Lié à Development #36875: Paiement sans authentification : ajustements dans l'API ajouté
Mis à jour par Emmanuel Cazenave il y a plus de 4 ans
- Lié à Development #36876: Paiement sans authentification et sans panier ajouté
Mis à jour par Frédéric Péters il y a environ 4 ans
- Statut changé de Nouveau à Fermé
C'est désormais possible.