125 lines
7.4 KiB
Python
125 lines
7.4 KiB
Python
import secrets
|
|
|
|
import jmespath
|
|
from django.core.handlers.wsgi import WSGIRequest
|
|
from rest_framework import status
|
|
from rest_framework.decorators import action
|
|
from rest_framework.request import Request
|
|
from rest_framework.response import Response
|
|
from rest_framework.routers import DefaultRouter
|
|
from rest_framework.viewsets import ViewSet
|
|
from ulid import ULID
|
|
|
|
from sixGuoDjango import BaseResponse, ResData
|
|
from wechat_微信支付证书.江苏六果科技有限公司支付证书.六果公司支付类 import sixWechatPay六果泡泡支付
|
|
from wechat_数据库.雪花算法.雪花算法工具 import generator
|
|
from wechat_项目工具包.微信支付工具包.微信支付类 import paymentCategory
|
|
|
|
|
|
class 微信支付ViewSets(ViewSet):
|
|
notify_url回调地址 = "https://xiao.sixgou.com/demopay/jsapi_callback/"
|
|
|
|
@action(detail=False, methods=["post"], url_path="jsapi")
|
|
def 小程序支付jsapi(self, request: Request) -> Response:
|
|
""""""
|
|
url_pay = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi" # 发起请求的链接
|
|
self_mini_openid = request.data.get("self_mini_openid", False) #
|
|
out_trade_no = f"{ULID()}"
|
|
body_支付数据 = {
|
|
"mchid": sixWechatPay六果泡泡支付().mchid, # 【直连商户号】 直连商户号
|
|
"out_trade_no": out_trade_no, # 【商户订单号】 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。
|
|
"appid": sixWechatPay六果泡泡支付().appid, # 【公众号 或者 小程序ID】
|
|
"description": "测试支付接口", # 【商品描述】 商品描述要
|
|
"notify_url": "https://xiao.sixgou.com/demopay/jsapi_callback/", # 回调地址要
|
|
"amount": {
|
|
"total": 1, # 【总金额】 订单总金额,单位为分。
|
|
"currency": "CNY", # 【货币类型】 CNY:人民币,境内商户号仅支持人民币。
|
|
}, # 【支付者】 支付者信息。
|
|
"payer": {
|
|
# "openid": "ohQkD7A-N93kljcFmkCyG6e_D9vg", # 【用户标识】 用户在普通商户AppID下的唯一标识。 下单前需获取到用户的OpenID,详见OpenID获取
|
|
"openid": self_mini_openid, # 【用户标识】 用户在普通商户AppID下的唯一标识。 下单前需获取到用户的OpenID,详见OpenID获取
|
|
},
|
|
} # 请求的数据
|
|
wechat_pay_data = sixWechatPay六果泡泡支付(pay_methon方法="POST", pay_请求体=body_支付数据, pay_uri=url_pay).getpay_jsapi发起支付()
|
|
httpResData = BaseResponse(resData=ResData(listData=[""], dictData=wechat_pay_data), ).model_dump()
|
|
return Response(data=httpResData, status=status.HTTP_200_OK)
|
|
|
|
@action(detail=False, methods=["post"], url_path="navite")
|
|
def 二维码支付(self, request: WSGIRequest | Request) -> Response:
|
|
"""
|
|
生成收款的二维码链接,可以让用户来扫码支付
|
|
:param request:
|
|
:return:
|
|
"""
|
|
out_trade_no商家侧订单号 = f"{ULID()}"
|
|
native_url = "https://api.mch.weixin.qq.com/v3/pay/transactions/native"
|
|
native_body = {
|
|
"mchid": sixWechatPay六果泡泡支付().mchid, # 服务商户号
|
|
"out_trade_no": out_trade_no商家侧订单号, # 商户系统内部订单号
|
|
"appid": sixWechatPay六果泡泡支付().appid, # 服务商应用ID
|
|
"description": "测试", # 商品的描述信息
|
|
"notify_url": "https://xiao.sixgou.com/demopay/callback_navite/", # 回调地址
|
|
"amount": {"total": 1, "currency": "CNY"},
|
|
}
|
|
wechat_pay_data = sixWechatPay六果泡泡支付(pay_methon方法="POST", pay_请求体=native_body, pay_uri=native_url).getpay_navite发起二维码支付()
|
|
print(wechat_pay_data)
|
|
# res_data = wechatPay(payment=paymentCategory).getpay_navite(navite_body=native_body)
|
|
# print(res_data)
|
|
code_url = jmespath.search(data=wechat_pay_data, expression="code_url")
|
|
# print(code_url)
|
|
import segno
|
|
|
|
qr = segno.make_qr(content=code_url, )
|
|
data = qr.png_data_uri(scale=5)
|
|
qr.save(out="myqr.png")
|
|
httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": data}), ).model_dump()
|
|
return Response(data=httpResData, status=status.HTTP_200_OK, )
|
|
|
|
@action(detail=False, methods=["post"], url_path="qrCode")
|
|
def 扫用户付款码支付(self, request: Request):
|
|
"""
|
|
扫用户付款码的测试接口
|
|
:param request:
|
|
"""
|
|
nonce_str = secrets.token_hex(10) # 随机字符串
|
|
order_random = f"{generator.generate_id()}"
|
|
auth_code = request.data.get("auth_code", False) # 前端扫码读取的付款码的数据信息
|
|
# auth_code = "123497182327333282" # TODO 扫码支付付款码,设备读取用户微信中的条码或者二维码信息(这个值需要小程序端,扫码,将数据传递进来)
|
|
# fu_kuan_data 是微信官方要求组装的数据类型
|
|
fu_kuan_data = {
|
|
"appid": paymentCategory.appid, # 小程序的appid
|
|
"mch_id": paymentCategory.mchid, # 微信支付分配的商户号
|
|
"nonce_str": nonce_str, # 随机字符串
|
|
"out_trade_no": order_random, # 商户订单号
|
|
"body": "test",
|
|
"auth_code": auth_code,
|
|
"total_fee": 1, # 订单总金额,单位为分,只能为整数,详见支付金额(必填)
|
|
}
|
|
# wechat_data = wechatPay(payment=paymentCategory).getpay_code扫用户付款码(body_data=fu_kuan_data)
|
|
# print(wechat_data)
|
|
wechat_data = sixWechatPay六果泡泡支付().getpay_code扫用户付款码(body_data=fu_kuan_data)
|
|
httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": "xiaozizi"}), ).model_dump()
|
|
return Response(data=httpResData, status=status.HTTP_200_OK)
|
|
|
|
@action(detail=False, methods=["post"], url_path="jsapi_callback")
|
|
def jsapi支付回调测试接口(self, request: Request) -> Response:
|
|
""" 微信支付成功后的回调接口 """
|
|
print("回调的请求体", request.data)
|
|
print("回调的请求体", request.headers)
|
|
wechat_data支付回调数据 = sixWechatPay六果泡泡支付(pay_uri=None, pay_请求体={}, pay_methon方法="POST").callBack回调解密(headers=request.headers, response_body=request.data)
|
|
print("\n🍎 🍏 🍊 🍎 🍏 🍊 🍎 🍏 🍊 🍎 🍏 🍊 🍎 🍏 \n", wechat_data支付回调数据, "\n🍎 🍏 🍊 🍎 🍏 🍊 🍎 🍏 🍊 🍎 🍏 🍊 🍎 🍏 \n")
|
|
|
|
httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": "xiaozizi"}), ).model_dump()
|
|
return Response(data=httpResData, status=status.HTTP_200_OK)
|
|
|
|
@action(detail=False, methods=["post"], url_path="callback_navite")
|
|
def 二维码支付回调(self, request: Request):
|
|
"""注释"""
|
|
wechat_data支付回调数据 = sixWechatPay六果泡泡支付().callBack回调解密(headers=request.headers, response_body=request.data)
|
|
print("二维码支付回调二维码支付回调二维码支付回调二维码支付回调二维码支付回调")
|
|
return Response(data={"msg": "success"})
|
|
|
|
|
|
微信支付ViewSetsRouter = DefaultRouter()
|
|
微信支付ViewSetsRouter.register(prefix="", viewset=微信支付ViewSets, basename="微信支付ViewSets")
|