Sindbad~EG File Manager

Current Path : /home/numerotech/paymentapi.numerotech.com/paymentapi/core/controller/
Upload File :
Current File : //home/numerotech/paymentapi.numerotech.com/paymentapi/core/controller/PayumoneyController.py

from flask import Flask, request, Blueprint, jsonify, redirect, url_for,flash, render_template,session
from core.model.UserModel import UserModel
from core.model.PayumoneyModel import PayumoneyModel
from core.library.email import EMAIL

from random import randint
import datetime
from datetime import timedelta,date,datetime
import requests,json
# from .. import Cryptography
from flask import session, app
import razorpay

from random import randint
import datetime
from datetime import timedelta,date,datetime,time
import hashlib
from .. import config
import flask
import base64
import pytz


app = Flask(__name__,static_folder = "static", static_url_path='')



app = Blueprint('payumoney', __name__)

@app.route('/payment/<gateway_id>', methods = ["GET", "POST"])
def payment(gateway_id):
	base64_bytes   = gateway_id.encode("ascii") 
	# gateway id decode
	sample_bytes   = base64.b64decode(base64_bytes) 
	gateway_id_str = sample_bytes.decode("ascii")
	gateway_id_int = int(gateway_id_str)
	gateway_data   = PayumoneyModel().get_gateway(gateway_id_int)


# 	now = datetime.now()
# 	dt_string = now.strftime("%Y-%m-%d %H:%M:%S")
	UTC = pytz.utc
	IST = pytz.timezone('Asia/Kolkata')
	datetime_ist = datetime.now(IST)

	dt_string = datetime_ist.strftime('%Y-%m-%d %H:%M:%S')



	name         = request.args.get('name')
	email        = request.args.get('email')
	mobile       = request.args.get('mobile')
	amount       = request.args.get('amount')
	res_url      = request.args.get('res_url', None)

	unique_id    = request.args.get('unique_id')    # This is added on feb 23 2020 like order id
	txtid_prefix = request.args.get('txtid_prefix')    # This is added on sep 24 2020 for merchant ref id

	# endcode res_url
	url_byte   = res_url.encode("ascii") 
	_bytes     = base64.b64encode(url_byte) 
	r_url      = _bytes.decode("ascii")
	# last_insert_id_f  = request.args.get('last_insert_id')
	gateway_name = "Payumoney"
	currency = "INR"
	data = {
		'name'   : name,
		'email'  : email,
		'mobile' : mobile,
		'amount' : amount,
		'gateway_name' : [gateway_name],
		'created_at'   : [dt_string],
		'currency'     : [currency],
		'unique_id'    : [unique_id]
	}
	delg_save =UserModel().insert_delegates(data,unique_id)
	last_insert_id = delg_save
	delegates = UserModel().get_delegate_by_pid(last_insert_id)

	# user = session.get('user')
	# user_id = user.get('user_id')
	# user = User().get_user(user_id)
	# session['user'] = user
	MERCHANT_KEY = gateway_data.live_key
	key= gateway_data.live_key
	SALT = gateway_data.live_salt_or_secret
	
	# PAYU_BASE_URL = "https://sandboxsecure.payu.in/_payment"
	# https://sandboxsecure.payu.in/_payment    # test url
	# https://secure.payu.in/_payment           # live url
	PAYU_BASE_URL   = "https://secure.payu.in/_payment"  # FOR LIVE MO
	# PAYU_BASE_URL   = "https://sandboxsecure.payu.in/_payment"  # FOR TEST MO

	action = ''
	if request.method == 'GET':
		posted={}

		return render_template('payumoney/payumoney_payment_screen.html',posted=posted,delegates=delegates,r_url = r_url,last_insert_id=last_insert_id) 
	else:
		posted={}
		# # Merchant Key and Salt provided y the PayU.
		# randtemp = randint(0,20)
		randtemp = str(randint(1,99999))+ str(unique_id)
		hash_object = hashlib.sha256(str(randtemp).encode('utf-8'))
		txnid= txtid_prefix + hash_object.hexdigest()[0:20]
		# txnid= 'VRVDC' + hash_object.hexdigest()[0:20]
		hashh = ''
		print("<<<<< TXN ID  NTEC PAYMENT APP >>>>>>")
		print(txnid)
		# Mandatory Field
		posted['amount'] = amount
		posted['productinfo']='register'
		posted['firstname'] = name
		posted['email'] = email
		posted['phone'] = mobile
		posted['surl'] = config['BASE_URL']+'/payment_api/success'
		# posted['surl'] = "http://127.0.0.1:5001/payment_api/success"
		posted['furl'] = config['BASE_URL']+'/payment_api/failure'
		# posted['furl'] = "http://127.0.0.1:5001/payment_api/failure"
		posted['hash'] = ''
		posted['udf1'] = r_url
		posted['udf2'] = unique_id   # this line added on feb 23 2020
		# hashSequence = "key|txnid|amount|productinfo|firstname|email|phone|surl|furl"
		hashSequence = "key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5|udf6|udf7|udf8|udf9|udf10"
		posted['txnid']=txnid
		posted['key']=key
		hash_string=''
		hashVarsSeq=hashSequence.split('|')
		for i in hashVarsSeq:
			try:
				hash_string+=str(posted[i])
			except Exception:
				hash_string+=''
			hash_string+='|'
		hash_string+=SALT
		hashh=hashlib.sha512(hash_string.encode('utf-8')).hexdigest().lower()
		action =PAYU_BASE_URL
		if(posted.get("key")!=None and posted.get("txnid")!=None and posted.get("firstname")!=None and posted.get("email")!=None):
			payment_id     = posted.get("txnid")
			payment_status = "Pending"
			created_at     = datetime.now()
			# update_payment_id = {
			# 'payment_status' : 'YETTOPAY',
			# 'payment_id' : posted.get("txnid"),
			# 'created_at' : datetime.now(),
			# }
			insert_user = PayumoneyModel().update_payment_id(last_insert_id,payment_id,payment_status,created_at)
			data = { "posted":posted,"hashh":hashh,"key":key,"MERCHANT_KEY":MERCHANT_KEY,"txnid":txnid,"action":"https://secure.payu.in/_payment" }  # It is before mar 13 2021
			# data = { "posted":posted,"hashh":hashh,"key":key,"MERCHANT_KEY":MERCHANT_KEY,"txnid":txnid,"hash_string":hash_string,"action":"https://sandboxsecure.payu.in/_payment" }
			return render_template('payumoney/payu_request.html',posted=data.get('posted'),MERCHANT_KEY=MERCHANT_KEY,action=action,hashh=hashh,txnid=txnid)
		else:
			data = { "posted":posted,"hashh":hashh,"MERCHANT_KEY":MERCHANT_KEY,"txnid":txnid,"hash_string":hash_string,"action":"." }
			return render_template('payumoney/payu_request.html',posted=data.get('posted'))
			
			
