103 lines
4.1 KiB
Python
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)
|