Java微信开发之接入验证

xiaoxiao2021-02-27  202

最近在做微信开发,最开始尝试了很多次都不成功。昨天尝试成功了,还没有开始进一步开发,想把昨天尝试成功的过程记录一下。我是查了很久的资料也尝试过很多方法,现在我把我遇到的问题和解决方法记录一下。我是部署在自己电脑上的tomcat服务器上的,使用的是Myeclipse编写的代码。

大致思路是首先你的服务器要可以被外网访问。可以选择公网映射的方法(这个我不太懂),值得注意的是微信开发的接口必须是80端口,如果你使用的是电信网络的话端口映射80端口也是打不通的,其他的网络应该可以。我使用的是联通网络,可以被其他网络访问。接下来就是微信接口验证了。下面讲一下我尝试成功的过程。

1、我新建了一个dynamic web project,选择了web  module  version 选择了3.0,选择生成web.xml文件。构建的目录如图所示:

ValidationServlet类是接收微信服务器转发过来的请求,ValidationTools是验证工具类。

package com.***.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.***.uil.ValidationTools; /** * 接收来自微信服务器转发过来的请求 * 部署在我们自己的服务器上面 * @author *** *@version 1.0 */ public class ValidationServlet extends HttpServlet{ /** * 验证请求 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String signature = req.getParameter("signature"); String timestamp = req.getParameter("timestamp"); String nonce = req.getParameter("nonce"); String echostr = req.getParameter("echostr"); System.out.println("微信加密签名"+signature); System.out.println("时间戳"+timestamp); System.out.println("随机数"+nonce); System.out.println("随机字符串"+echostr); //获得响应流 PrintWriter out = resp.getWriter(); if(ValidationTools.checkSignature(signature, timestamp, nonce)) { //确认了此次GET请求来自微信服务器,并且原样返回echostr参数内容 out.print(echostr); } //关闭输出流 out.close(); out=null; } }

接下来是验证工具类代码:

package com***.uil; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 验证工具类 * @author *** * @version ** * */ public class ValidationTools { private static final String TOKEN="***";//必须与微信后台的页面配置参数保持一致 /** * 微信请求验证 * @param signature 微信签名请求 * @param timestamp 时间戳(日期的整形表示方式) * @param nonce 随机数 * @return */ public static boolean checkSignature(String signature,String timestamp,String nonce) { //1.将token,timestamp,nonce三个字符装入数组 String[] arr=new String[]{TOKEN,timestamp,nonce}; //实现按字典顺序排序 Arrays.sort(arr); //2.将排序后的数组拼接成一个字符串 StringBuilder builder=new StringBuilder(); for(int i=0;i<arr.length;i++) { builder.append(arr[i]); } System.out.println("拼接后的字符串:"+builder); MessageDigest md=null; String result=null; try { //3.对拼接后的字符串进行sha1加密 md=md.getInstance("SHA-1"); byte[] digest=md.digest(builder.toString().getBytes()); //将字节数组转成密文字符串 result = byteToString(digest); System.out.println("加密后的字符串"+result); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } //4.将加密后的字符串与微信服务器传过来的签名进行对比 return result !=null?(result.equals(signature.toUpperCase())):false; } /** * 实现将字节数组转换成为十六进制字符串 * @param str * @return */ private static String byteToString(byte[] str) { String strDigest=""; for(int i=0;i<str.length;i++) { strDigest +=byteToHexStr(str[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[] temp = new char[2]; temp[0] = Digit[(mByte>>>4)&0X0F]; temp[1] = Digit[mByte&0X0F]; String s=new String(temp);//构建一个字符串 return s; } }

这两个类写好以后就需要去web.xml里面更改信息了,我的web.xml文件代码:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 配置微信请求验证servlet --> <servlet> <servlet-name>ValidationServlet</servlet-name> <servlet-class>com.***.servlet.ValidationServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ValidationServlet</servlet-name> <url-pattern>/login.action</url-pattern> </servlet-mapping> </web-app>

接下来启动Tomcat,我使用的是tomcat7.0,可以现在本地测试一下:(记得将你的Tomcat端口改成80,http的端口默认80)接下来在浏览器里面输入localhost/你的项目名/web.xml文件里面的url地址。出现如下界面,证明代码没有问题。出现空指针异常是因为没有请求过来。

这时候如果你的网络可以被外界访问的话就可以接入微信验证了。在微信验证的时候输入http://Ip/projectName/login.action(localhost换成你的公网IP)

转载请注明原文地址: https://www.6miu.com/read-14698.html

最新回复(0)