Files
2026-08-10 19:33:59 +08:00

91 lines
5.0 KiB
Python

import hashlib
import hmac
from datetime import datetime
from typing import Literal
from zoneinfo import ZoneInfo
import pydash
from pydantic import BaseModel, Field
from ulid import ULID
from wechat_微信支付证书.江苏六果科技有限公司支付证书.江苏六果科技有限公司支付参数 import sixpay六果科技公司
from wechat_数据库.微信支付券.代金券数据库 import stock券数据表
class stock券的状态(BaseModel):
demo_必填: int = Field(..., description="描述") # 必传属发生
# demo_可选: Optional[int] = None # 可选值
# demo_默认值: int = Field(default=100001, description="描述") # 有默认值
# demo_联合类型: Literal["xiao", "zizi"] = Field(..., description="描述")
def model_post_init(self, __context):
print("初始化完成,自动调用 model_post_init")
class stock发送代金券功能(BaseModel):
# demo_必填: int = Field(..., description="描述") # 必传属发生
# demo_可选: Optional[int] = None # 可选值
# demo_默认值: int = Field(default=100001, description="描述") # 有默认值
# demo_联合类型: Literal["xiao", "zizi"] = Field(..., description="描述")
pass
stock_id_代金券批次号: str = Field(..., description="发放代金券是创建的批次号")
stock券的状态: Literal["待领券", "已领券"] = Field(..., description="stock券的状态")
stock券待领券: Literal["待领券", "已领券"] = Field(default="待领券", description="stock券的状态")
stock券已领券: Literal["待领券", "已领券"] = Field(default="已领券", description="stock券的状态")
def send发券并返回前端需要的数据(self, self_mini_openid, self_mini_unionid):
"""前端请求:将这个字典对象返回给前端,前端调用小程序原生插件领取券"""
pass
# 第一步:准备数据
out_request_no = str(ULID()) # 商家侧的发券订单号
rfc3339 = datetime.now().astimezone(tz=ZoneInfo("Asia/Shanghai")).isoformat() # 代金券发券时的时间,因为代金券设置了起效的时间
mchid = sixpay六果科技公司.mchid
apiv2_key = sixpay六果科技公司.apiv2
# 第二步: 创建好需要的数据并验名
params每一张券需要验名的数据格式 = {
"out_request_no0": out_request_no, # 商家侧的发券订单号
"stock_id0": self.stock_id_代金券批次号, # 代金券创建的批次号
"send_coupon_merchant": mchid, # 发券的商家商户号
# 如果是支付券,必须包含此项并参与签名;商家券则去掉
"create_coupon_merchant0": mchid, # 发券的商家商户号
"customize_send_time0": rfc3339, # 当前的领券的时间
}
# iteratee为0是按key iteratee是以value的值来排序 reverse=False(从小到大) reverse=True(从大到小)
sorted_dict = dict(pydash.sort_by(collection=params每一张券需要验名的数据格式.items(), iteratee=0, reverse=False))
# 拼接组装好的数据
sign_str = pydash.join(array=[f"{key}={value}" for key, value in sorted_dict.items()], separator="&") + f"&key={apiv2_key}"
# # 4. 生成 HMAC-SHA256 签名并转大写
sign = hmac.new(key=apiv2_key.encode("utf-8"), msg=sign_str.encode("utf-8"), digestmod=hashlib.sha256, ).hexdigest().upper()
# 3. 拼接参数串
params = {
"out_request_no": out_request_no,
"stock_id": self.stock_id_代金券批次号,
"create_coupon_merchant": sixpay六果科技公司.mchid,
"customize_send_time": rfc3339,
"send_coupon_merchant": sixpay六果科技公司.mchid,
}
send_coupon_params: list[dict] = [params, ] # 发放代金券需要返回给前端的参数必须为列表 list[dict]
生成发券的数据 = {
"send_coupon_params": send_coupon_params,
"sign": sign,
"send_coupon_merchant": sixpay六果科技公司.mchid,
"suggest_immediate_use": True,
}
# 最后需要处理一下当前用户的 数据库
stock券数据表.objects.update_or_create(stock_商家侧订单号=out_request_no,
stock_未领取券的数据=生成发券的数据,
stock_批次号=self.stock_id_代金券批次号, stock_use_券状态=self.stock券的状态, stock_归属商户号=mchid,
mini_openid=self_mini_openid, mini_unionid=self_mini_unionid, defaults={"stock_use_发券时间": rfc3339})
return 生成发券的数据
def 领券后更新当前券的状态(self, self_mini_openid, self_mini_unionid):
pass
stock券数据表.objects.filter(mini_openid=self_mini_openid, mini_unionid=self_mini_unionid, stock_批次号=self.stock_id_代金券批次号,
stock_use_券状态=self.stock券待领券
).update(stock_use_券状态=self.stock券已领券)
if __name__ == "__main__":
print(00000000)