package com.bsd.say.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.api.R; import com.bsd.say.beans.AjaxResult; import com.bsd.say.entities.Record; import com.bsd.say.mapper.RecordMapper; import com.bsd.say.service.WxOpenServiceDemo; import com.bsd.say.service.impl.WeixinService; import com.bsd.say.util.AESWithJCEUtils; import com.bsd.say.util.HttpRequestUtils; import com.bsd.say.util.LogUtils; import com.bsd.say.util.wechat.AesException; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; import org.apache.commons.lang3.StringUtils; import org.dom4j.DocumentException; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; @RestController @RequestMapping("wechat") public class WechatController { @Value("${wechat.aesKey}") private String aesKey; @Value("${wechat.componentToken}") private String componentToken; @Value("${wechat.appId}") private String appId; @Value("${wechat.componentAppId}") private String componentAppId; @Resource private RedisTemplate redisTemplate; @Autowired private WxOpenServiceDemo wxOpenService; Logger logger = LogUtils.getBussinessLogger(); @Autowired private WeixinService weixinService; @Resource private RecordMapper recordMapper; /** * 接收component_verify_ticket 或 authorized事件 */ @RequestMapping("/getComponentVerifyTicket") public Object receiveTicket(@RequestBody(required = false) String requestBody, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce, @RequestParam("signature") String signature, @RequestParam(name = "encrypt_type", required = false) String encType, @RequestParam(name = "msg_signature", required = false) String msgSignature) { this.logger.info( "\n接收微信请求:[signature=[{}], encType=[{}], msgSignature=[{}]," + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", signature, encType, msgSignature, timestamp, nonce, requestBody); if (!StringUtils.equalsIgnoreCase("aes", encType) || !wxOpenService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) { throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); } // aes加密的消息 WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(requestBody, wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); this.logger.debug("\n消息解密后内容为:\n{} ", inMessage.toString()); try { String out = wxOpenService.getWxOpenComponentService().route(inMessage); this.logger.debug("\n组装回复信息:{}", out); } catch (WxErrorException e) { this.logger.error("receive_ticket", e); } return "success"; } /** * 工具类:回复微信服务器"文本消息" * * @param response * @param returnvaleue */ public void output(HttpServletResponse response, String returnvaleue) { try { PrintWriter pw = response.getWriter(); pw.write(returnvaleue); // logger.info("****************returnvaleue***************="+returnvaleue); pw.flush(); } catch (IOException e) { e.printStackTrace(); } } @RequestMapping(value = "/{appid}/callback", method = {RequestMethod.GET, RequestMethod.POST}) public void callBackEvent(HttpServletRequest request, HttpServletResponse response) throws IOException, DocumentException, AesException { // String msgSignature = request.getParameter("msg_signature"); // //LogUtil.info("第三方平台全网发布-------------{appid}/callback-----------验证开始。。。。msg_signature="+msgSignature); // if (!StringUtils.isNotBlank(msgSignature)) // return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息 // // StringBuilder sb = new StringBuilder(); // BufferedReader in = request.getReader(); // String line; // while ((line = in.readLine()) != null) { // sb.append(line); // } // in.close(); // // String xml = sb.toString(); // Document doc = DocumentHelper.parseText(xml); // Element rootElt = doc.getRootElement(); // String toUserName = rootElt.elementText("ToUserName"); // // //微信全网测试账号 //// if (StringUtils.equalsIgnoreCase(toUserName, APPID)) { //// LogUtil.info("全网发布接入检测消息反馈开始---------------APPID="+ APPID +"------------------------toUserName="+toUserName); // checkWeixinAllNetworkCheck(request,response,xml); } @RequestMapping("test") public void test() { // Object o = redisTemplate.opsForValue().getOperations(); weixinService.refreshComponentAccessToken(); } @RequestMapping("autologin") public AjaxResult autoLogin(@RequestParam String openId) throws IOException { logger.info("请求openid:"+ openId); String result1 = HttpRequestUtils.sendGet("https://api.weq.me/wx/token.php?id=15969759463491&key=1234567890123456"); JSONObject result2 = JSONObject.parseObject(result1); String result3 = result2.getString("access_token"); String pubkey = "1234567890123456"; String iv = "WJi7HTZQoh8eHjup"; String decode = AESWithJCEUtils.aesDecode(result3, pubkey, iv); String resutl = HttpRequestUtils.sendGet("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + decode + "&openid=" + openId + "&lang=zh_CN"); JSONObject jsonObject = JSONObject.parseObject(resutl); Integer subscribe = jsonObject.getInteger("subscribe"); logger.info("subscribe:"+ subscribe); Record recordByOpenId = recordMapper.selectOne(Wrappers.lambdaQuery().eq(Record::getOpenId,openId) .and(queryWrapper1 -> queryWrapper1.eq(Record::getState,1))); if (subscribe == 0){ //未关注公众号 if (recordByOpenId == null){ logger.info("新粉丝第一次进入"); Record record = new Record(); record.setOpenId(openId); record.setFan("新粉丝"); record.setCreateDateTime(new Date()); recordMapper.insert(record); }else { logger.info("游客访问过,但未关注"); } }else { //关注过公众号 if (recordByOpenId == null){ logger.info("老粉丝第一次进入"); Record record = new Record(); record.setOpenId(openId); record.setFan("老粉丝"); record.setCreateDateTime(new Date()); recordMapper.insert(record); }else { logger.info("老粉丝访问过,已关注"); } } AjaxResult ajaxResult = new AjaxResult(); ajaxResult.setData(jsonObject); return ajaxResult; } }