from typing import Annotated, Optional from fastapi import APIRouter, Depends from starlette.responses import JSONResponse from app.core.dependencies import AuthPermission from app.core.router_class import OperationLogRoute from app.common.response import ResponseSchema, SuccessResponse, ErrorResponse from app.core.apikey import TenantApiKeyAuth from app.api.v1.module_system.auth.schema import AuthSchema from app.plugin.module_payment.apikey.schema import ApiKeyPayload from app.plugin.module_payment.openapi.service import OpenConfService, OpenTransferService from app.plugin.module_payment.openapi.schema import OpenConfOutSchema, OpenConfUpdateSchema, OpenTransferSchema, \ OpenTransferOutSchema, OpenTransferQuerySchema OpenapiRouter = APIRouter( route_class=OperationLogRoute, prefix="/openapi", tags=["开放接口"], ) @OpenapiRouter.post( "/account/transfer", summary="资金专户转账", description="从资金专户转账到支付宝账户/银行卡/资金专户", response_model=ResponseSchema[OpenTransferOutSchema], ) async def open_transfer_controller( apikey: Annotated[ApiKeyPayload[OpenTransferSchema], Depends(TenantApiKeyAuth(OpenTransferSchema))], ) -> JSONResponse: """ 租户资金专户转账接口 支持通过API Key进行认证,适用于平台租户调用 """ auth = apikey.auth transfer_data = apikey.data if transfer_data is None: return ErrorResponse(msg="缺少必需参数") transfer_data.api_key = apikey.api_key result = await OpenTransferService.open_transfer_service(auth=auth, data=transfer_data) return SuccessResponse(data=result, msg="转账申请已提交") @OpenapiRouter.post( "/account/transfer/query", summary="查询转账", description="查询转账详情", ) async def open_transfer_query_controller( apikey: Annotated[ApiKeyPayload[OpenTransferQuerySchema], Depends(TenantApiKeyAuth(OpenTransferQuerySchema))], ) -> JSONResponse: auth = apikey.auth query_data = apikey.data if query_data is None: return ErrorResponse(msg="缺少必需参数") result = await OpenTransferService.open_query_service(auth=auth, query=query_data) return SuccessResponse(data=result, msg="查询成功") # ===================================================================== @OpenapiRouter.get( "/conf", summary="查询开放配置", description="查询当前企业的开放接口配置", response_model=ResponseSchema[OpenConfOutSchema], ) async def get_open_conf_controller( auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:tenant:conf:query"]))], ) -> JSONResponse: """ 查询开放配置接口 获取当前企业的支付宝开放接口配置信息 """ result = await OpenConfService.get_conf_service(auth=auth) return SuccessResponse(data=result, msg="查询成功") @OpenapiRouter.post( "/conf", summary="创建/更新开放配置", description="创建或更新当前企业的开放接口配置(前端只允许配置回调地址)", response_model=ResponseSchema[OpenConfOutSchema], ) async def save_open_conf_controller( data: OpenConfUpdateSchema, auth: Annotated[AuthSchema, Depends(AuthPermission(["module_system:tenant:conf:update"]))], ) -> JSONResponse: """ 创建/更新开放配置接口 如果配置已存在则更新,不存在则创建(仅更新回调地址) """ result = await OpenConfService.save_conf_service(auth=auth, data=data) return SuccessResponse(data=result, msg="配置更新成功")