console/SWSCloudCore/views/payments/__init__.py

117 lines
4.4 KiB
Python

# coding: utf-8
from hashlib import md5
from SWSCloudCore.controllers.payments import ControllerPaymentsRobokassa
from flask import Blueprint
from flask import g
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import url_for
from SWSCloudCore import models
from SWSCloudCore.controllers.users import ControllerUsers
viewPayments = Blueprint('payments', __name__, url_prefix='/payments')
@viewPayments.route('/robokassa/<action>', methods=['GET', 'POST'])
def robokassa(action):
controller_robokassa = ControllerPaymentsRobokassa(
PAY_ROBOKASSA_MODE=g.settings['PAY_ROBOKASSA_MODE'],
PAY_ROBOKASSA_LOGIN=g.settings['PAY_ROBOKASSA_LOGIN'],
PAY_ROBOKASSA_PASSWORD1=g.settings['PAY_ROBOKASSA_PASSWORD1'],
PAY_ROBOKASSA_PASSWORD2=g.settings['PAY_ROBOKASSA_PASSWORD2'],
)
if action == 'process':
# check session
if not ControllerUsers().check_session():
return redirect(url_for("account.logout"))
# auth user
if not ControllerUsers().auth(session['email'], session['password']):
return redirect(url_for("account.logout"))
user_id = session['user_id']
amount = request.form['amount']
# create transaction data to database
transaction_id = controller_robokassa.transaction_create(user_id, amount, 'process')
payment_details = {
"payment_id": transaction_id,
"amount": amount,
"login": controller_robokassa.args['PAY_ROBOKASSA_LOGIN'],
"password": controller_robokassa.args['PAY_ROBOKASSA_PASSWORD1'],
"signature": ''
}
payment_details["signature"] = md5(
"%(login)s:%(amount)s:%(payment_id)s:%(password)s" % payment_details
).hexdigest()
print payment_details
return render_template('default/payment/robokassa/process.html', payment=payment_details)
if action == 'result':
transaction_id = request.form['InvId']
signature = request.form['SignatureValue']
amount = request.form['OutSum']
transaction_hash = md5("%s:%s:%s" % (amount, transaction_id, controller_robokassa.args['PAY_ROBOKASSA_PASSWORD2'])).hexdigest()
# print transaction_hash
# print signature.lower()
if signature.lower() == transaction_hash.lower():
# update transaction signature
controller_robokassa.transaction_set_notified(transaction_id, 1)
# update user balance
controller_robokassa.balance_update(transaction_id, amount)
else:
print "ERR: invalid signature"
return render_template('default/payment/robokassa/result.html')
if action == 'success':
# check session
if not ControllerUsers().check_session():
return redirect(url_for("account.logout"))
# auth user
if not ControllerUsers().auth(session['email'], session['password']):
return redirect(url_for("account.logout"))
if request.method == "POST":
print request.form
# culture = request.form['Culture']
transaction_id = request.form['InvId']
# update transaction signature
transaction = models.UsersBalanceTransactions.get(models.UsersBalanceTransactions.id == transaction_id)
transaction.status = 'success'
transaction.save()
return redirect(url_for('payments.robokassa', action='success'))
# else:
# print "ERR: invalid signature"
return render_template('payment/robokassa/success.html')
if action == 'fail':
# check session
if not ControllerUsers().check_session():
return redirect(url_for("account.logout"))
# auth user
if not ControllerUsers().auth(session['email'], session['password']):
return redirect(url_for("account.logout"))
if request.method == "POST":
print request.form
transaction_id = request.form['InvId']
# update transaction signature
transaction = models.UsersBalanceTransactions.get(models.UsersBalanceTransactions.id == transaction_id)
transaction.status = 'fail'
transaction.save()
return redirect(url_for('payments.robokassa', action='fail'))
return render_template('default/payment/robokassa/fail.html')