Files

146 lines
9.9 KiB
Python
Raw Permalink Normal View History

2026-08-06 20:39:45 +08:00
import threading
from functools import wraps
2026-08-02 14:07:04 +08:00
import emoji
import orjson
import pydash
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
2026-08-10 19:33:59 +08:00
from wechat_微信支付证书.江苏六果科技有限公司支付证书.六果公司支付类 import sixWechatPay六果泡泡支付
2026-08-02 14:07:04 +08:00
from wechat_数据库.支付订单数据库.商品订单数据 import order订单
from wechat_数据库.用户数据库.小程序登陆用户 import weiuser
from wechat_项目工具包.EMS中国邮政.ems邮政 import ems邮政物流工具
2026-08-10 19:33:59 +08:00
from wechat_项目工具包.微信支付工具包.微信支付类 import paymentCategory
2026-08-02 14:07:04 +08:00
from wechat_项目工具包.数据库的工具包.更新用户积分 import miniUser用户角色, miniUser积分
2026-08-06 20:39:45 +08:00
def sync_lock_接口线程锁(lock):
def decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
with lock:
return fn(*args, **kwargs)
return wrapper
return decorator
2026-08-02 14:07:04 +08:00
class 业务订单接口ViewSets(ViewSet):
2026-08-06 20:39:45 +08:00
lock_接口线程锁 = threading.Lock() # 所有请求 共享这一个 lock对象
2026-08-02 14:07:04 +08:00
def 处理积分方法(self, 商家订单号):
pass
# 将字符串转为换字典
order对象 = order订单.objects.get(order支付商家侧订单号=商家订单号) # 拿到当前订单的对象数据
# 通过订单号,拿到 第一个值:
order购物车商品列表数据 = pydash.get(obj=pydash.head(order对象.order购物车商品数据), path="推荐积分.商品详情页面分享")
def 首单自动注册成为推广员(self, out_trade_no):
pass
order对象 = order订单.objects.get(order支付商家侧订单号=out_trade_no)
user用户对象 = weiuser.objects.get(unionid=order对象.order支付者unionid)
six绑定的企微员工对象, sixBool = weiuser.objects.get_or_create(unionid=user用户对象.user_绑定企微UNIONID)
# 判断用户成为推广员的标准 成为的条件,当前用户绑定的企微员工账号, 必须是同一个区县的
if user用户对象.user_角色权限 == miniUser用户角色().普通会员 and six绑定的企微员工对象.user_区县 == user用户对象.user_区县:
# 当前的用户为普通会员 ,这里被调用了说明肯定是下单成功了 , 需要升级为推广员
print("支付测试成功了,并且能成为推广员")
user用户对象.user_角色权限 = miniUser用户角色().推广员
user用户对象.save()
2026-08-06 20:39:45 +08:00
def 生成单品优惠券的数据(self, order购物车商品数据: list[dict]):
pass
准备一个空列表 = []
# 循环传递进来的数据
for item in order购物车商品数据:
# 创建对象
data_dict = {
"merchant_goods_id": "01KYNDT2KKKPZCR5G1TVG9GZ7G",
"goods_name": emoji.replace_emoji(pydash.get(obj=item, path="goods_商品标题")),
"quantity": pydash.get(obj=item, path="单个商品订单数量"),
"unit_price": pydash.get(obj=item, path="单个商品实际支付价格")
}
准备一个空列表.append(data_dict)
return 准备一个空列表
2026-08-02 14:07:04 +08:00
@action(detail=False, methods=["post"], url_path="mall")
def 商城订单支付接口(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", None)
self_mini_unionid = request.data.get("self_mini_unionid", None)
order购物车商品数据 = request.data.get("order购物车商品数据", None)
order购物车商品数量 = request.data.get("order购物车商品数量", None)
order购物车商品总价 = request.data.get("order购物车商品总价", None)
order用户配送地址 = request.data.get("order用户配送地址", None)
share订单分享者ID = request.data.get("share订单分享者ID", "六果") # 当前是否有上级对象
order订单类型 = request.data.get("order订单类型", None)
goods标题 = emoji.replace_emoji(pydash.get(obj=pydash.head(order购物车商品数据), path="goods_商品标题"))
2026-08-06 20:39:45 +08:00
goods_detail_支付优惠券的数据 = self.生成单品优惠券的数据(order购物车商品数据=order购物车商品数据)
2026-08-02 14:07:04 +08:00
out_trade_no商家侧的订单号 = f"OAT{ULID()}" # 生成商家侧的订单号
body = {
"mchid": paymentCategory.mchid, # 【直连商户号】 直连商户号
"out_trade_no": out_trade_no商家侧的订单号, # 【商户订单号】 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。
"appid": paymentCategory.appid, # 【公众号 或者 小程序ID】
"description": goods标题, # 【商品描述】 商品描述要
2026-08-06 20:39:45 +08:00
"notify_url": "https://xiao.sixgou.com/six/mall_callbakc/", # 回调地址要
2026-08-02 14:07:04 +08:00
"amount": {
# "total": order购物车商品总价, # 【总金额】 订单总金额,单位为分。
"total": 1, # 【总金额】 订单总金额,单位为分。
"currency": "CNY", # 【货币类型】 CNY:人民币,境内商户号仅支持人民币。
}, # 【支付者】 支付者信息。
"attach": orjson.dumps({"share订单分享者ID": share订单分享者ID, "out_trade_no": out_trade_no商家侧的订单号, }).decode(
encoding="utf-8"),
"payer": {
# "openid": "ohQkD7A-N93kljcFmkCyG6e_D9vg", # 【用户标识】 用户在普通商户AppID下的唯一标识。 下单前需获取到用户的OpenID,详见OpenID获取
"openid": self_mini_openid, # 【用户标识】 用户在普通商户AppID下的唯一标识。 下单前需获取到用户的OpenID,详见OpenID获取
},
2026-08-06 20:39:45 +08:00
"detail": {
# 【商品详情】 商品详情描述,该结构去除多余空格换行压缩后,总长度不能超过6144字节。
"goods_detail": goods_detail_支付优惠券的数据
},
"support_fapiao": True, # 【电子发票入口开放标识】 传入true时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效。
2026-08-02 14:07:04 +08:00
} # 请求的数据
2026-08-10 19:33:59 +08:00
wechat_pay_data = sixWechatPay六果泡泡支付(pay_methon方法="POST", pay_请求体=body, pay_uri=url_pay).getpay_jsapi发起支付()
2026-08-02 14:07:04 +08:00
order订单对象 = order订单.objects.create(order支付商家侧订单号=out_trade_no商家侧的订单号,
order购物车商品总价=order购物车商品总价, order购物车商品数据=order购物车商品数据,
2026-08-10 22:07:46 +08:00
order购物车商品数量=order购物车商品数量, order支付数据=body, order支付状态="支付中", order订单类型=order订单类型,
order用户配送地址=order用户配送地址, order分享者unionid=share订单分享者ID, order支付者openid=self_mini_openid,
2026-08-02 14:07:04 +08:00
order支付者unionid=self_mini_unionid,
)
2026-08-10 19:33:59 +08:00
httpResData = BaseResponse(resData=ResData(listData=[""], dictData=wechat_pay_data), ).model_dump()
2026-08-02 14:07:04 +08:00
return Response(data=httpResData, status=status.HTTP_200_OK)
2026-08-06 20:39:45 +08:00
@sync_lock_接口线程锁(lock=lock_接口线程锁) # 锁住这个接口所有并发请求,
2026-08-02 14:07:04 +08:00
@action(detail=False, methods=["post"], url_path="mall_callbakc")
def jsapi支付回调测试接口(self, request: Request) -> Response:
""" 微信支付成功后的回调接口 """
2026-08-10 19:33:59 +08:00
wechat_data支付回调数据 = sixWechatPay六果泡泡支付(pay_uri="", pay_请求体={}, pay_methon方法="POST", ).callBack回调解密(headers=request.headers, response_body=request.data)
2026-08-02 14:07:04 +08:00
out_trade_no商家侧支付订单号 = pydash.get(obj=wechat_data支付回调数据, path="out_trade_no") # 商家侧的订单号
trade_state_desc = pydash.get(obj=wechat_data支付回调数据, path="trade_state_desc") # 支付回调的支付状态
transaction_id = pydash.get(obj=wechat_data支付回调数据, path="transaction_id")
self.首单自动注册成为推广员(out_trade_no=out_trade_no商家侧支付订单号)
生成商家侧物流的订单号 = f"EMS{ULID()}"
order订单.objects.filter(order支付商家侧订单号=out_trade_no商家侧支付订单号).update(order支付数据=wechat_data支付回调数据,
order支付状态=trade_state_desc,
order物流状态=order订单.order订单choosies物流状态.待揽件.value,
order物流订单号=生成商家侧物流的订单号,
order支付微信官方订单号=transaction_id,
)
2026-08-10 19:33:59 +08:00
(miniUser积分(share分享者unionidID="", click点击者unionidID="", bind绑定的企微unionidID="")
2026-08-02 14:07:04 +08:00
.add添加好友助力下单返利积分(order支付商家侧订单号=out_trade_no商家侧支付订单号, share积分类型="好友下单"))
ems邮政物流工具().生成运单(out_trade_no商家侧支付订单号=out_trade_no商家侧支付订单号) # 调用方法,生成真实的物流订单号码;
httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": "xiaozizi"}), ).model_dump()
return Response(data=httpResData, status=status.HTTP_200_OK)
业务订单接口ViewSetsViewSetsRouter: DefaultRouter = DefaultRouter()
业务订单接口ViewSetsViewSetsRouter.register(prefix="", viewset=业务订单接口ViewSets, basename="业务订单接口ViewSets")