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)
|