import hashlib import hmac import json import threading import time import requests from django.conf import settings from django.db import transaction from django.http import HttpResponse, JsonResponse from django.shortcuts import redirect from django.views.decorators.csrf import csrf_exempt from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt from vbv_lernwelt.core.models import User @csrf_exempt @django_view_authentication_exempt @transaction.non_atomic_requests def fake_datatrans_api_view(request, api_url=""): if api_url == "/v1/transactions" and request.method == "POST": data = json.loads(request.body.decode("utf-8")) user = User.objects.get(id=data["user_id"]) if "customer" in data and not user.abacus_debitor_number: user.set_increment_abacus_debitor_number() data["customer"]["id"] = user.abacus_debitor_number user.additional_json_data["datatrans_transaction_payload"] = data user.save() return JsonResponse({"transactionId": data["refno"]}, status=201) return HttpResponse( content="unknown api url", content_type="application/json", status=400 ) @csrf_exempt @django_view_authentication_exempt def fake_datatrans_pay_view(request, api_url=""): def call_transaction_complete_webhook( webhook_url, transaction_id, datatrans_status="settled" ): time.sleep(1) payload = { "transactionId": transaction_id, "status": datatrans_status, } key_hex_bytes = bytes.fromhex(settings.DATATRANS_HMAC_KEY) # Create sign with timestamp and payload sign = hmac.new( key_hex_bytes, bytes(str(1) + json.dumps(payload), "utf-8"), hashlib.sha256 ) response = requests.post( url=webhook_url, json=payload, headers={"Datatrans-Signature": f"t=1,s0={sign.hexdigest()}"}, ) print(response) if api_url.startswith("/v1/start/"): transaction_id = api_url.split("/")[-1] transaction_user = User.objects.filter( additional_json_data__datatrans_transaction_payload__refno=transaction_id ).first() if transaction_user is None: return HttpResponse( content=f"""
No active transaction found for {transaction_id}
""", status=404, ) if request.method == "GET": return HttpResponse( content=f"""