微信小程式--訊息推送配置Token令牌錯誤校驗失敗如何解決
阿新 • • 發佈:2019-01-10
<h1 id="微信小程式訊息推送配置token令牌錯誤"
style="margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; line-height: 1.3em;">[微信小程式]訊息推送配置Token令牌錯誤
,拼接成string字串;
@Author GQ 2017年07月26日
本想在微信小程式中接入上傳圖片到阿里雲功能,小程式中查詢很多資料還是沒能將圖片轉成流上傳,
所以無奈只能藉助小程式官方API中客服轉發功能上傳素材間接實現:
1.將小程式選擇的照片上傳至微信臨時伺服器並返回圖片url;
2.將url返回給自己的後臺,後臺通過url獲取流再上傳至阿里OSS;
想法挺美好,然而一地坑...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Token校驗失敗,請檢查確認 如下圖
-
URL:填寫自己寫的介面路徑,需要已經除錯好並且釋出到正式域名地址下才可以;
-
注意 : 當點選下方的
提交
按鈕時,微信會請求一次資料給你的URL地址
-
注意 : 當點選下方的
- Token(令牌): 自己隨便起個名字就行英文數字3-32字元;
- EncodingAESKey: 點隨機生成吧,省的自己寫;
- 加密方式: 相容就行
-
資料格式: 看個人喜好一般
Json
吧
然後就可以看著 訊息配置指南 操作了,這裡我詳細在用大白話說下,官方給的是PHP的程式碼…
-
上面說到微信會請求你填寫的
URL
地址,我們先來看下微信這個GET
請求的引數請求方式 : GET
引數 | 描述 |
---|---|
signature | 微信加密簽名(不用管他是怎麼來的,反正是很長的一串) |
timestamp | 時間戳 eg:1501060062 |
nonce | 隨機數 eg:2535181275 |
echostr | 隨機字串 eg:14324296167175543775 |
2. 大概瞭解了引數我們這個介面就好寫多了,我們屢一下這幾個引數的處理邏輯;
1) 還記得上面自己填寫的token
吧3-32字元的那個,這裡要用到;
2) 將timestamp
nonce
token
這三個引數對應的值進行字典排序;什麼是字典排序?
3) 排序後將這三個引數對應的值,只要值
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);
}