import hashlib import hmac from datetime import datetime from zoneinfo import ZoneInfo import pydash from pydantic import BaseModel, Field from ulid import ULID from wechat_微信支付证书.江苏六果科技有限公司支付证书.江苏六果科技有限公司支付参数 import sixpay六果科技公司 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="发放代金券是创建的批次号") def send发券并返回前端需要的数据(self): """前端请求:将这个字典对象返回给前端,前端调用小程序原生插件领取券""" 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": "22512292", # 代金券创建的批次号 "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)) print(sorted_dict) # 拼接组装好的数据 sign_str = "&".join([f"{k}={v}" for k, v in sorted_dict.items() if v]) + 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": "22512292", "create_coupon_merchant": sixpay六果科技公司.mchid, "customize_send_time": rfc3339, "send_coupon_merchant": sixpay六果科技公司.mchid, } send_coupon_params: list[dict] = [params, ] # 发放代金券需要返回给前端的参数必须为列表 list[dict] return { "send_coupon_params": send_coupon_params, "sign": sign, "send_coupon_merchant": sixpay六果科技公司.mchid, "suggest_immediate_use": True, } if __name__ == "__main__": print(00000000)