package com.panzhihua.applets.api; import java.io.PrintWriter; import java.security.MessageDigest; import java.util.Arrays; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.panzhihua.common.utlis.StringUtils; import com.panzhihua.common.utlis.WxUtil; import com.panzhihua.common.utlis.WxXCXTempSend; import lombok.extern.slf4j.Slf4j; @Slf4j @RestController @RequestMapping("/wx/push/") public class WxMessagePushApi { private String token = "01A9CB2234D7CBD0AC61B75EB1263805"; private String url = "www.taobao.com";// 图文跳转地址 private String thumbUrl = "https://www.psciio.com//idcard/f986ba3ae7a241d9bce5cb568adec7da.jpg";// 图片地址 @Resource private WxXCXTempSend wxXCXTempSend; /** * 微信接口配置信息认证接口
* 需要正确响应微信发送的Token验证。 加密/校验流程如下:
* 1. 将token、timestamp、nonce三个参数进行字典序排序
* 2. 将三个参数字符串拼接成一个字符串进行sha1加密
* 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 */ @RequestMapping("/cgi") public void cgi(HttpServletRequest request, HttpServletResponse response) { boolean isGet = request.getMethod().toLowerCase().equals("get"); // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 try { if (isGet) { String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); log.info("signature = " + signature + " , timestamp = " + timestamp + " , nonce = " + nonce + " , echostr = " + echostr); String[] strArray = new String[] {token, timestamp, nonce}; Arrays.sort(strArray); StringBuilder sb = new StringBuilder(); for (String str : strArray) { sb.append(str); } // SHA1签名生成 MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(sb.toString().getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex = ""; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } if (hexstr.toString().equals(signature)) { response.getOutputStream().write(echostr.getBytes()); } } else { // 进入POST聊天处理 // 将请求、响应的编码均设置为UTF-8(防止中文乱码) request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 接收消息并返回消息 String result = acceptMessage(request, response); // 响应消息 PrintWriter out = response.getWriter(); out.print(result); out.close(); } } catch (Exception ex) { log.error("微信帐号接口配置失败!", ex); ex.printStackTrace(); } } /** * 接受到微信接口数据 * * @param request * @param response * @return */ private String acceptMessage(HttpServletRequest request, HttpServletResponse response) { String respMessage = ""; String inputLine = ""; String notityXml = ""; try { // 接收数据 while ((inputLine = request.getReader().readLine()) != null) { notityXml += inputLine; } // xml请求解析 JSONObject requestJson = JSON.parseObject(notityXml); log.info(">>>>>>>>>>>>>" + requestJson.toString()); // 发送方帐号(open_id) String fromUserName = requestJson.get("FromUserName").toString(); // 公众帐号 String toUserName = requestJson.get("ToUserName").toString(); // 消息类型 String msgType = requestJson.get("MsgType").toString(); // String Event = requestJson.get("Event").toString(); //SCAN 为扫描信息 VIEW 公众号底部点击事件 log.info("fromUserName = " + fromUserName + " , ToUserName = " + toUserName + " , msgType = " + msgType); String access_token = wxXCXTempSend.getAccessToken();// 获取access_token // 公众号关注事件消息 if (msgType.equals("event")) { // log.info("公众号被关注事件.........."); } else if (msgType.equals("text")) { // if(StringUtils.isNotEmpty(access_token)){ // String mediaId = wxXCXTempSend.getMediaId(access_token);//获取mediaId // WxUtil.sendKfImagesMessage(fromUserName,access_token,mediaId); // } // log.info("公众号接受文字.........."); } else if (msgType.equals("image")) { // log.info("公众号接受图片.........."); } else if (msgType.equals("miniprogrampage")) { if (StringUtils.isNotEmpty(access_token)) { String mediaId = wxXCXTempSend.getMediaId(access_token);// 获取mediaId WxUtil.sendKfImagesMessage(fromUserName, access_token, mediaId); } } } catch (Exception e) { e.printStackTrace(); } return respMessage; } }