以上是整个流程
所需配置包括:
1、在微信公共号设置页面填写自己服务器的地址,具体到接收请求的地址。
2、在接受请求的地址进行验证。
具体实现:(Tomcat 作为服务器,jsp技术实现)
微信会要求对填写的地址进行验证,很简单,他会发送一个get请求到填写的地址,获取他,并按照官方说明进行返回,这一步骤也是为了自己的服务器安全,可以区别改请求是否来自微信官方服务器。
1 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, 2 IOException { 3 //获取参数 4 String signature = req.getParameter("signature"); 5 //自己生成的signature 6 String localSignature = ""; 7 8 //生成signature 9 localSignature = WeiXinUtils.createLocalSignature(req); 10 11 //配置输出 12 PrintStream out = new PrintStream(resp.getOutputStream()); 13 14 //如果自己算出的signature与微信提供的一样,证明这是由微信发送过来的消息 15 if(signature.equals(localSignature)){ 16 String echostr = req.getParameter("echostr"); 17 //把从微信服务器获取的echostr返回给微信服务器 18 out.print(echostr); 19 }else{ 20 //这里是另外加上去的,与验证无关,只是自己用来提示验证出错 21 out.print("验证出错"); 22 } 23 }
一下是本地生成signature方法,大概步骤是先对获取的微信数据进行字典排序,然后尽心sha-1算法加密得到的结果就是本地signature
1 public static String createLocalSignature(HttpServletRequest req){ 2 String timestamp = req.getParameter("timestamp"); 3 String nonce = req.getParameter("nonce"); 4 // create local key 5 String localsignature = ""; 6 // 进行字典排序 7 String[] so = new String[] { token, timestamp, nonce }; 8 Arrays.sort(so); 9 10 // 把字符串进行链接 11 String value = ""; 12 for (String str : so) { 13 value = value + str; 14 } 15 16 try { 17 //进行sha-1加密 18 MessageDigest md = MessageDigest.getInstance("SHA-1"); 19 byte[] by = md.digest(value.getBytes()); 20 localsignature = StringUtil.byteToString(by); //得到结果字符 21 } catch (NoSuchAlgorithmException e) { 22 e.printStackTrace(); 23 } 24 25 return localsignature; 26 }
附上byteToString(byte[] b)方法
1 public static String byteToString(byte[] b) 2 { 3 String hs = ""; 4 String stmp = ""; 5 6 for (int n = 0; n < b.length; n++) { 7 stmp = (Integer.toHexString(b[n] & 0Xff)); 8 if (stmp.length() == 1) { 9 hs = hs + "0" + stmp; 10 } else { 11 hs = hs + stmp; 12 } 13 } 14 return hs.toLowerCase(); 15 }
以上就是微信验证的全部内容
时间: 2024-11-09 15:59:15