Skip to content

Commit

Permalink
IPN
Browse files Browse the repository at this point in the history
  • Loading branch information
the-glu committed Jan 11, 2014
1 parent 6106824 commit 1d863d7
Show file tree
Hide file tree
Showing 10 changed files with 107 additions and 6 deletions.
9 changes: 9 additions & 0 deletions client/httpd.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,19 @@ def start():

return render_template('start.html', result=result, url=url)


@app.route('/back')
def back():

return render_template('back.html', result='ok' in request.args)


@app.route('/ipn', methods=['POST'])
def ipn():

print api.check_ipn(request.form)

return ''

if __name__ == "__main__":
app.run(debug=True)
19 changes: 19 additions & 0 deletions client/libs/polybanking.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import requests
import hashlib
import datetime


class PolyBanking():
Expand Down Expand Up @@ -45,3 +46,21 @@ def new_transation(self, amount, reference, extra_data=''):
return (result['status'], result['url'])
except:
return ('ERROR', '')

def check_ipn(self, post_data):
"""Check if IPN data is valid. Return (is_ok, message, reference, status, status_good, last_update)"""

data = {}

#check sign
for key in post_data:
if key != 'sign':
data[key] = post_data[key]

if post_data['sign'] != self.compute_sign(self.keyIPN, data):
return (False, 'SIGN', None, None, None, None)

if post_data['config'] != self.config_id:
return (False, 'CONFIG', None, None, None, None)

return (True, '', data['reference'], data['postfinance_status'], data['postfinance_status_good'] == 'True', datetime.datetime.strptime(data['last_update'][:-6], '%Y-%m-%d %H:%M:%S'))
9 changes: 9 additions & 0 deletions server/app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@

'south',
'bootstrap3',
'djcelery',

'main',
'users',
Expand Down Expand Up @@ -161,6 +162,14 @@
TEQUILA_AUTOCREATE = True # Auto create users ?
TEQUILA_FAILURE = '/' # Where to redirect user if there is a problem

import djcelery
djcelery.setup_loader()

DATE_FORMAT = 'Y/d/m'
TIME_FORMAT = 'H:i:s'

DATETIME_FORMAT = DATE_FORMAT + ' ' + TIME_FORMAT

try:
from settingsLocal import *
except ImportError:
Expand Down
2 changes: 2 additions & 0 deletions server/app/settingsLocal.py.dist
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,5 @@ PSPID_TEST = ''
PSPID_PROD = ''

CURRENCY = 'CHF'

BROKER_URL = ''
3 changes: 3 additions & 0 deletions server/data/pip-reqs.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
south
django-bootstrap3
requests
celery
django-celery
35 changes: 35 additions & 0 deletions server/paiements/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from celery import task

import requests
from paiements.models import Transaction, TransactionLog

from django.utils.timezone import now

from libs.utils import compute_sign


@task(ignore_result=True)
def send_ipn(transactionPk):
"""Send IPN about a transaction"""

transaction = Transaction.objects.get(pk=transactionPk)

if not transaction.config.active or not transaction.config.admin_enable:
return

data = {'config': str(transaction.config.pk), 'reference': transaction.reference, 'postfinance_status': transaction.postfinance_status, 'postfinance_status_good': str(transaction.postfinance_status_good()), 'last_update': str(transaction.last_postfinance_ipn_date)}
data['sign'] = compute_sign(transaction.config.key_ipn, data)

try:
error = requests.post(transaction.config.url_ipn, data=data).status_code != 200
except:
error = True

if not error:
transaction.last_ipn_date = now()
transaction.ipn_needed = False
transaction.save(update_fields=['last_ipn_date', 'ipn_needed'])

