收藏
回答

如何解决公众号开发-基本配置中token验证失败问题?

我想让公众号后台接入一个机器人,采用python,Flask框架,其中main.py文件内容如下:

import time
from flask import Flask, make_response, request
import xml.etree.cElementTree as ET
import hashlib, requests

app = Flask(__name__)


@app.route("/")
def index():
    return "Hello World!"


@app.route('/wechat', methods=['GET', 'POST'])
def wechat():  # 1、 获取携带的 signature、timestamp、nonce、echostr
    if request.method == 'GET':
        signature = request.args.get("signature", "")

        timestamp = request.args.get("timestamp", "")

        nonce = request.args.get("nonce", "")

        echostr = request.args.get("echostr", "")
        print("原始:",signature, timestamp, nonce, echostr)

        token = "wxtokenone"  # 这里是你写的那个token值

        data = [token, timestamp, nonce]

        data.sort()  # 3、三个参数拼接成一个字符串并进行sha1加密

        temp = ''.join(data)

        sha1 = hashlib.sha1(temp.encode('utf-8'))
        hashcode = sha1.hexdigest()

        print("新的:",hashcode)  # 4、对比获取到的signature与根据上面token生成的hashcode,如果一致,则返回echostr,对接成功

        if hashcode == signature:
            return echostr
        else:
            return "error"
    else:
        xmlData = ET.fromstring(request.stream.read())
        msg_type = xmlData.find('MsgType').text
        if msg_type == 'text':
            question = xmlData.find('Content').text
            ToUserName = xmlData.find('ToUserName').text
            FromUserName = xmlData.find('FromUserName').text
            # Content = xmlData.find('Content').text
            Content = generate_response(question)
            reply = '''
                                    <xml>
                                    <ToUserName><![CDATA[%s]]></ToUserName>
                                    <FromUserName><![CDATA[%s]]></FromUserName>
                                    <CreateTime>%s</CreateTime>
                                    <MsgType><![CDATA[text]]></MsgType>
                                      <Content><![CDATA[%s]]></Content>
                                    </xml>
                                    '''
            response = make_response(reply % (FromUserName, ToUserName, str(int(time.time())), Content))
            response.content_type = 'application/xml'
            return response


def generate_response(question):
    api_url = "http://【服务器IP】/generate"
    headers = {'Content-Type': 'application/json'}
    payload = {
        "instruction": question,
        "input": "",
        "parameters": {
            "top_p": 0.7,
            "max_tokens": 256
        }
    }

    response = requests.post(api_url, headers=headers, json=payload)

    if response.status_code == 200:
        result = response.json()
        answer = result['generated_text']
        return answer
    else:
        return "Sorry, an error occurred."


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8091, debug=True)  # 这里开放8091端口

我在本地调试时,代码正常,使用了cpolar内网穿透工具,微信公众号中基本配置正常(成功),如图所示:

但是,当我把代码(服务)部署到阿里云服务器上,代码运行正常,如图:

并设置了一个域名,该域名通过浏览器(公网)、微信内都可以正常访问。但是在修改公众号的基本配置的时候却出现“token验证失败”。如图:

这个问题该怎么解决啊……已经搞一整天了,头都秃了,求大神指点迷津!

回答关注问题邀请回答
收藏

1 个回答

  • Mr.Zhao
    Mr.Zhao
    2023-07-05

    能不能收到请求

    2023-07-05
    有用
    回复 9
    • 小鱼的猫
      小鱼的猫
      2023-07-05
      不确定,我在验证之前写了一个 print,但没有什么东西。如图:
      2023-07-05
      回复
    • Mr.Zhao
      Mr.Zhao
      2023-07-05回复小鱼的猫
      有没有请求过来 这还不能确定?
      2023-07-05
      回复
    • Mr.Zhao
      Mr.Zhao
      2023-07-05回复小鱼的猫
      请求进不来,就跟代码无关了
      2023-07-05
      回复
    • 小鱼的猫
      小鱼的猫
      2023-07-05
      感觉没有收到微信服务器的请求。
      2023-07-05
      回复
    • 小鱼的猫
      小鱼的猫
      2023-07-05
      我感觉跟代码没有关系,因为同样的代码、python环境在本地是可以的
      2023-07-05
      回复
    查看更多(4)
登录 后发表内容