Skip to content

Onlineweb apps Payment

Torrib edited this page Apr 22, 2015 · 8 revisions

Onlinewebs payment system uses Stripes custom checkout system

Short model description

Payment

The main object that contains a generic link to a content object (Event, prokom thingy, etc) This object has 3 types:

  • Instant - User have to pay before attending
  • Deadline - A deadline is set and users have to pay within the deadline
  • Delay - The payment deadline is a custom amount of days after attending.

PaymentRelation

The link between the payment and a user. Also contains an unique id and the time of purchase.

PaymentPrice

To allow a payment to have multiple prices, a PaymentPrice object contains a price and a description.

PaymentDelay

Object used to give users extra time. Given to attending users when using payment mode 3(Delay). Given to users bumped from the wait list if the payment.deadline > 2 days.

Setting up payment for an object

The example code is from events and references to AttendanceEvent should be changed with your own object.

Add payments to request.session

The request.session should have a payment id.
This should be done in the view method that loads the template with the payment button.
The payments should be passed with the context.

try:
 payment = Payment.objects.get(content_type=ContentType.objects.get_for_model(AttendanceEvent), object_id=event_id)
 request.session['payment_id'] = payment.id
except Payment.DoesNotExist:

events/views.py - details

The object should implement the following methods

  1. payment_description()
    Return: String
    Description: Used as the title for the payment and confirmation mail
  2. payment_mail()
    Return: email address
    Description: The confirmation mail is sent from this mail.
  3. payment_complete(user)
    Return: None
    Description: Any logic beyond creating a payment_relation should be done here (ie. creating or updating the attendee object for events)

Template

This is an example of template code that supports multiple payment objects

{% for payment in payments %}
    <p class="status-text payment-price-tag">Prisen er på {{ payment.price }} Kr.</p>
    <button id="stripeButton{{ payment.id }}" class="btn btn-large btn-success payment-button">Betal med kort</button>
{% endfor %}

<script src="{{ STATIC_URL }}js/libs/jquery-2.1.3.min.js"></script>
<script src="https://checkout.stripe.com/checkout.js"></script>
<script src="{{ STATIC_URL }}js/payment.js"></script>

Note: You might have to change the jquery version to the newest one in the js/libs folder.

Confirmation mail is sent and the payment_relation object is created automatically on successful payment.

Dashboard

TBA

Functional testing checklist

Note! check that the mails sent are correct

View

  • Instant payment
  • Payment after attendance
  • Multiple payments
  • Payment with delay
  • Refund and unattended
  • Unattend_deadline passed
  • Attend without payment
  • Untatend without payment

Waitlist

  • Waitlist bump (Without payment)
  • Waitlist bump (with payment, deadline over 2 days in the future)
  • Waitlist bump (with payment, deadline less than 2 days in the future) - Should create paymentdelay object.
  • Waitlist bump (with payment type 3(delay)) - Creates paymentDelay object with deadline = (now + payment.delay)

Mommy

  • Not paid less than 3 days left of deadline.

  • Not paid deadline passed.

  • Not paid - Has payment delay

  • PaymentDelay - Notification sent when valid_to <= 1 day

  • PaymentDelay valid_to passed - Mark given - Unatend if unatend_deadline not passed.

  • PaymentDelay valid_to passed - Mark given - if unatend_deadline passed - Block users from future events. (Will not be done yet)