Files

91 lines
5.0 KiB
Python
Raw Permalink Normal View History

2026-08-02 14:07:04 +08:00
import hashlib
import hmac
from datetime import datetime
2026-08-10 19:33:59 +08:00
from typing import Literal
2026-08-02 14:07:04 +08:00
from zoneinfo import ZoneInfo
import pydash
from pydantic import BaseModel, Field
from ulid import ULID
from wechat_微信支付证书.江苏六果科技有限公司支付证书.江苏六果科技有限公司支付参数 import sixpay六果科技公司
2026-08-10 19:33:59 +08:00
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")
2026-08-02 14:07:04 +08:00
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="发放代金券是创建的批次号")
2026-08-10 19:33:59 +08:00
stock券的状态: Literal["待领券", "已领券"] = Field(..., description="stock券的状态")
stock券待领券: Literal["待领券", "已领券"] = Field(default="待领券", description="stock券的状态")
stock券已领券: Literal["待领券", "已领券"] = Field(default="已领券", description="stock券的状态")
2026-08-06 20:39:45 +08:00
2026-08-10 19:33:59 +08:00
def send发券并返回前端需要的数据(self, self_mini_openid, self_mini_unionid):
2026-08-02 14:07:04 +08:00
"""前端请求:将这个字典对象返回给前端,前端调用小程序原生插件领取券"""
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, # 商家侧的发券订单号
2026-08-06 20:39:45 +08:00
"stock_id0": self.stock_id_代金券批次号, # 代金券创建的批次号
2026-08-02 14:07:04 +08:00
"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))
# 拼接组装好的数据
2026-08-10 19:33:59 +08:00
sign_str = pydash.join(array=[f"{key}={value}" for key, value in sorted_dict.items()], separator="&") + f"&key={apiv2_key}"
2026-08-02 14:07:04 +08:00
# # 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,
2026-08-06 20:39:45 +08:00
"stock_id": self.stock_id_代金券批次号,
2026-08-02 14:07:04 +08:00
"create_coupon_merchant": sixpay六果科技公司.mchid,
"customize_send_time": rfc3339,
"send_coupon_merchant": sixpay六果科技公司.mchid,
}
send_coupon_params: list[dict] = [params, ] # 发放代金券需要返回给前端的参数必须为列表 list[dict]
2026-08-10 19:33:59 +08:00
生成发券的数据 = {
2026-08-02 14:07:04 +08:00
"send_coupon_params": send_coupon_params,
"sign": sign,
"send_coupon_merchant": sixpay六果科技公司.mchid,
"suggest_immediate_use": True,
}
2026-08-10 19:33:59 +08:00
# 最后需要处理一下当前用户的 数据库
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券已领券)
2026-08-02 14:07:04 +08:00
if __name__ == "__main__":
print(00000000)