問題效果如下
返回錯誤詳細信息
errMsg: "config:fail,Error: 系統錯誤,錯誤碼:63002,invalid signature [20201105 15:06:48][]"
通過config接口注入權限驗證配置ready方法一直返回錯誤。
接口文檔地址: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#4
遺憾這裏這有前端的文檔調用說明,沒找到後臺調用獲取jsapi_ticket的方法。
後臺用java調用獲取如下參數:
wx.config({
debug: true, // 開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時纔會打印。
appId: '', // 必填,公衆號的唯一標識
timestamp: , // 必填,生成簽名的時間戳
nonceStr: '', // 必填,生成簽名的隨機串
signature: '',// 必填,簽名
jsApiList: [] // 必填,需要使用的JS接口列表
});
後臺java調用
package com.cciinet.shop.controller.common.wechat;
import com.alibaba.fastjson.JSONObject;
import com.cciinet.shop.util.HttpRequest;
import lombok.extern.slf4j.Slf4j;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.UUID;
/**
* @Author:
* @Date: 2020/6/10
* @ClassName: Sign
* @Description: TODO
**/
@Slf4j
public class Sign {
/**
* jsSdk 獲取微信config
*
* @param url
* @return
*/
public JsSdk sign(String url,String appId, String appsecret) {
String jsapi_ticket = getJsapiTicket(appId,appsecret);
JsSdk jsSdk = new JsSdk();
jsSdk.setAppid(appId);
jsSdk.setUrl(url);
String nonce_str = create_nonce_str();
jsSdk.setNoncestr(nonce_str);
String timestamp = create_timestamp();
jsSdk.setTimestamp(timestamp);
String signature = "";
//注意這裏參數名必須全部小寫,且必須有序
String string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
"&url=" + url;
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
jsSdk.setSignature(signature);
} catch (NoSuchAlgorithmException e) {
jsSdk = null;
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
jsSdk = null;
e.printStackTrace();
}
return jsSdk;
}
/**
* 生成隨機數
*
* @return
*/
private static String create_nonce_str() {
return UUID.randomUUID().toString().substring(0, 20);
}
/**
* 當前日期字符串生成
*
* @return
*/
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
/**
* @param hash
* @return
*/
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
public String getJsapiTicket(String appId, String appsecret) {
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token";
String params = "grant_type=client_credential&appid=" + appId + "&secret=" + appsecret+ "";
String result = HttpRequest.sendGet(requestUrl , params);
String access_token = JSONObject.parseObject(result).getString("access_token");
requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
params = "access_token=" + access_token + "&type=jsapi";
result = HttpRequest.sendGet(requestUrl , params);
String jsapi_ticket = JSONObject.parseObject(result).getString("ticket");
log.info("jsapi_ticket=" + jsapi_ticket);
return jsapi_ticket;
}
public static void main(String[] args) {
Sign sign = new Sign();
String appId = "";
String appSecret = "";
// String jsapiTicket = sign.getJsapiTicket(appId, appSecret);
// System.out.println(jsapiTicket);
String url = "";
JsSdk jsSdk = sign.sign(url, appId, appSecret);
System.out.println(jsSdk.toString());
}
}
其中main方法裏輸入自己公衆號的appid,secret,和分享要調用的url。調用即可拿到返回值。 大坑來了,我的問題是用後代代碼生成的signature和用微信在線調試工具生成的signature是一樣的。
微信在線調試地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
但仍然提示簽名錯誤。奇了怪了。
最後發現是我程序後臺調用生成簽名傳入的url不對。
傳入的url應該是當前要分享的頁面的完整url,網上還有好多說要在url後邊加上個“/”個,這個也不對,不應該加斜槓的。
總結一下: 這個報簽名不對的原因,並不是後臺代碼調用微信接口返回signature和在線微信調試生成的signature對不上。而是實際調用微信接口頁面地址和生成簽名傳入的url對不上導致的。
看下接口說明,後臺調用微信接口的文檔沒找到o(╯□╰)o
這裏明確說明了是發起頁面的完整url.。