java微信开发-token验证
2016-03-14 15:01
387 查看
1、配置springMVC环境。
这里就不贴代码了。不知道的朋友,可以去看我的博客。2、验证token
说明:在微信公众号测试平台中填写了正确的url、token后,微信会向填写的url地址发送一条get请求。该请求带有signature、timestamp、nonce、echostr参数。服务端返回echostr参数,则表示token验证成功。@Controller public class HelloWorldController { /** * 微信消息接收和token验证 * @param model * @param request * @param response * @throws IOException */ @RequestMapping("/hello") public void hello(Model model, HttpServletRequest request,HttpServletResponse response) throws IOException { boolean isGet = request.getMethod().toLowerCase().equals("get"); PrintWriter print; if (isGet) { // 微信加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) { try { print = response.getWriter(); print.write(echostr); print.flush(); } catch (IOException e) { e.printStackTrace(); } } }
请求校验工具类
public class CheckoutUtil { // 与接口配置信息中的Token要一致 private static String token = "Javen"; /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 // Arrays.sort(arr); sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将字节转换为十六进制字符串 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; } public static void sort(String a[]) { for (int i = 0; i < a.length - 1; i++) { for (int j = i + 1; j < a.length; j++) { if (a[j].compareTo(a[i]) < 0) { String temp = a[i]; a[i] = a[j]; a[j] = temp; } } } } }
3、在微信公众号测试平台中,填写url、token
注:
1、url为项目路径且必须可以通过外网80端口访问
2、token必须和项目中token一致
相关文章推荐
- [Android]实现类似微信的延迟加载的Fragment——LazyFragment
- 支付介绍
- 45、微信-从通讯录添加好友
- 43、微信-好友详情页面FriendMsgActivity
- 友盟分享——微信、腾讯微博、新浪微博分享失败原因分析
- 42、微信-添加新朋友列表适配器
- 41、微信-添加新朋友NewFriendsListActivity
- 40、微信-搜索好友及公众号页面SearchActivity
- atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结
- js微信中判断浏览器
- 微信自定义菜单总结
- 仿微信Tab颜色渐变自定义View
- 微信红包生成算法
- 夺命雷公狗---微信开发61----在线点播电影网2之电影网之个人中心
- Java微信公众平台开发(8) 多媒体消息回复
- Java微信公众平台开发(10) 微信自定义菜单的创建实现
- Java微信公众平台开发(9) 关键字回复以及客服接口实现
- 微信公众号开发,代码自定义菜单
- 微信开放JS-SDK,助力网页开发
- 微信公众号开发——网页授权实现简化用户绑定