TransactionLog(transaction=transaction, log_type='ipnsuccess', extra_data='').save()
else:
TransactionLog(transaction=transaction, log_type='ipnfailled', extra_data='').save()
2 changes: 2 additions & 0 deletions server/paiements/templates/paiements/transactions/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ <h3 class="panel-title">
<th>{% trans "Amount" %}</th>
<th>{% trans "Postfinance status" %}</th>
<th>{% trans "Internal status" %}</th>
<th>{% trans "IPN Needed ?" %}</th>
<th>{% trans "Date" %}</th>
<th style="width: 150px;"></th>
</tr>
Expand All @@ -55,6 +56,7 @@ <h3 class="panel-title">
<td>{{elem.amount_chf|floatformat:"2"}} CHF</td>
<td><span class="label label-{{elem.postfinance_status_good|yesno:"success,danger"}}">{{elem.get_postfinance_status_display}}</span></td>
<td><span class="label label-{{elem.internal_status_good|yesno:"success,danger"}}">{{elem.get_internal_status_display}}</span></td>
<td><span class="label label-{{elem.ipn_needed|yesno:"danger,success"}}">{{elem.ipn_needed|yesno}}</span></td>
<td>{{elem.creation_date|date}} {{elem.creation_date|time}} ({{elem.creation_date|timesince}})</td>
<td>
<a href="{% url 'paiements.views.transactions_show_logs' elem.pk %}" class="btn btn-xs btn-default"><i class="glyphicon glyphicon-list-alt"></i> {% trans "Logs" %}</a>
Expand Down
5 changes: 4 additions & 1 deletion server/paiements/templates/paiements/transactions/show.html
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,10 @@ <h3 class="panel-title">{% trans "Details of a transaction" %}</h3>

<div class="form-group">
<label>{% trans "Ipn needed ?" %}</label>
<p class="form-control-static"><span class="label label-{{object.ipn_needed|yesno:"danger,success"}}">{{object.ipn_needed|yesno}}</span></p>
<p class="form-control-static">
<span class="label label-{{object.ipn_needed|yesno:"danger,success"}}">{{object.ipn_needed|yesno}}</span>
<a href="{% url 'paiements.views.transactions_send_ipn' object.pk %}" class="btn btn-warning btn-xs">{% trans "Force send" %}</a>
</p>
</div>

<div class="form-group">
Expand Down
2 changes: 2 additions & 0 deletions server/paiements/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@
url(r'^transactions/list$', 'transactions_list'),
url(r'^transactions/(?P<pk>[0-9]+)/$', 'transactions_show'),
url(r'^transactions/(?P<pk>[0-9]+)/logs$', 'transactions_show_logs'),
url(r'^transactions/(?P<pk>[0-9]+)/ipn$', 'transactions_send_ipn'),


)
27 changes: 22 additions & 5 deletions server/paiements/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

from configs.models import Config
from paiements.models import Transaction, TransactionLog
from paiements.tasks import send_ipn
from libs import utils

from django.utils.timezone import now
Expand Down Expand Up @@ -107,7 +108,7 @@ def go(request, pk):

t.internal_status = 'fw'
t.last_userforwarded_date = now()
t.save()
t.save(update_fields=['internal_status', 'last_userforwarded_date'])

return render_to_response('paiements/go.html', {'fields': fields, 'urlDest': urlDest}, context_instance=RequestContext(request))

Expand All @@ -116,8 +117,6 @@ def go(request, pk):
def ipn(request):
"""Call by Postfinance website about status"""

print request.POST

# Get transaction pk
orderId = request.POST.get('orderID')

Expand Down Expand Up @@ -154,10 +153,13 @@ def ipn(request):
t.internal_status = 'fb'
t.last_postfinance_ipn_date = now()
t.postfinance_status = request.POST.get('STATUS')
t.save()
t.ipn_needed = True
t.save(update_fields=['internal_status', 'last_postfinance_ipn_date', 'postfinance_status', 'ipn_needed', 'postfinance_id'])

TransactionLog(transaction=t, log_type='postfinanceStatus', extra_data=request.POST.get('STATUS')).save()

send_ipn.delay(t.pk)

return HttpResponse('')


Expand Down Expand Up @@ -198,7 +200,7 @@ def return_from_postfinance(request):

t.internal_status = 'fb'
t.last_user_back_from_postfinance_date = now()
t.save()
t.save(update_fields=['internal_status', 'last_user_back_from_postfinance_date', 'postfinance_id'])

TransactionLog(transaction=t, log_type='userBackFromPostfinance', extra_data=request.META['REMOTE_ADDR']).save()

Expand Down Expand Up @@ -268,3 +270,18 @@ def transactions_show(request, pk):
raise Http404

return render_to_response('paiements/transactions/show.html', {'object': object}, context_instance=RequestContext(request))


@login_required
def transactions_send_ipn(request, pk):

object = get_object_or_404(Transaction, pk=pk)

if not request.user.is_superuser and not request.user in object.allowed_users:
raise Http404

send_ipn.delay(object.pk)

messages.success(request, _('IPN has been queued !'))

return redirect('paiements.views.transactions_show', object.pk)

0 comments on commit 1d863d7

Please sign in to comment.