基于FastApi的微信公众号开发

  -  
使 - 

 URLTokenEncodingAESKey URL URLToken Token  URL  Token EncodingAESKeyGETsignaturetimestampnonceechostr

 

  1tokentimestampnonce     

  2sha1     

  3 signature 

def sign_sha1(signature, timestamp, nonce):
    """
    服务器配置 验证
    :param signature:
    :param timestamp:
    :param nonce:
    :return:
    """
    temp = [TOKEN, timestamp, nonce]
    temp.sort()
    hashcode = hashlib.sha1("".join(temp).encode('utf-8')).hexdigest()
    logger.info(f"加密:{hashcode},微信返回:{signature}")
    if hashcode == signature:
        return True
 # 返回的 echostr 需要是整型。int(echostr)

fastapi

# main.py
from fastapi import FastAPI
from api import wechat

app = FastAPI(title="EasyTest接口项目", description="这是一个接口文档", version="1.0.0", docs_url=None, redoc_url=None)

app.include_router(
    wechat.router,
    prefix="/wx",
    tags=["wx"],
    responses=response_error
)
# wechat.py
from fastapi import APIRouter
from public.wx_public import sign_sha1

router = APIRouter()

@router.get("/", summary="微信服务器配置验证")
async def handle_wx(signature, timestamp, nonce, echostr):
    try:
        if sign_sha1(signature, timestamp, nonce):
            return int(echostr)
        else:
            logger.error("加密字符串 不等于 微信返回字符串,验证失败!!!")
            return "验证失败!"
    except Exception as error:
        return f"微信服务器配置验证出现异常:{error}"

/

POSTxml

 fastapi

import aiohttp

from starlette.responses import HTMLResponse, Response
# parse_xml, Message 参考地址:https://github.com/vastsa/Wechat-Fastapi
from public.wx_message import parse_xml, Message
from public.wx_public import sign_sha1, send_wx_msg

@router.post("/", summary="回复微信消息")
async def wx_msg(request: Request, signature, timestamp, nonce, openid):
    if sign_sha1(signature, timestamp, nonce):
        try:
            async with aiohttp.ClientSession() as session:
                async with session.get("http://121.41.54.234/wx/login") as resp:
                    res = await resp.json()
            token = res["result"]["access_token"]
        except Exception as error:
            logger.error(f"获取微信登录token出现异常:{error}")
            token = ""
        try:
            rec_msg = parse_xml(await request.body())
            to_user = rec_msg.FromUserName
            from_user = rec_msg.ToUserName
            content, media_id = send_wx_msg(rec_msg, token)
            if rec_msg.MsgType == 'text' and not media_id:
                return Response(
                    Message(to_user, from_user, content=content).send(),
                    media_type="application/xml")
            elif rec_msg.MsgType == 'event' and content:
                return Response(
                    Message(to_user, from_user, content=content).send(), media_type="application/xml")
            elif rec_msg.MsgType == "image" or media_id:
                return Response(
                    Message(to_user, from_user, media_id=media_id, msg_type="image").send(),
                    media_type="application/xml")
        except Exception as error:
            logger.error(f"微信回复信息报错:{error}")
            return HTMLResponse('success')
  
  # wx_public.py
  def send_wx_msg(rec_msg, token):
    content, media_id = "", ""
    if rec_msg.MsgType == 'text':
        logger.info(f"文本信息:{rec_msg.Content}")
        patt = r"[\d+]{4}.[\d+]{1,2}.[\d+]{1,2}"
        content = re.findall(patt, rec_msg.Content)
        if content:
            # 输入出生年月日,回复信息
            content = age_content(content)
        else:
            content = rec_msg.Content
            if content in ["图片", "小七"] and token:
                # 输入 "图片", "小七" 回复图片
                media_id = wx_media(token)
            elif content in ["今天", "today"]:
                # 输入 "今天", "today" 回复信息
                content = fishing(make=True)
            elif content == "放假":
                # 输入 "放假" 回复信息
                content = fishing()
            else:
                # 输入 股票名称、股票代码 回复信息
                content = shares(stock_code=rec_msg.Content)
                if not content:
                    # 根据输入值返回
                    content = rec_msg.Content
    elif rec_msg.MsgType == 'event':
        if rec_msg.Event == "subscribe":
            # 关注公众号回复信息
            content = FOLLOW
        elif rec_msg.Event == "unsubscribe":
            # 取消关注
            logger.info(f"用户 {rec_msg.FromUserName} 取消关注了!!!")
    elif rec_msg.MsgType == "image":
        # 收到图片返回
        if token:
            media_id = wx_media(token)
        else:
            media_id = rec_msg.MediaId
    return content, media_id

log

 

 >>>关注公众号试试吧~

 

posted @ 2022-10-22 20:15  backlightズ  阅读(1152)  评论(1编辑  收藏  举报