{errcode“:-106,“errmsg“:“token check fail“} 微信公众号测试号接口配置报错Django版

这篇具有很好参考价值的文章主要介绍了{errcode“:-106,“errmsg“:“token check fail“} 微信公众号测试号接口配置报错Django版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

准备写个公众号做消息提醒的工具,,于是去了微信公众平台,准备用测试号接口试试。代码写的没问题,服务器也是已经部署了的。基本上所有问题都排查了还是显示配置失败。最后发现是请求头的问题


先列举一下需要注意的问题,看看你做到了没有,没有就先解决这些

  • 必须使用https://或http://开头的地址(绑定域名)
  • 地址必须支持80端口和443端口(网上找个网站扫描一下)
  • Token要么是英文要么是数字,3位以上,随便搞个abcdefg都行
    {errcode“:-106,“errmsg“:“token check fail“} 微信公众号测试号接口配置报错Django版,微信,django






    官网示例的代码也有点问题,直接返回的true,实际上要返回echostr的值
    然后这块就有坑了!!!

注意返回的必须是echostr的值,且返回的请求头必须和微信官方能接受的一样,他们收的是 text/html; charset=utf-8
一开始我是用的django的rest_framework框架,返回的Response的结果,虽然我设置了content_type但是这块有个坑,仍要注意的就是,Response类的默认行为是传递给它的数字自动序列为JSON格式,并且内容类型默认application/json。所以即使我设置了content_type="text/html; charset=utf-8。返回的结果仍然是JSON格式的。下面粘贴一下报错的Django代码
from rest_framework.response import Response
from rest_framework.views import APIView
import hashlib

class WeChatSignatureView(APIView):
    def get(self, request, *args, **kwargs):
        received_signature = request.query_params.get("signature")
        received_timestamp = request.query_params.get("timestamp")
        received_nonce = request.query_params.get("nonce")
        your_token = "your_token"  # 替换为你的token
        
        if self.check_signature(received_signature, received_timestamp, received_nonce, your_token):
            echostr = request.query_params.get("echostr")
            # 关键代码,虽然我指定了content_type但还是序列化了,没卵用
            return Response(echostr, content_type="text/html; charset=utf-8")
        else:
            return Response("Invalid signature", status=403, content_type="text/plain")

    def check_signature(self, signature, timestamp, nonce, token):
        tmp_arr = [token, timestamp, nonce]
        tmp_arr.sort()
        tmp_str = ''.join(tmp_arr)
        tmp_str = hashlib.sha1(tmp_str.encode()).hexdigest()
        
        return tmp_str == signature

如果你想返回 HTML 内容,并且需要设置正确的内容类型为 text/html; charset=utf-8,你应该手动创建一个 HttpResponse 对象,而不是使用 DRF 的 Response。以下是正确的示例:
from django.http import HttpResponse

    def get(self, request):
        received_signature = request.GET.get("signature")
        received_timestamp = request.GET.get("timestamp")
        received_nonce = request.GET.get("nonce")
        yue_token = 'yueyue'

        if self.check_signature(received_signature, received_timestamp, received_nonce, yue_token):
        # 返回时用Django的HttpResponse就不会序列化,指定这个content_type就能起到作用
            return HttpResponse(request.query_params.get("echostr"), content_type="text/html; charset=utf-8")
        else:
            return Response("Invalid signature", status=403)

    def check_signature(self, signature, timestamp, nonce, token):
        tmp_arr = [token, timestamp, nonce]
        tmp_arr.sort()
        tmp_str = ''.join(tmp_arr)
        tmp_str = hashlib.sha1(tmp_str.encode()).hexdigest()

        return tmp_str == signature

最后终于大功告成
{errcode“:-106,“errmsg“:“token check fail“} 微信公众号测试号接口配置报错Django版,微信,django文章来源地址https://www.toymoban.com/news/detail-637338.html

到了这里,关于{errcode“:-106,“errmsg“:“token check fail“} 微信公众号测试号接口配置报错Django版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包