|
其中主要获取signature这个参数,官方文档地址 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
1、使用APPID和APPSecret获取access_token;
2、使用access_token获取jsapi_ticket ;
3、用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串;
4、对第三步的字符串进行SHA1加密,得到签名。
注意事项:
1、签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
2、签名用的url必须是调用JS接口页面的完整URL。
3、出于安全考虑,开发者必须在服务器端实现签名的逻辑。
/** * 微信小程序获取accessToken * * @author Mr.Wen * @time 2017年8月28日 */ public class GetAccessTokenUtil { // 网页授权接口 public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET"; public static Map, String> getAccessToken(String appid, String appsecret) { String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret); HttpClient client = null; Map , String> result = new HashMap , String>(); String accessToken = null; try { client = new DefaultHttpClient(); HttpGet httpget = new HttpGet(requestUrl); ResponseHandler responseHandler = new BasicResponseHandler(); String response = client.execute(httpget, responseHandler); JSONObject OpenidJSONO = JSONObject.fromObject(response); accessToken = String.valueOf(OpenidJSONO.get("access_token")); result.put("accessToken", accessToken); } catch (Exception e) { e.printStackTrace(); } finally { client.getConnectionManager().shutdown(); } return result; } }
/** * @author Mr.Wen * @description 获取ticket * @date 2018/3/29 */ public class JsapiTicketUtil { // 网页授权接口 public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; public static Map, String> JsapiTicket(String accessToken) { String requestUrl = GetPageAccessTokenUrl.replace("ACCESS_TOKEN", accessToken); HttpClient client = null; Map , String> result = new HashMap , String>(); try { client = new DefaultHttpClient(); HttpGet httpget = new HttpGet(requestUrl); ResponseHandler responseHandler = new BasicResponseHandler(); String response = client.execute(httpget, responseHandler); JSONObject OpenidJSONO = JSONObject.fromObject(response); String errcode = String.valueOf(OpenidJSONO.get("errcode")); String errmsg = String.valueOf(OpenidJSONO.get("errmsg")); String ticket = String.valueOf(OpenidJSONO.get("ticket")); String expires_in = String.valueOf(OpenidJSONO.get("expires_in")); result.put("errcode", errcode); result.put("errmsg", errmsg); result.put("ticket", ticket); result.put("expires_in", expires_in); } catch (Exception e) { e.printStackTrace(); } finally { client.getConnectionManager().shutdown(); } return result; } }
第三部:用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串
String noncestr = WXUtil.generate();//随机字符串 String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳 //4获取url //5、将参数排序并拼接字符串 String str = "jsapi_ticket="+ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url;
第四部:对第三步的字符串进行SHA1加密,得到签名,并返回结果
String str = "jsapi_ticket="+ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url; //6、将字符串进行sha1加密 String signature = SHA1.SHA1(str); Map,String> map=new HashMap(); map.put("timestamp",timestamp); map.put("accessToken",accessToken); map.put("ticket",ticket); map.put("noncestr",noncestr); map.put("signature",signature);
测试返回的结果为:
此时前端js为:
以上的时间戳、随机数、签名一定要跟main方法中获取到的一致,否则会报invalid signature错误。
另外,这个签名的有效时间为7200秒,也就是2个小时,因此当超过两个小时候,再访问也会报invalid signature错误。
另外还有一个错误:invalid url domain
这个跟生成签名时用的url有关系,官网的说法是:
invalid url domain当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名,如果使用了端口号,则配置的绑定域名也要加上端口号(一个appid可以绑定三个有效域名)
这个url必须是:“公众号设置---功能设置----JS接口安全域名”中绑定的三个域名之一
若是以上的配置没有问题,且dubug也设置为了true,那么再访问的时候,就会出现一个config:ok,这就说明配置成功了。