前端部分:html页面引入
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script> /*微信配置*/ $.ajax({ url:'upload', type:'post', dataType:'json', data : {"path":window.location.href}, async:false, success:function(data){ var appId = data.data[0].appId; var timestamp = data.data[0].timestamp; var nonceStr = data.data[0].nonceStr; var signature = data.data[0].signature; alert(JSON.stringify(data.data[0])); wx.config({ debug: true,//调试模式 当为tru时,开启调试模式 appId: appId, timestamp: timestamp,//签名时间戳 nonceStr: nonceStr, //生成签名的随机串 signature: signature,//签名 jsApiList: ['chooseImage','uploadImage','getLocalImgData'], success: function(data){ alert(222); alert(JSON.stringify(data)); }, fail: function(data){ alert(111); alert(JSON.stringify(data)); } }); }, error:function(){alert("error"); } })
.......微信签名验证
</script>
后台java代码
@RequestMapping(value = "/upload",method = RequestMethod.POST) @ResponseBody public Object upload(HttpServletRequest request, HttpServletResponse response){ String url = request.getParameter("path").toString(); WXjsTicket wXjsTicket =coreService.getJsTicket();//微信获取的ticket; Map<String, Object> map = sign(wXjsTicket.getJsTicket(),url); return new Result(map); }
//对应前端签名验证逻辑 //url是引用js-SDK的html页面路径,路径有参数必须传(最好是前端传过来,如:url=window.location.href) public static Map<String, Object> sign(String jsapi_ticket,String url) { Map<String, Object> ret = new HashMap<String, Object>(); String nonce_str = create_nonce_str(); String timestamp = create_timestamp(); String string1; String signature = ""; //注意这里参数名必须全部小写,且必须有序 string1 = "jsapi_ticket=" + jsapi_ticket+ "&noncestr=" + nonce_str + "×tamp=" + timestamp + "&url=" + url; System.out.println("Sign string1:"+string1); try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getBytes("UTF-8")); signature = byteToHex(crypt.digest()); System.out.println("Sign signature:"+signature); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } ret.put("appId",APP_ID); // ret.put("jsapi_ticket", jsapi_ticket); ret.put("nonceStr", nonce_str); ret.put("timestamp", Long.valueOf(timestamp)); ret.put("signature", signature); return ret; }
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; } private static String create_nonce_str() { return UUID.randomUUID().toString(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); }
注:除了ticket和accessToken方法没写,其他都可CV