Skip to content

Instantly share code, notes, and snippets.

@nikitagruia-dev
Created October 17, 2019 14:00
Show Gist options
  • Save nikitagruia-dev/935a0e2ad6d1b382a3918b5a18afc196 to your computer and use it in GitHub Desktop.
Save nikitagruia-dev/935a0e2ad6d1b382a3918b5a18afc196 to your computer and use it in GitHub Desktop.
from dateutil.relativedelta import relativedelta
from django.http.response import HttpResponse
from datetime import datetime
import requests
import re
from ipware.ip import get_real_ip
from django.conf import settings
from django.shortcuts import render, redirect
from django.utils.decorators import decorator_from_middleware
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST, require_GET
from servicelog.libraries import email_send, marketing_automation
from servicelog.middleware.api_token_auth import PostTokenAuth
from servicelog.models import UserData, PaymentPlan, PaymentPeriod, PaymentTransaction
currency = 840
certs = (
settings.BASE_DIR + '/storage/cert/pcert.pem',
settings.BASE_DIR + '/storage/cert/dkey.pem',
)
@csrf_exempt
def receive(request):
trans_id = request.POST.get('trans_id')
return_currency = request.POST.get('currency')
amount = request.POST.get('amount')
error = request.POST.get('error')
ip = get_real_ip(request)
if trans_id:
trans = PaymentTransaction.objects.filter(trans_id=trans_id).first()
if error:
PaymentTransaction.end_error(trans_id, str(request.POST), error)
marketing_automation.send_email(marketing_automation.EMAIL_SUBSCRIPTION_FAIL, trans.user.email)
else:
response = requests.post(
'https://ecomm.maib.md:4455/ecomm2/MerchantHandler',
cert=certs,
data={
'command': 'c',
'trans_id': trans_id,
'client_ip_addr': ip,
}
)
response_data = parse_response(response.text)
if response_data.get('RESULT') == 'FAILED':
trans.success = False
trans.ecomm_return_error = 'Failed return status'
else:
amount_money = int(amount) / 100
if amount_money == trans.amount and str(return_currency) == str(currency):
trans.success = True
userdata = UserData.objects.get(user=trans.user)
userdata.plan = trans.plan
if userdata.plan_expire_at < datetime.now():
now = datetime.now()
else:
now = userdata.plan_expire_at
userdata.plan_expire_at = now + relativedelta(months=+trans.period.months_number)
userdata.message_expire_attempt_14_at = None
userdata.message_expire_attempt_7_at = None
userdata.message_expire_attempt_1_at = None
userdata.message_expire_expired_at = None
userdata.message_expire_before_at = None
userdata.message_trial_soon_at = None
userdata.message_trial_expired_at = None
userdata.save()
email_send.invoice(trans.user, trans)
else:
trans.success = False
trans.ecomm_return_error = 'Money amount is not equal: ' + str(amount_money) + ' ' + str(
return_currency) + ' != ' + str(trans.price) + ' ' + str(currency)
trans.ecomm_verify_response = response.text
trans.ecomm_result = response_data.get('RESULT')
trans.ecomm_result_code = response_data.get('RESULT_CODE')
trans.ecomm_3dsecure = response_data.get('3DSECURE')
trans.ecomm_card = response_data.get('CARD_NUMBER')
trans.ecomm_rrn = response_data.get('RRN')
trans.save()
if trans.success:
marketing_automation.send_email(marketing_automation.EMAIL_SUBSCRIPTION_START, trans.user.email)
else:
marketing_automation.send_email(marketing_automation.EMAIL_SUBSCRIPTION_FAIL, trans.user.email)
return redirect('/dashboard#!/subscription-result')
def parse_response(content):
# data = content.decode("utf-8")
result = {}
for line in re.findall(r"(.*): (.*)", content, re.IGNORECASE | re.MULTILINE):
result[line[0]] = line[1]
return result
@require_POST
@decorator_from_middleware(PostTokenAuth)
def renew(request):
plan_id = request.POST.get('plan')
period_id = request.POST.get('period')
plan = PaymentPlan.objects.get(id=plan_id)
period = PaymentPeriod.objects.get(id=period_id)
ip = get_real_ip(request)
if not ip:
ip = '127.0.0.1'
print(ip)
amount_money = round(
plan.price * period.months_number - (period.discount / 100 * plan.price * period.months_number), 2)
amount = int(amount_money * 100)
response = requests.post(
'https://ecomm.maib.md:4455/ecomm2/MerchantHandler',
cert=certs,
data={
'command': 'v',
'amount': amount,
'currency': currency,
'language': 'en',
'description': 'HostMonitor renew subscription for ' + str(period.months_number) + ' months',
'client_ip_addr': ip,
}
)
response_data = parse_response(response.text)
if response_data.get('error'):
PaymentTransaction.add_error(request.user, amount_money, response_data.get('error'), plan, period)
return redirect('/dashboard#!/subscription-result')
else:
trans_id = response_data.get('TRANSACTION_ID')
PaymentTransaction.start_transaction(request.user, trans_id, amount_money, response.text, plan, period)
return render(request, 'payment/transaction-start.html', {
'trans': trans_id,
'ip': ip,
'amount': amount,
'currency': currency,
})
@require_GET
def close(request):
response = requests.post(
'https://ecomm.maib.md:4455/ecomm2/MerchantHandler',
cert=certs,
data={
'command': 'b',
}
)
return HttpResponse(response.text)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment