from fastapi import FastAPI from fastapi.responses import JSONResponse from pydantic import BaseModel from fastapi.middleware.cors import CORSMiddleware import requests import hashlib from urllib.parse import urlencode, unquote import time """ JSAPI 支付 """ key = "zA2hBU6pv6CIBzkW" # 填写通信密钥 mchid = "1561724891" # 特写商户号 # 构造签名函数 def sign(attributes): attributes_new = {k: attributes[k] for k in sorted(attributes.keys())} return (hashlib.md5((unquote(urlencode(attributes_new)) + "&key=" + key).encode(encoding="utf-8")).hexdigest().upper()) class Item(BaseModel): event: str EventGroupMsg: None = None prirobot_wxidce: None = None type: None = None # event # "":"EventGroupMsg",//事件标示(当前值为群消息事件) # "robot_wxid":"wxid_5hxa04j4z6pg22",//机器人wxid # "robot_name":"",//机器人昵称,一般为空 # "type":1,//1/文本消息 3/图片消息 34/语音消息 42/名片消息 43/视频 47/动态表情 48/地理位置 49/分享链接 2000/转账 2001/红包 2002/小程序 2003/群邀请 # "from_wxid":"18900134932@chatroom",//群id,群消息事件才有 # "from_name":"微群测",//群名字 # "final_from_wxid":"sundreamer",//发该消息的用户微信id # "final_from_name":"遗忘悠剑o",//微信昵称 # "to_wxid":"wxid_5hxa04j4z6pg22",//接收消息的人id,(一般是机器人收到了,也有可能是机器人发出的消息,别人收到了,那就是别人) # "msg":"图片https://b3logfile.com/bing/20201024.jpg",//消息内容(string/array) 使用时候根据不同的事件标示来定义这个值,字符串类型或者数据类型 # "money":0.01 //金额,只有"EventReceivedTransfer"事件才有该参数 app = FastAPI() # 允许所有来源跨域访问(不推荐用于生产环境) origins = ["*"] # 设置CORS(跨域资源共享)策略 app.add_middleware( CORSMiddleware, allow_origins=["*"], # 允许所有来源 allow_credentials=True, allow_methods=["*"], # 允许所有方法 allow_headers=["*"], # 允许所有请求头 ) @app.get("/") async def root(): return JSONResponse(content={"message": "Hello World"}) @app.post("/payh5") async def payh5(item: dict): print('item', item) # 时间戳 timenew = str(int(time.time())) order = { "mchid": mchid, "body": timenew, # 订单标题 "out_trade_no": timenew, # 订单号 "total_fee": item['total_fee'], # 金额,单位:分 # "openid": "o7LFAwWu3OhSrs49-1x5cSlFm0D8", # 通过openid接口获取到的openid # "notify_url": "" # "callback_url":'https://aiimg.hackrobot.cn/api' } order["callback_url"] = item['callback_url'] order["openid"] = item['openid'] order["sign"] = sign(order) request_url = "https://payjs.cn/api/jsapi" # 返回结果中包含`jsapi`字段,该字段的值即是前端发起时所需的6个支付参数 headers = {"content-type": "application/x-www-form-urlencoded"} response = requests.post(request_url, data=order, headers=headers) if response: print(response.json()) return response.json()