@app.route('/success', methods=['GET','POST'])
def success():
	print("Payumoney return url funcion calling ...")
	txnid=request.values["txnid"]
	print("txnid from payumoney success url")
	print(txnid)
	
	get_user_id = PayumoneyModel().getuser_idbytxnid(txnid)
	payuMoneyId   = request.values["payuMoneyId"]

	status         = request.values["status"]
	print("Payumoney return url funcion calling ...")
	print(status)
	firstname      = request.values["firstname"]
	amount         = request.values["amount"]
	posted_hash    = request.values["hash"]
	key            = request.values["key"]
	productinfo    = request.values["productinfo"]
	email          = request.values["email"]
	mobile         = request.values["phone"]

	udf1           = request.values["udf1"]
	udf2           = request.values["udf2"]  # This line added on feb 23 2021
	method_1         = request.values["mode"]


	base64_bytes     = udf1.encode("ascii") 
	sample_bytes     = base64.b64decode(base64_bytes) 
	response_url_str = sample_bytes.decode("ascii")
	# salt="4pdSWxjLqt"
	# salt="QlpAxn2s"  # Techventure Here  salt variable not used in the success function so this is commented on Feb 14 2022
	 
	now = datetime.now()
	dt_string = now.strftime("%Y-%m-%d %H:%M:%S")

	save_data = {'amount' : amount ,'payment_status' : status , 'method' : method_1,'payment_id' : payuMoneyId,'updated_at' : dt_string}
	print(save_data)				
	save_payment_dt = PayumoneyModel().updatepaymentdetail(txnid,save_data)

	if status == "success" :
		pass
	else :
		salt=""
		try:
			additionalCharges=request.values["additionalCharges"]
			retHashSeq=additionalCharges+'|'+salt+'|'+status+'|||||||||||'+email+'|'+firstname+'|'+productinfo+'|'+amount+'|'+txnid+'|'+key
		except Exception:
			retHashSeq = salt+'|'+status+'|||||||||||'+email+'|'+firstname+'|'+productinfo+'|'+amount+'|'+txnid+'|'+key
		hashh=hashlib.sha512(retHashSeq.encode('utf-8')).hexdigest().lower()
	
	return flask.redirect(response_url_str+'?payment_id='+str(payuMoneyId)+'&status='+status+'&email='+email+'&mobile='+mobile+'&name='+firstname+'&amount='+amount+'&unique_id='+udf2+'&method='+method_1)

			
			



