package com.ruoyi.web.controller.qyweixin;

import com.alibaba.fastjson2.JSONObject;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 通用请求处理
 * 
 * @author ruoyi
 */
@RestController
@RequestMapping("/qyweixin")
public class MessageController
{
    /**
     * 获取企业微信token并发送消息
     *
     */
    @PostMapping("/sendMessage")
    public static void sendMessage(String message, String userString) throws IOException {
        String getUrlString = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwe7757ae3518f5674&corpsecret=6bvHwvgaMUwk_7EwEyLV-v_2nai-4I8qeewhFJgV0aI";
        URL getUrl = new URL(getUrlString);
        //打开和url之间的连接
        HttpURLConnection conn = (HttpURLConnection) getUrl.openConnection();
        //请求方式
        conn.setRequestMethod("GET");
        //设置通用的请求属性
        conn.setRequestProperty("accept", "*/*");
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
        //设置是否向httpUrlConnection输出，设置是否从httpUrlConnection读入，此外发送post请求必须设置这两个
        //最常用的Http请求无非是get和post，get请求可以获取静态页面，也可以把参数放在URL字串后面，传递给servlet，
        //post与get的 不同之处在于post的参数不是放在URL字串里面，而是放在http请求的正文内。get请求不需要设置
        //获取URLConnection对象对应的输出流
        conn.connect();
        //获取URLConnection对象对应的输入流
        InputStream is = conn.getInputStream();
        //构造一个字符流缓存
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String str = "";
        JSONObject json = null;
        while ((str = br.readLine()) != null) {
            json = JSONObject.parseObject(str);
        }
        //关闭流
        is.close();
        //断开连接，最好写上，disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
        //固定多线程的话，如果不disconnect，链接会增多，直到收发不出信息。写上disconnect后正常一些。
        conn.disconnect();
        String token = json != null ? json.getString("access_token") : "";
        String postUrlString = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token;
        URL postUrl = new URL(postUrlString);
        HttpURLConnection postConn = (HttpURLConnection) postUrl.openConnection();
        //请求方式 这里设置你需要请求的方式
        postConn.setRequestMethod("POST");
        //设置通用的请求属性
        postConn.setRequestProperty("accept", "*/*");
        postConn.setRequestProperty("connection", "Keep-Alive");
        //  这里设置请求头
        postConn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
        //设置是否向httpUrlConnection输出，设置是否从httpUrlConnection读入，此外发送post请求必须设置这两个
        //最常用的Http请求无非是get和post，get请求可以获取静态页面，也可以把参数放在URL字串后面，传递给servlet，
        //post与get的 不同之处在于post的参数不是放在URL字串里面，而是放在http请求的正文内。
        postConn.setDoOutput(true);
        postConn.setDoInput(true);
        //设置body内的参数，put到JSONObject中
        JSONObject param = new JSONObject();
        param.put("touser", userString);
        param.put("agentid", 1000016);
        JSONObject text = new JSONObject();
        text.put("content", message);
        param.put("markdown", text);
        param.put("msgtype", "markdown");
        // 得到请求的输出流对象
        OutputStream outputStream = postConn.getOutputStream();
        outputStream.write(param.toString().getBytes());
        outputStream.flush();
        outputStream.close();
        //获取URLConnection对象对应的输入流
        InputStream postIs = postConn.getInputStream();
        //构造一个字符流缓存
        BufferedReader postBr = new BufferedReader(new InputStreamReader(postIs));
        String postStr = "";
        JSONObject postJson = null;
        while ((postStr = postBr.readLine()) != null) {
            postJson = JSONObject.parseObject(postStr);
        }
        Integer errcode = postJson != null ? postJson.getInteger("errcode") : null;
        if (errcode != null && errcode == 0)
            System.out.println("应用消息发送成功");
        else
            System.out.println("应用消息发送失败");
        //关闭流
        postIs.close();
        //断开连接，最好写上，disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
        //固定多线程的话，如果不disconnect，链接会增多，直到收发不出信息。写上disconnect后正常一些。
        postConn.disconnect();
    }

    public static void sendAppMessage(String message, String userString) throws IOException {
        sendMessage(message, userString);
    }
}
