mitao
2025-05-20 179c4d64313c9b7572778da4aaaf6c6584fe457d
springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/WxMessagePushApi.java
New file
@@ -0,0 +1,156 @@
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;
    /**
     * 微信接口配置信息认证接口<br>
     * 需要正确响应微信发送的Token验证。 加密/校验流程如下:<br>
     * 1. 将token、timestamp、nonce三个参数进行字典序排序<br>
     * 2. 将三个参数字符串拼接成一个字符串进行sha1加密<br>
     * 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;
    }
}