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

  • Post author:
  • Post category:小程序


[微信小程序]消息推送配置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) 比较参数

signature



secret

值是否相等;

  • 如果相等表示验证成功,并且原封不动的返回

    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);
        }



版权声明:本文为baidu_25797177原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。