[微信小程序]消息推送配置Token令牌错误校验失败

本文详细介绍微信小程序消息推送配置过程中遇到的Token令牌错误问题及其解决办法,包括如何正确设置和验证Token,确保消息推送功能正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[微信小程序]消息推送配置Token令牌错误

@Author GQ 20170726日  

本想在微信小程序中接入上传图片到阿里云功能,小程序中查询很多资料还是没能将图片转成流上传,
所以无奈只能借助小程序官方API中客服转发功能上传素材间接实现:

1.将小程序选择的照片上传至微信临时服务器并返回图片url;
2.将url返回给自己的后台,后台通过url获取流再上传至阿里OSS;

想法挺美好,然而一地坑...

第二步小程序上传图片给阿里云OSS请看我的这篇博客


Token校验失败,请检查确认 如下图

配置

  • URL:填写自己写的接口路径,需要已经调试好并且发布到正式域名地址下才可以;
    • 注意 : 当点击下方的 提交 按钮时,微信会请求一次数据给你的URL地址
  • Token(令牌): 自己随便起个名字就行英文数字3-32字符;
  • EncodingAESKey: 点随机生成吧,省的自己写;
  • 加密方式: 兼容就行
  • 数据格式: 看个人喜好一般Json

然后就可以看着 消息配置指南 操作了,这里我详细在用大白话说下,官方给的是PHP的代码…

上面说到微信会请求你填写的URL地址,我们先来看下微信这个GET请求的参数

请求方式 : GET

参数描述
signature微信加密签名(不用管他是怎么来的,反正是很长的一串)
timestamp时间戳 eg:1501060062
nonce随机数 eg:2535181275
echostr随机字符串 eg:14324296167175543775
 大概了解了参数我们这个接口就好写多了,我们屡一下这几个参数的处理逻辑;

1) 还记得上面自己填写的token吧3-32字符的那个,这里要用到;

2) 将timestamp nonce token 这三个参数对应的值进行字典排序;什么是字典排序?

3) 排序后将这三个参数对应的值,只要,拼接成string字符串;

4) 将拼接好的字符串SHA1加密,注意要小写字母,假设返回的string我命名为 secret

5) 比较参数 signaturesecret 值是否相等;

  • 如果相等表示验证成功,并且原封不动的返回 echostr
  • 如果不相等表示验证失败,返回写不写哇,你爱咋咋

将写好的接口发布到服务器上,然后在微信的消息配置页面填好信息,点击 提交 则会提示成功

配置成功


官方给的PHP,我这二吊子水平用.Net写的代码给大家做参考:

    /// <summary>
    /// 微信消息配置 
    /// </summary>
    public class GetWxMsg : IHttpHandler
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();
        public void ProcessRequest(HttpContext context)
        {
            var signature = context.Request["signature"];
            var timestamp = context.Request["timestamp"];
            var nonce = context.Request["nonce"];
            var echostr = context.Request["echostr"];

            logger.Info("微信消息服务器验证传入数据" + string.Format("signature:{0},timestamp:{1},nonce:{2},echostr:{3}", signature, timestamp, nonce, echostr));

            var token = "aaaaaaa";//自定义字段(自己填写3-32个字符)

            //timestamp和token和nonce 字典排序
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("token", token);
            dic.Add("nonce", nonce);
            dic.Add("timestamp", timestamp);
            var list = dic.OrderBy(s => s.Value);
            var conbineStr = "";
            foreach (var s in list)
            {
                conbineStr = conbineStr + s.Value;
            }
            string data = conbineStr;
            //sha1加密
            string secret = FormsAuthentication.HashPasswordForStoringInConfigFile(conbineStr, "SHA1").ToLower();
            var success = signature == secret;
            if (success)
            {
                data = echostr;
            }
            context.Response.ContentType = "text/plain";
            context.Response.Write(data);
        }
### 微信小程序消息推送安全模式配置与实现 #### 一、理解安全模式的重要性 为了保障用户数据的安全性和隐私,在微信小程序消息推送过程中引入了安全模式。这不仅能够防止恶意攻击者伪造服务器发送请求,还能确保只有经过授权的服务端才能向特定用户发送消息[^1]。 #### 二、启用HTTPS协议 在进行任何关于消息推送的操作之前,必须保证API接口调用地址采用HTTPS加密传输方式。这是因为在HTTP明文通信下容易遭受中间人攻击等问题的影响。对于基于Node.js框架构建的应用来说,可以利用Egg.js内置的支持轻松完成这项设置[^4]。 #### 三、校验签名机制 当服务端接收到客户端发起的消息订阅请求时(如`wx.requestSubscribeMessage()`),应当立即对该次操作的有效性做出判断。具体做法是在回调函数内部通过计算哈希值并与来自微信公众平台提供的signature参数相比较来进行验证。如果两者一致,则说明此次交互合法有效;反之则视为非法访问并予以拦截处理[^2]。 ```javascript // 假设已获得必要参数:timestamp, nonceStr 和 signature const crypto = require('crypto'); function checkSignature(timestamp, nonceStr, token){ let str = [token, timestamp, nonceStr].sort().join(''); const sha1 = crypto.createHash('sha1'); return sha1.update(str).digest('hex') === signature; } ``` #### 四、Token令牌管理 除了上述提到的方法外,还可以借助于临时票据(即access_token)进一步增强安全性。每当应用启动或每隔一段时间就需要重新申请一次新的access_token用于后续的各种业务逻辑当中去。值得注意的是,这里涉及到敏感信息存储问题,建议采取适当措施保护好这些凭证资料不被泄露出去[^3]。 #### 五、IP白名单设定 最后一步也是至关重要的环节——限定允许连接至公众号后台执行命令的源IP范围。开发者可以在微信公众平台上指定若干个可信网络节点作为唯一入口点,从而阻止其他未知位置尝试建立会话的行为发生。此功能同样适用于Java环境下的项目部署方案中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值