Files
backend/backend/app/admin/api/v1/wxpay.py
2025-12-06 13:39:06 +08:00

103 lines
4.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from fastapi import APIRouter, Depends, Request
from fastapi_limiter.depends import RateLimiter
from backend.app.admin.schema.wxpay import (
CreateJsapiOrderRequest,
CreateJsapiOrderResponse,
QueryOrderResponse,
CloseOrderResponse,
CreateRefundRequest,
CreateRefundResponse,
QueryRefundResponse,
DownloadBillResponse,
)
from backend.app.admin.service.wxpay_service import wxpay_service
from backend.common.response.response_schema import response_base, ResponseSchemaModel
from backend.common.security.jwt import DependsJwtAuth
router = APIRouter()
@router.post('/order/jsapi', summary='JSAPI/小程序下单', dependencies=[DependsJwtAuth, Depends(RateLimiter(times=10, minutes=1))])
async def create_jsapi_order(
request: Request,
body: CreateJsapiOrderRequest,
) -> ResponseSchemaModel[CreateJsapiOrderResponse]:
result = await wxpay_service.create_jsapi_order(
user_id=request.user.id,
payer_openid=request.user.openid,
product_id=body.product_id,
)
data = CreateJsapiOrderResponse(**result)
return response_base.success(data=data)
# @router.get('/order/{out_trade_no}', summary='查询订单', dependencies=[DependsJwtAuth])
@router.get('/order/{out_trade_no}', summary='查询订单')
async def query_order(out_trade_no: str) -> ResponseSchemaModel[QueryOrderResponse]:
result = await wxpay_service.query_order(out_trade_no)
data = QueryOrderResponse(**result)
return response_base.success(data=data)
@router.post('/order/{out_trade_no}/close', summary='关闭订单', dependencies=[DependsJwtAuth])
async def close_order(out_trade_no: str) -> ResponseSchemaModel[CloseOrderResponse]:
result = await wxpay_service.close_order(out_trade_no)
data = CloseOrderResponse(**result)
return response_base.success(data=data)
@router.post('/refund', summary='申请退款', dependencies=[DependsJwtAuth])
async def create_refund(
request: Request,
body: CreateRefundRequest,
) -> ResponseSchemaModel[CreateRefundResponse]:
result = await wxpay_service.create_refund(
user_id=request.user.id,
out_trade_no=body.out_trade_no,
amount_cents=body.amount_cents,
reason=body.reason,
)
data = CreateRefundResponse(**result)
return response_base.success(data=data)
@router.get('/refund/{out_refund_no}', summary='查询退款', dependencies=[DependsJwtAuth])
async def query_refund(out_refund_no: str) -> ResponseSchemaModel[QueryRefundResponse]:
result = await wxpay_service.query_refund(out_refund_no)
data = QueryRefundResponse(**result)
return response_base.success(data=data)
@router.post('/notify', summary='支付回调通知')
async def pay_notify(request: Request) -> ResponseSchemaModel[dict]:
raw = await request.body()
print('pay_notify raw: ',raw)
timestamp = request.headers.get('Wechatpay-Timestamp', '')
nonce = request.headers.get('Wechatpay-Nonce', '')
signature = request.headers.get('Wechatpay-Signature', '')
serial = request.headers.get('Wechatpay-Serial', '')
result = await wxpay_service.handle_notify(raw, timestamp, nonce, signature, serial)
return response_base.success(data=result)
@router.post('/notify/refund', summary='退款回调通知')
async def refund_notify(request: Request) -> ResponseSchemaModel[dict]:
raw = await request.body()
timestamp = request.headers.get('Wechatpay-Timestamp', '')
nonce = request.headers.get('Wechatpay-Nonce', '')
signature = request.headers.get('Wechatpay-Signature', '')
serial = request.headers.get('Wechatpay-Serial', '')
result = await wxpay_service.handle_refund_notify(raw, timestamp, nonce, signature, serial)
return response_base.success(data=result)
# @router.get('/bill', summary='下载交易账单', dependencies=[DependsJwtAuth])
# async def download_bill(bill_date: str, bill_type: str = 'ALL') -> ResponseSchemaModel[DownloadBillResponse]:
# result = await wxpay_service.download_bill(bill_date, bill_type)
# data = DownloadBillResponse(**result)
# return response_base.success(data=data)