分享

微信开发总结 四

 WindySky 2017-03-14

1.获取token,接入微信服务器

  1. public class Token {  
  2.     //获取到的凭证  
  3.     private String accessToken;  
  4.     //凭证有效时间,单位:秒  
  5.     private int expiresIn;  

  1. public class BaseConstant {  
  2.     /**设置的接入token*/  
  3.     public static final String TOKEN = "lwtoken";  
  4.   
  5.     /**接入凭证接口: GET*/  
  6.     public static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";  
  7.       
  8.     /**GET请求方式*/  
  9.     public static final String TOKEN_URL_GET = "GET";  
  10.     /**POST请求方式*/  
  11.     public static final String TOKEN_URL_POST = "POST";  
  12. }  

处理https请求:

  1. public class LWTrustManager implements X509TrustManager {  
  2.   
  3.     //检查客户端证书  
  4.     public void checkClientTrusted(X509Certificate[] chain, String authType)  
  5.             throws CertificateException {  
  6.     }  
  7.   
  8.     //检查服务器端证书  
  9.     public void checkServerTrusted(X509Certificate[] chain, String authType)  
  10.             throws CertificateException {  
  11.     }  
  12.   
  13.     //返回受信用的x509证书数组  
  14.     public X509Certificate[] getAcceptedIssuers() {  
  15.           
  16.         return null;  
  17.     }  
  18.   
  19. }  


1.验证工具类

  1. public class SignUtil {  
  2.     /** 
  3.      * 校验签名 
  4.      * @author wuyw 
  5.      * 2015-7-29下午8:13:30 
  6.      * @param signature  微信加密签名 
  7.      * @param timestamp  时间戳 
  8.      * @param nonce 随机数 
  9.      * @return 
  10.      */  
  11.     public static boolean checkSignature(String signature, String timestamp, String nonce){  
  12.         String[] params = new String[] {BaseConstant.TOKEN, timestamp, nonce};  
  13.         Arrays.sort(params);  
  14.           
  15.         String content = params[0].concat(params[1]).concat(params[2]);  
  16.           
  17.         String text=null;  
  18.         try {  
  19.             MessageDigest md = MessageDigest.getInstance("SHA-1");  
  20.             byte[] digest = md.digest(content.getBytes());  
  21.             text = byteToStr(digest);  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.         return text != null ?text.equals(signature.toUpperCase()) : false;  
  26.           
  27.     }  
  28.       
  29.     /** 
  30.      * 将字节数组转换为十六进制字符串  
  31.      * @author wuyw 
  32.      * 2015-7-29下午8:19:19 
  33.      * @return 
  34.      */  
  35.     private static String byteToStr(byte[] byteArray) {    
  36.         String strDigest = "";    
  37.         for (int i = 0; i < byteArray.length; i++) {    
  38.             strDigest += byteToHexStr(byteArray[i]);    
  39.         }    
  40.         return strDigest;    
  41.     }    
  42.     /** 
  43.      * 将字节转换为十六进制字符串  
  44.      * @author wuyw 
  45.      * 2015-7-29下午8:23:20 
  46.      * @param mByte 
  47.      * @return 
  48.      */  
  49.     private static String byteToHexStr(byte mByte) {    
  50.         char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };    
  51.         char[] tempArr = new char[2];    
  52.         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];    
  53.         tempArr[1] = Digit[mByte & 0X0F];    
  54.     
  55.         String s = new String(tempArr);    
  56.         return s;    
  57.     }    
  58.       
  59.     public static String urlEncodeUTF8(String source) {  
  60.         String result = source;  
  61.         try {  
  62.             result=URLEncoder.encode(source, "UTF-8");  
  63.         } catch (Exception e) {  
  64.             e.printStackTrace();  
  65.         }  
  66.           
  67.         return result;  
  68.     }  
  69.       
  70. }  