# @app.route('/success', methods=['GET','POST'])
# def success():
# 	txnid=request.values["txnid"]
# 	p=PayumoneyModel()
# 	get_user_id = p.getuser_idbytxnid(txnid)
# 	# user_id = get_user_id.get('user_id')
# 	# user = User().get_user(user_id)
# 	# session['user'] = user

# 	status         = request.values["status"]
# 	firstname      = request.values["firstname"]
# 	amount         = request.values["amount"]
# 	# txnid=request.values["txnid"]
# 	posted_hash    = request.values["hash"]
# 	key            = request.values["key"]
# 	productinfo    = request.values["productinfo"]
# 	email          = request.values["email"]
# 	mobile         = request.values["phone"]

# 	udf1         = request.values["udf1"]
# 	udf2         = request.values["udf2"]  # This line added on feb 23 2021

# 	base64_bytes   = udf1.encode("ascii") 
# 	sample_bytes   = base64.b64decode(base64_bytes) 
# 	response_url_str = sample_bytes.decode("ascii")


# 	# salt="4pdSWxjLqt"
# 	salt="QlpAxn2s"  # Techventure
	
# 	UTC = pytz.utc
# 	IST = pytz.timezone('Asia/Kolkata')
# 	datetime_ist = datetime.now(IST)

# 	dt_string = datetime_ist.strftime('%Y-%m-%d %H:%M:%S')


# 	save_data = {
# 				# 'user_id': user_id,
# 				'amount' : amount ,
# 				'payment_status' : status ,
# 				'payment_id' : txnid,
# 				'updated_at' : dt_string,
# 				}
# 	save_payment_dt = PayumoneyModel().updatepaymentdetail(txnid,save_data)
# 	return flask.redirect(response_url_str+'?payment_id='+txnid+'&status='+status+'&email='+email+'&mobile='+mobile+'&name='+firstname+'&amount='+amount+'&unique_id='+udf2)

	
	# try:
	# 	additionalCharges=request.values["additionalCharges"]
	# 	retHashSeq=additionalCharges+'|'+salt+'|'+status+'|||||||||||'+email+'|'+firstname+'|'+productinfo+'|'+amount+'|'+txnid+'|'+key
	# except Exception:
	# 	retHashSeq = salt+'|'+status+'|||||||||||'+email+'|'+firstname+'|'+productinfo+'|'+amount+'|'+txnid+'|'+key
	# hashh=hashlib.sha512((retHashSeq).encode('utf-8')).hexdigest().lower()
	# if(hashh !=posted_hash):
	# 	print ("Invalid Transaction. Please try again")
	# 	# payumoney_server_response
	# else:
	# 	data = { "txnid":txnid,"status":status,"amount":amount }
	# 	save_data = {
	# 			# 'user_id': user_id,
	# 			'amount' : amount ,
	# 			'payment_status' : status ,
	# 			'payment_id' : txnid,
	# 			'updated_at' : datetime.now(),
	# 			}
	# 	save_payment_dt = PayumoneyModel().updatepaymentdetail(txnid,save_data)
	# 	flash("Payment status  success " )
	# 	# return flask.redirect('http://127.0.0.1:5000/success?payment_id='+txnid+'&status='+status+'&email='+email+'&mobile='+mobile+'&name='+firstname+'&amount='+amount)
	# 	# payumoney_server_response
	# 	return flask.redirect(response_url_str+'?payment_id='+txnid+'&status='+status+'&email='+email+'&mobile='+mobile+'&name='+firstname+'&amount='+amount)

		# return redirect(url_for('user.DelegategReg'))
	# return render_template('videos/video_index.html',status=data.get('status'),txnid=data.get('txnid'),amount=data.get('amount'))

