获取微信JS-SDK神坑

获取token,和权限token不同,访问下边的接口获取token(传入appid、appsecret)

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s

获取token后访问下面接口,获取ticket(传入access_token)

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi

成功返回

返回成功格式
{"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd841ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200}

获取ticket

添加时间戳(秒)、随机数

String noncestr = StringUtil.getRandStr(10);//随机数
String timestamp = String.valueOf(System.currentTimeMillis()/1000);

根据前段传入的url转换,前段传入时会处理格式(encodeURIComponent方法处理)

 url = new String(url.getBytes("ISO8859-1"), "UTF-8");

将数据整合:

params.put("jsapi_ticket", ticket);
params.put("noncestr", noncestr);
params.put("timestamp", timestamp);
params.put("url", url);

根据ASSIC排序sha1加密

排序方法

public static String createLinkString(Map<String, String> params) {

		List<String> keys = new ArrayList<String>(params.keySet());
		Collections.sort(keys);

		String prestr = "";

		for (int i = 0; i < keys.size(); i++) {
			String key = keys.get(i);
			String value = params.get(key);
			
			if("sign".equals(key)){
				continue;
			}
			
			if ("".equals(prestr)) {// 拼接时,不包括最后一个&字符
				prestr = prestr + key + "=" + value;
			} else {
				prestr = prestr +"&" +key + "=" + value ;
			}
		}
		return prestr;
	}

加密方法

 public static String encode(String str) {  
        if (str == null) {  
            return null;  
        }  
        try {  
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");  
            messageDigest.update(str.getBytes());  
            return getFormattedText(messageDigest.digest());  
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
    }  

经过排序加密后得到signature

组装数据返回前段供调起js使用

dateMap.put("appId", mpAccount.getAppid());
dateMap.put("timestamp", timestamp);
dateMap.put("nonceStr", noncestr);
dateMap.put("signature", signature);

至此调用完成,可以在https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign微信提供的测试地址测试签名是否成功(传入的参数是之前通过JsApiTicket获取的ticket、随机数、时间戳。url)


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