2.处理请求工具类

  1. public class TokenUtil {  
  2.     /** 
  3.      * 发送https的接入请求 
  4.      * @author wuyw 
  5.      * 2015-7-30上午8:53:43 
  6.      * @return 
  7.      */  
  8.     public static JSONObject httpsRequest(String requestUrl, String requestMedthod, String outputStr){  
  9.           
  10.         JSONObject jsonObject = null;  
  11.           
  12.         try {  
  13.             //创建sslContext对象,并使用指定的信任管理器初始化  
  14.             TrustManager[] tm = {new LWTrustManager()};  
  15.             //基于sunJVM, SunJSSE  
  16.             SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");  
  17.             sslContext.init(null, tm, new SecureRandom());  
  18.             //从sslContext中获取factory对象  
  19.             SSLSocketFactory ssf = sslContext.getSocketFactory();  
  20.             URL url = new URL(requestUrl);  
  21.             HttpsURLConnection connection = (HttpsURLConnection) url  
  22.                     .openConnection();  
  23.             connection.setSSLSocketFactory(ssf);  
  24.             connection.setDoOutput(true);  
  25.             connection.setDoInput(true);  
  26.             connection.setUseCaches(false);  
  27.             //设置请求的方式(get/post)  
  28.             connection.setRequestMethod(requestMedthod);  
  29.             //当outputStr不为空时输出数据  
  30.             if (null != outputStr) {  
  31.                 OutputStream outputStream = connection.getOutputStream();  
  32.                 outputStream.write(outputStr.getBytes("UTF-8"));  
  33.                 outputStream.close();  
  34.             }  
  35.             InputStream inputStream = connection.getInputStream();  
  36.             BufferedReader bufferedReader = new BufferedReader(  
  37.                     new InputStreamReader(inputStream, "UTF-8"));  
  38.             String str = null;  
  39.             StringBuffer buffer = new StringBuffer();  
  40.             while ((str = bufferedReader.readLine()) != null) {  
  41.                 buffer.append(str);  
  42.             }  
  43.               
  44.             bufferedReader.close();  
  45.             connection.disconnect();  
  46.             jsonObject = JSONObject.fromObject(buffer.toString());  
  47.               
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.           
  52.         return jsonObject;  
  53.     }  
  54.       
  55.     public static Token getToken(String appId, String appsecret){  
  56.         Token token = null;  
  57.         String requestUrl = BaseConstant.TOKEN_URL.replace("APPID", appId).replace("APPSECRET", appsecret);  
  58.           
  59.         //获取Get请求的接入凭证  
  60.         JSONObject jsonObject = httpsRequest(requestUrl, BaseConstant.TOKEN_URL_GET, null);  
  61.         if (null != jsonObject) {  
  62.             token = new Token();  
  63.             token.setAccessToken(jsonObject.getString("access_token"));  
  64.             token.setExpiresIn(jsonObject.getInt("expires_in"));  
  65.         }  
  66.           
  67.         return token;  
  68.     }  
  69. }  

核心控制器

  1. @Controller  
  2. @RequestMapping("/wechat/core")  
  3. public class CoreController extends SpringController{  
  4.       
  5.     Logger logger = LoggerFactory.getLogger(CoreController.class);  
  6.       
  7.     @Autowired  
  8.     private CoreService coreService;  
  9.       
  10.     /** 
  11.      * 微信get请求,微信token接入验证 
  12.      * @author wuyw 
  13.      * 2015-7-29下午8:50:24 
  14.      */  
  15.     @RequestMapping(value = "/getToken", method = RequestMethod.GET)  
  16.     @ResponseBody  
  17.     public void getToken(){  
  18.         String signature = getRequest().getParameter("signature");  
  19.         logger.debug(signature);  
  20.           
  21.         String timestamp = getRequest().getParameter("timestamp");  
  22.         String nonce = getRequest().getParameter("nonce");  
  23.         String echostr = getRequest().getParameter("echostr");  
  24.           
  25.         if(SignUtil.checkSignature(signature, timestamp, nonce)){  
  26.             print(echostr);  
  27.         }  
  28.     }  
  29.       
  30.     @RequestMapping(value = "/getToken", method = RequestMethod.POST)  
  31.     @ResponseBody  
  32.     public void getTokenPost(){  
  33.           
  34.         String signature = getRequest().getParameter("signature");  
  35.         String timestamp = getRequest().getParameter("timestamp");  
  36.         String nonce = getRequest().getParameter("nonce");  
  37.           
  38.         if(SignUtil.checkSignature(signature, timestamp, nonce)){  
  39.              String respXml = coreService.processRequest(getRequest());  
  40.              print(respXml);  
  41.         }  
  42.     }  
  43. }  

处理请求的service

  1. public class CoreService {  
  2.     /** 
  3.      * 处理用户发送的请求 
  4.      * @author wuyw 
  5.      * 2015-7-29下午8:53:02 
  6.      * @return 
  7.      */  
  8.     public String processRequest(HttpServletRequest request){  
  9.         String respContent = "";  
  10.           
  11.         Map<String, String> requestMap = MessageUtil.parseXml(request);         
  12.          // 发送方账号(open_id)    
  13.         String fromUserName = requestMap.get("FromUserName");    
  14.         // 公众账号    
  15.         String toUserName = requestMap.get("ToUserName");    
  16.         // 消息类型    
  17.         String msgType = requestMap.get("MsgType");   
  18.           
  19.         TextResMsg resMsg = new TextResMsg();  
  20.         resMsg.setFromUserName(toUserName);  
  21.         resMsg.setToUserName(fromUserName);  
  22.         resMsg.setCreateTime(new Date().getTime());  
  23.         resMsg.setMsgType(MessageConstant.RES_MESSAGE_TYPE_TEXT);  
  24.           
  25.         if(msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_TEXT)) {  
  26.             respContent = "文本请求";  
  27.             //TODO  
  28.         }else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_IMAGE)) {  
  29.             respContent = "图片请求";  
  30.             //TODO  
  31.         }else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_VOICE)) {  
  32.             respContent = "语音请求";  
  33.             //TODO  
  34.         }else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_VIDEO)) {  
  35.             respContent = "视频请求";  
  36.             //TODO  
  37.         }else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_SHORTVIDEO)) {  
  38.             respContent = "小视频请求";  
  39.             //TODO  
  40.         }else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_LOCATION)) {  
  41.             respContent = "地理请求";  
  42.             //TODO  
  43.         }else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_LINK)) {  
  44.             respContent = "链接请求";  
  45.             //TODO  
  46.         }else if (msgType.equals(MessageConstant.EVENT_TYPE_SUBSCRIBE)) {  
  47.             respContent = "关注事件";  
  48.             //TODO  
  49.         }else if (msgType.equals(MessageConstant.EVENT_TYPE_UNSUBSCRIBE)) {  
  50.             respContent = "取消关注";  
  51.             //TODO  
  52.         }else if (msgType.equals(MessageConstant.EVENT_TYPE_SCAN)) {  
  53.             respContent = "扫描事件";  
  54.             //TODO  
  55.         }else if (msgType.equals(MessageConstant.EVENT_TYPE_LOCATION)) {  
  56.             respContent = "地理位置事件";  
  57.             //TODO  
  58.         }else if (msgType.equals(MessageConstant.EVENT_TYPE_CLICK)) {  
  59.             respContent = "扫描事件";  
  60.             //TODO  
  61.             //TODO  
  62.         }  
  63.    
  64.         resMsg.setContent(respContent);  
  65.         return MessageUtil.messageToXml(resMsg);  
  66.           
  67.     }  
  68. }  

验证浏览器

  1. public class BrowserInterceptor implements HandlerInterceptor {  
  2.   
  3.     @Override  
  4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response,  
  5.             Object obj) throws Exception {  
  6.           
  7.         String userAgent = request.getHeader("User-Agent");  
  8.         //微信内置浏览器  
  9.         if (userAgent.contains("MicroMessenger")) {  
  10.             return true;  
  11.         }  
  12.         return false;  
  13.     }  
  14.   
  15.     @Override  
  16.     public void postHandle(HttpServletRequest request, HttpServletResponse response,  
  17.             Object obj, ModelAndView view) throws Exception {  
  18.     }  
  19.       
  20.     @Override  
  21.     public void afterCompletion(HttpServletRequest request,  
  22.             HttpServletResponse response, Object obj, Exception exception)  
  23.             throws Exception {  
  24.     }  
  25.   
  26. }  



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多