自定义服务器对接微信公众号

妖精的绣舞 提交于 2019-11-29 19:32:00

package com.yeahc.zyp.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yeahc.zyp.entity.YeahcUserInfoEntity;
import com.yeahc.zyp.huaqi.ParseXmlUtil;
import com.yeahc.zyp.huaqi.TemplateData;
import com.yeahc.zyp.huaqi.WechatTemplate;
import com.yeahc.zyp.repository.UserInfoRepository;
import com.yeahc.zyp.utils.HttpRequest;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/weixin")
public class WXController {

    protected  Logger logger = LoggerFactory.getLogger(getClass());
    /**秘钥**/
    private static String appId = "wx595852963****";
    private static String appSecret = "59aee12d9685632901a997c402e2******";
    
    private static   String erweicode="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
    private static   String pushMsgMode= "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESSTOKEN";
    private static   String GET_CODE="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
    private static   String token="WXTOKEN";
    private static   String ticket1="gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
    private static   String OPENID_TOKEN="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    private static   String USERINFO="https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";

    private static String  AESKEY="pXjIynI7DBTfMJJof5XltNO2tLscqjFR3KhToNzubee";


    @Autowired
    private UserInfoRepository userInfoRepository;


    /**
     * 接收通知接口
     * 已通过
     * */
    @RequestMapping("/test")
    public void gettoken(HttpServletRequest request, HttpServletResponse response){
        System.out.println("来自微信的请求");
        String signature=request.getParameter("signature");
        String timestamp=request.getParameter("timestamp");
        String nonce=request.getParameter("nonce");
        String echostr=request.getParameter("echostr");

        //首次校验
        if(echostr!=null){
        try {
            PrintWriter printWriter=response.getWriter();
            if(checkSignature(signature,timestamp,nonce)){
                printWriter.print(echostr);
                printWriter.close();
                return;
            }else {
                logger.info("token签名校验失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        }

        //接收服务器的消息
        logger.info("1.收到微信服务器消息");
        InputStream inputStream= null;
        try {
            inputStream = request.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Map<String,String> wxdata= ParseXmlUtil.xml2Json(inputStream);
        String msg=null;
        if(wxdata.get("MsgType")!=null){
            if("event".equals(wxdata.get("MsgType"))){
                //如果有事件,判断是否有场景的区别
                logger.info("2.1解析消息内容为:事件推送");
                if( "subscribe".equals(wxdata.get("Event"))){
                    //公众号的原生二维码进来的
                    if(null==wxdata.get("Ticket")){
                        msg="用户,你好";
                        ParseXmlUtil. replyTextMsg(response,msg,wxdata);
                    }else if(ticket1.equals(wxdata.get("Ticket"))){
                        //自定义的二维码扫码进来的
                        msg="测试用户,你好";
                        ParseXmlUtil. replyTextMsg(response,msg,wxdata);
                    }

                }else if("unsubscribe".equals(wxdata.get("Event"))){
                    logger.info("用户取消了关注");
                }else if("SCAN".equals(wxdata.get("Event"))){
                    //原生的二维码不会有浏览事件
                    if(ticket1.equals(wxdata.get("Ticket"))){
                        //自定义的二维码扫码进来的
                        msg="测试用户,你好,欢迎来看看";
                        ParseXmlUtil. replyTextMsg(response,msg,wxdata);
                    }

                }
            }else if("text".equals(wxdata.get("MsgType"))){
                logger.info("来自用户的消息:"+wxdata.get("context"));
                msg="你说什么,我看不见";
                ParseXmlUtil. replyTextMsg(response,msg,wxdata);
            }
            //判断图片视屏等功能
        }


    }

    /**
     * 网页授权获取code
     *
     *
     * **/
    @RequestMapping("/redirect")
    public void  retCode( HttpServletResponse response) throws IOException {
        String url="https://www.baidu.com";
        try {
            url= URLEncoder.encode(url,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        GET_CODE=GET_CODE.replace("APPID",appId)
                .replace("REDIRECT_URI",url)
                .replace("SCOPE","snsapi_userinfo");
        System.out.println(GET_CODE);
        response.sendRedirect(GET_CODE);
    }

    /**
     * 获取授权用户的信息
     *
     * **/
    @RequestMapping("/cellBackCode")
    public String cellBackCode(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
        String code=request.getParameter("code");
        logger.info("code:========================="+code);
        String state=request.getParameter("state");
        if(code!=null){
            OPENID_TOKEN=OPENID_TOKEN.replace("APPID",appId).replace("SECRET",appSecret).replace("CODE",code);
            String requestResult = HttpRequest.sendGet(OPENID_TOKEN);
            System.out.println(requestResult);
            JSONObject json = JSON.parseObject(requestResult);
            if(null==json||json.getInteger("errcode")!=null){
                logger.info("网页授权获取用户信息失败json:"+json);
                return "获取授权信息失败!";
            }else {
                String openid = json.getString("openid");
                String accessToken = json.getString("access_token");
                USERINFO=USERINFO.replace("ACCESS_TOKEN",accessToken).replace("OPENID",openid);
                String userInfoStr = HttpRequest.sendGet(USERINFO);
                System.out.println(userInfoStr);
                JSONObject userJson = JSON.parseObject(userInfoStr);
                WXUser user =new WXUser();
                user .setOpenid(userJson.getString("openid"));
                user .setNickname(userJson.getString("nickname"));
                user .setSex(userJson.getString("sex"));
                user .setProvince(userJson.getString("province"));
                user .setCity(userJson.getString("city"));
                user .setCountry(userJson.getString("country"));
                user .setHeadimgurl(userJson.getString("headimgurl"));
                user .setPrivilege(userJson.getJSONArray("privilege").toString());
                user .setUnionid(userJson.getString("unionid"));
                user .save(yeahcUserInfoEntity);
                System.out.println(yeahcUserInfoEntity.toString());
            }
        }
        return code;

    }


    /**
     * 配置推送消息接口
     * 
     *
     * */
    @RequestMapping("/pushmsg")
    public void pushMsg(){
        //调取接口获取accesstoken
        String resultUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId +"&secret="+ appSecret;
        String requestResult = HttpRequest.sendGet(resultUrl);
        JSONObject json = JSON.parseObject(requestResult);
        String session_key=json.getString("access_token");
        //todo :这里要保存session到数据库 每天只有2000次的获取数量

        //推送消息模板
        pushMsgMode=pushMsgMode.replace("ACCESSTOKEN",session_key);

        WechatTemplate wechatTemplate = new WechatTemplate();
        wechatTemplate.setTemplate_id("fK2R84GM2BN9JM2UNXzSycB_H09c0fkUv7sJyZ1u2k0");
        wechatTemplate.setTouser("ompXX1XwOMB5AIn-IxO65cS-1Xdg");
        wechatTemplate.setUrl("http://citi.yeahc.com/yh?id=1");
        Map<String,TemplateData> mapdata = new HashMap<>();
        // 封装模板数据
        TemplateData first = new TemplateData();
        first.setValue("您好,您已注册成为XXX平台用户。");
        first.setColor("#173177");
        mapdata.put("first", first);
        wechatTemplate.setData(mapdata);

        //实体类转json
        String toString =  JSONObject.toJSONString(wechatTemplate);


        //post请求得到返回数据(这里是封装过的,就是普通的java post请求)
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(pushMsgMode);
        httpPost.addHeader("Content-Type", "application/json");
        CloseableHttpResponse response = null;
        String result = null;
        try {
            httpPost.setEntity(new StringEntity(toString));
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            result = EntityUtils.toString(entity, "UTF-8");
            JSONObject json1 = JSON.parseObject(result);
            System.out.println(result);
            if(null!=json1){
                if(json1.getInteger("errcode")==0&&json1.getString("errmsg").equals("ok")){
                logger.info("推送登录消息:"+json1);
                }else {
                    logger.info("推送登录消息失败:"+json1);
                }
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成永久带参二维码
     * https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
     *
     */

    public static String getToken(){
        String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
        TOKEN_URL=  TOKEN_URL.replace("APPID",appId).replace("APPSECRET",appSecret);

        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(TOKEN_URL);
        CloseableHttpResponse response = null;
        String requestResult=null;
        JSONObject getCodeResultJson=null;
        try {

            response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            requestResult= EntityUtils.toString(entity,"UTF-8");
             getCodeResultJson = JSON.parseObject(requestResult);
            System.out.println(getCodeResultJson.toJSONString());
            String access_token= getCodeResultJson.getString("access_token");
            return  access_token;


        } catch (IOException e) {
            e.printStackTrace();
        }

        return getCodeResultJson.toJSONString();
    }


    public static void main(String[] args) {
        String ticket="gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
        String erwei="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
        String url="http://weixin.qq.com/q/02NZ0IYv0Meol10000M03t?ticket=gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
    }

    public static String getCode() {
        erweicode=erweicode.replace("TOKEN", getToken());
        //发送给微信服务器的数据
        String jsonStr = "{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\":{\"scene\": {\"scene_id\": " + 1000 + "}}}";

        //post请求得到返回数据(这里是封装过的,就是普通的java post请求)
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(erweicode);
        httpPost.addHeader("Content-Type", "application/json");
        CloseableHttpResponse response = null;
        String requestResult = null;
        try {
            httpPost.setEntity(new StringEntity(jsonStr));
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            requestResult = EntityUtils.toString(entity, "UTF-8");
            System.out.println(requestResult);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static Boolean  checkSignature(  String signature, String timestamp,String nonce){

        String arr[]=new String[]{token,timestamp,nonce};
        Arrays.sort(arr);
        StringBuilder builder=new StringBuilder();
        for (int i=0;i<arr.length;i++){

            builder.append(arr[i]);
        }
        String tempstr=null;
        try {
            MessageDigest md=MessageDigest.getInstance("SHA-1");
            byte [] digest=md.digest(builder.toString().getBytes());
            tempstr=byte2Str(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        if(tempstr!=null&&tempstr.equals(signature.toUpperCase())){
            return  true;
        }else {
            return false;
        }
    }
    public static String byte2Str(byte [] bt){
        StringBuilder str=new StringBuilder();
        for(int i=0;i<bt.length;i++){
            str.append(byte2HexStr(bt[i]));
        }
        return  str.toString();
    }
    public static String byte2HexStr(byte bt){
        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[(bt>>>4)&0X0F];
        temp[1]= digit[bt&0X0F];
        return new String(temp);
    }

}


package com.yeahc.zyp.huaqi;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ParseXmlUtil {
    public static Map<String, String> xml2Json( InputStream inputStream){

        // 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();


        // 从request中取得输入流
        //        InputStream inputStream = request.getInputStream();
        // 读取输入流
//        File f=new File("C:\\Users\\Administrator\\Desktop\\test1.xml");
//        InputStream inputStream= null;
        try {
//            inputStream = new FileInputStream(f);
            SAXReader reader = new SAXReader();
            Document document = reader.read(inputStream);
            // 得到xml根元素
            Element root = document.getRootElement();
            // 得到根元素的所有子节点
            List<Element> elementList = root.elements();

            // 遍历所有子节点
            for (Element e : elementList)
                map.put(e.getName(), e.getText());
            // 释放资源
            inputStream.close();
            System.out.println(map);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return map;
    }
// if(isreturn == true){
//        //转换XML
//        String key = wxdata.get("FromUserName")+ "__"
//                + wxdata.get("ToUserName")+ "__"
//                + wxdata.get("MsgType") + "__"
//                + wxdata.get("CreateTime");
//        logger.info("3.0 进入回复 转换对象:"+key);
//
//    }
    public static  void replyTextMsg( HttpServletResponse response,String context,Map<String,String> wxdata){
        String msgType="text";
        StringBuffer str = new StringBuffer();
        str.append("<xml>");
        str.append("<ToUserName><![CDATA[" + wxdata.get("FromUserName") + "]]></ToUserName>");
        str.append("<FromUserName><![CDATA[" +wxdata.get("ToUserName")+ "]]></FromUserName>");
        str.append("<CreateTime>" + System.currentTimeMillis() + "</CreateTime>");
        str.append("<MsgType><![CDATA[" + msgType + "]]></MsgType>");
        str.append("<Content><![CDATA["+context+"]]></Content>");
        str.append("</xml>");
        try {
            response.setCharacterEncoding("utf-8");
            PrintWriter printWriter=response.getWriter();
            printWriter.print(str.toString());
            printWriter.flush();
            printWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

}
public class TemplateData {
    private String value;
    private String color;
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}
public class WechatTemplate {
        private String touser;

        private String template_id;

        private String url;

        private Map<String, TemplateData> data;

        public String getTouser() {
            return touser;
        }

        public void setTouser(String touser) {
            this.touser = touser;
        }

        public String getTemplate_id() {
            return template_id;
        }

        public void setTemplate_id(String template_id) {
            this.template_id = template_id;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public Map<String, TemplateData> getData() {
            return data;
        }

        public void setData(Map<String, TemplateData> data) {
            this.data = data;
        }

}


 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!