@app.route('/failure', methods=['GET','POST'])
def failure():
	txnid=request.values["txnid"]
	print(txnid)
	payuMoneyId   = request.values["payuMoneyId"]

	# get_user_id = Payumoney().getuser_idbytxnid(txnid)

	status       = request.values["status"]
	firstname    = request.values["firstname"]
	amount       = request.values["amount"]
	# paymentId    = request.values["paymentId"] 
	posted_hash  = request.values["hash"]
	key          = request.values["key"]
	productinfo  = request.values["productinfo"]
	email        = request.values["email"]
	mobile       = request.values["phone"]

	r_url         = request.values["udf1"]
	udf2          = request.values["udf2"]
	method_1         = request.values["mode"] or None
	base64_bytes   = r_url.encode("ascii") 
	sample_bytes   = base64.b64decode(base64_bytes) 
	response_url_str = sample_bytes.decode("ascii")



	salt=""
	try:
		additionalCharges=request.values["additionalCharges"]
		retHashSeq=additionalCharges+'|'+salt+'|'+status+'|||||||||||'+email+'|'+firstname+'|'+productinfo+'|'+amount+'|'+txnid+'|'+key
	except Exception:
		retHashSeq = salt+'|'+status+'|||||||||||'+email+'|'+firstname+'|'+productinfo+'|'+amount+'|'+txnid+'|'+key
	hashh=hashlib.sha512(retHashSeq.encode('utf-8')).hexdigest().lower()
	

	UTC = pytz.utc
	IST = pytz.timezone('Asia/Kolkata')
	datetime_ist = datetime.now(IST)

	dt_string = datetime_ist.strftime('%Y-%m-%d %H:%M:%S')

	save_data = {'amount' : amount ,'payment_status' : status ,'payment_id' : payuMoneyId,'method' : method_1 ,'updated_at' : dt_string}
	save_payment_dt = PayumoneyModel().updatepaymentdetail(txnid,save_data)			
	return flask.redirect(response_url_str+'?payment_id='+str(payuMoneyId)+'&status='+status+'&email='+email+'&mobile='+mobile+'&name='+firstname+'&amount='+amount+'&unique_id='+udf2)


# Webhook call payumoney account Oct 31 ,2022
@app.route('/payumoney-webhook', methods = ["GET", "POST"])
def PayumoneyWebhook():
	now          = datetime.now()
	dt_string    = now.strftime("%Y-%m-%d %H:%M:%S")
	email        = "ganesan@numerotec.com"
	emails = ["karthick@numerotec.com","ganesan@numerotec.com"]
	html         = "<h3 style='color:green'>Webhook Mail function calling at "+ dt_string +" </h3>"
	subject      = "Payumoney Webhook calling at "+ dt_string
	for email in emails :
	    email = email
	    pass
	    # EMAIL.WebhookInitiateMail(subject,html,email)
	
	
	# unique_id    = 'DEMO1212121'
	# webhook_data = {'amount' : '5.00' ,'payment_status' : 'success' ,'payment_id' : 1212122,'updated_at' : dt_string}
	# save_payment_dt = PayumoneyModel().updateWebhookData(unique_id,webhook_data)
	# return save_payment_dt
	if request.method == 'POST':
		# print("Data received from Webhook is: ", request.json)
		data_1 = request.json
		res_url_base64   = data_1["udf1"]
		base64_bytes     = res_url_base64.encode("ascii") 
		sample_bytes     = base64.b64decode(base64_bytes) 
		response_url_str = sample_bytes.decode("ascii")

		paymentId   = data_1["paymentId"]
		status      = data_1["status"]
		email       = data_1["customerEmail"]
		mobile      = data_1["customerPhone"] 
		firstname   = data_1["customerName"]
		
		amount      = data_1["amount"]
		unique_id   = data_1["udf2"]
		method_1    = data_1["paymentMode"] 

		webhook_data    = {'amount' : amount ,'payment_status' : status ,'payment_id' : paymentId,'updated_at' : dt_string , 'method' : method_1,'is_webhook_update' : 1}
		save_payment_dt = PayumoneyModel().updateWebhookData(unique_id,webhook_data)
		return save_payment_dt
	else :
		return "Method not allowed."


Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists