[微信小程序]消息推送配置Token令牌错误
@Author GQ 2017年07月26日
本想在微信小程序中接入上传图片到阿里云功能,小程序中查询很多资料还是没能将图片转成流上传,
所以无奈只能借助小程序官方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);
}