import httpx import yaml from fastapi.responses import HTMLResponse, RedirectResponse with open("config.yaml", "r") as f: config = yaml.safe_load(f) base_backend_java = config["callback_urls"] base_frontend = config["frontend"] async def momo_group_callback(orderId: str, resultCode:str): url = f"""{base_backend_java["base"]}/{base_backend_java["momo"]["group"]["android"]["callback"]}""" params = {"orderId": orderId, "resultCode": resultCode } async with httpx.AsyncClient() as client: response = await client.get(url, params=params) if response.status_code == 200: data = response.json() status = data.get("status") return {"status": status} else: return {"error": response.status_code, "message": response.text} async def momo_callback(orderId: str, resultCode:str): url = f"""{base_backend_java["base"]}/{base_backend_java["momo"]["single"]["android"]["callback"]}""" params = {"orderId": orderId, "resultCode": resultCode } async with httpx.AsyncClient() as client: response = await client.get(url, params=params) if response.status_code == 200: data = response.json() status = data.get("status") return {"status": status} else: return {"error": response.status_code, "message": response.text} async def payos_callback(orderCode: int): url = f"""{base_backend_java["base"]}/{base_backend_java["payos"]["single"]["android"]["callback"]}""" params = {"orderCode": orderCode} async with httpx.AsyncClient() as client: response = await client.get(url, params=params) return response.json() async def group_payos_callback(orderCode: int): url = f"""{base_backend_java["base"]}/{base_backend_java["payos"]["group"]["android"]["callback"]}""" params = {"orderCode": orderCode} async with httpx.AsyncClient() as client: response = await client.get(url, params=params) return response.json() async def zalo_group_callback(app_trans_id: str): url = f"""{base_backend_java["base"]}/{base_backend_java["zalo"]["group"]["android"]["callback"]}""" params = {"app_trans_id": app_trans_id} async with httpx.AsyncClient() as client: response = await client.get(url, params=params) if response.status_code == 200: data = response.json() status = data.get("status") return {"status": status} else: return {"error": response.status_code, "message": response.text} async def zalo_callback(app_trans_id: str): url = f"""{base_backend_java["base"]}/{base_backend_java["zalo"]["single"]["android"]["callback"]}""" params = {"app_trans_id": app_trans_id} async with httpx.AsyncClient() as client: response = await client.get(url, params=params) if response.status_code == 200: data = response.json() status = data.get("status") return {"status": status} else: return {"error": response.status_code, "message": response.text} async def vnpay_callback(params): url = f"""{base_backend_java["base"]}/{base_backend_java["vnpay"]["single"]["android"]["callback"]}""" async with httpx.AsyncClient() as client: response = await client.get(url, params=params,timeout=90.0) async def vnpay_group_callback(params): url = f"""{base_backend_java["base"]}/{base_backend_java["vnpay"]["group"]["android"]["callback"]}""" async with httpx.AsyncClient() as client: response = await client.get(url, params=params,timeout=90.0) from fastapi.responses import HTMLResponse, RedirectResponse async def android_payos_callback( status: str = None, orderCode: str = None): try: result = await payos_callback(int(orderCode)) print(result) except Exception as e: print("Lỗi khi gọi payos_callback:", e) if status != "PAID": # Redirect khi bị hủy return RedirectResponse(url=f"""{base_frontend["android_redirect_base"]}?status=-49""") else : return RedirectResponse(url=f"""{base_frontend["android_redirect_base"]}?status=1""") async def android_group_payOs_callback(status: str = None, orderCode: str = None): try: result = await group_payos_callback(int(orderCode)) print(result) except Exception as e: print("Lỗi khi gọi payos_callback:", e) if status != "PAID": return RedirectResponse(url=f"""{base_frontend["android_redirect_base"]}?status=-49""") else : return RedirectResponse(url=f"""{base_frontend["android_redirect_base"]}?status=1""") async def payos_callback(orderCode: int): url = f"""{base_backend_java["base"]}/{base_backend_java["payos"]["single"]["android"]["callback"]}""" params = {"orderCode": orderCode} async with httpx.AsyncClient() as client: response = await client.get(url, params=params) return response.json() async def web_payos_callback(code: str = None, id: str = None, cancel: bool = None, status: str = None, orderCode: str = None): query_params = [] if code is not None: query_params.append(f"code={code}") if id is not None: query_params.append(f"id={id}") if cancel is not None: query_params.append(f"cancel={str(cancel).lower()}") if status is not None: query_params.append(f"status={status}") if orderCode is not None: query_params.append(f"orderCode={orderCode}") query_string = "&".join(query_params) try: result = await payos_callback(int(orderCode)) return RedirectResponse(url=f"""{base_frontend["base"]}/{base_frontend["web_redirect_paths"]["payos"]}?{query_string}""") except Exception as e: return RedirectResponse(url=f"""{base_frontend["base"]}/{base_frontend["web_redirect_paths"]["payos"]}?{query_string}""")