diff --git a/jeecg-module-main/src/main/java/org/jeecg/modules/wxgzh/WeChatTemplateMsg.java b/jeecg-module-main/src/main/java/org/jeecg/modules/wxgzh/WeChatTemplateMsg.java new file mode 100644 index 00000000..3b89e2e9 --- /dev/null +++ b/jeecg-module-main/src/main/java/org/jeecg/modules/wxgzh/WeChatTemplateMsg.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.wxgzh; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class WeChatTemplateMsg { + /** + * 消息 + */ + private String value; + /** + * 消息颜色 + */ + private String color; + + + public WeChatTemplateMsg(String value) { + this.value = value; + this.color = "#173177"; + } + + public WeChatTemplateMsg(String value, String color) { + this.value = value; + this.color = color; + } + +} diff --git a/jeecg-module-main/src/main/java/org/jeecg/modules/wxgzh/WxgzhController.java b/jeecg-module-main/src/main/java/org/jeecg/modules/wxgzh/WxgzhController.java new file mode 100644 index 00000000..7118758c --- /dev/null +++ b/jeecg-module-main/src/main/java/org/jeecg/modules/wxgzh/WxgzhController.java @@ -0,0 +1,141 @@ +package org.jeecg.modules.wxgzh; + +import com.alibaba.fastjson.JSONObject; +import com.xkcoding.http.HttpUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + + +@Controller +public class WxgzhController { + private static final Logger log = LoggerFactory.getLogger(WxgzhController.class); + + // appId + private static final String appId = "wx59920eb69d611d7f"; + + // appIdSecret + private static final String appIdSecret = "60b429xxxxxxxxxxxxxxx"; + + // 公众号的模板id(也有相应的接口可以查询到) + private static final String templateId = "KtWw0lwQ8FOgJdKgrmya0eoafGkMfMN8ECdZs8oSJys"; + + // 微信申请的域名(提前准备) + private static final String domain = "http://pay.xxx.cn/wxpay"; + // 自定义跳转方法 + private static final String redirectMethod = "/weixinoauth"; + + //微信通知点击后跳转的页面 + private static final String domainTo = "http://www.baidu.com"; + + //1.先查询code + @RequestMapping("/getCode") + public String getCode() { + // 官方地址 + String urlFir = "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid="; + // 地址进行encode转译 (未转译的地址是:http://pay.xxx.cn/wxpay/weixinoauth) + // 转译后的地址是: http%3A%2F%2Fpay.xxx.cn%2Fwxpay%2Fweixinoauth + String encoderUrl = getURLEncoderString(domain + redirectMethod); + log.info(urlFir +appId + "&redirect_uri=" + encoderUrl +"&response_type=code&scope=snsapi_base" + "&state=STATE" + "#wechat_redirect"); + return urlFir + appId + "&redirect_uri=" + encoderUrl +"&response_type=code&scope=snsapi_base" + "&state=STATE" + "#wechat_redirect"; + } + + /** + * 编码 + * @param str + * @return + */ + public static String getURLEncoderString(String str) { + String result = ""; + if (null == str) { + return ""; + } + try { + result = java.net.URLEncoder.encode(str, "GBK"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } + + //2.根据code获取openId + @GetMapping("/wxpay/weixinoauth") + public void weixinOauth(@RequestParam String code, @RequestParam String state) throws Exception { + log.info("获取code:{}",code); + String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + + appId + "&secret=" + appIdSecret + "&code=" + code + "&grant_type=authorization_code"; + String res = HttpUtil.get(url); + String openid = JSONObject.parseObject(res).getString("openid"); + log.info("根据code查询得到openId:{}",openid); + + } + + @GetMapping("/getToken") + public void getAccessToken() throws Exception{ + String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId +"&secret=" + appIdSecret; + String res = HttpUtil.get(url); + JSONObject jsonObject = JSONObject.parseObject(res); + String accessToken = jsonObject.getString("access_token"); + log.info("accessToken:{}", accessToken); + } + + + @GetMapping("/sendMessage") + public String sendMessage() { + // 模板参数 + Map sendMag = new HashMap(); + + // openId代表一个唯一微信用户,即微信消息的接收人 + String openId = "oNB9p1BpVJEquxxxxxxxxx"; + // 微信的基础accessToken + String accessToken = "57_LubK-8NKQc6C7jsLMxvdHaI0ju4x3-HPWEFhh7GKkw9fKbWhuxxoZyX4GaVIn6y4yO7RKfSlCyHdedKJlHUMZkd8457nKm0TOoaVkbzK1HCZ4g4gZdrmAGBylGBOZu9yxxxxxxxxxxxxxxxx"; + String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken; + + /** + * 其他模板可以从模板库中自己添加 + * 模板ID + * KtWw0lwQ8FOgJdKgrmya0eoafGkMfMN8ECdZs8oSJys + * 开发者调用模板消息接口时需提供模板ID + * 标题 上课提醒 + * 行业 教育 - 院校 + * 详细内容 + * {{first.DATA}} + * 课程:{{keyword1.DATA}} + * 时间:{{keyword2.DATA}} + * 地点:{{keyword3.DATA}} + * {{remark.DATA}} + */ + sendMag.put("first", new WeChatTemplateMsg("有课程即将开始")); + sendMag.put("keyword1", new WeChatTemplateMsg("线性代数")); + sendMag.put("keyword2", new WeChatTemplateMsg("[1,2节] 08:30-10:00")); + sendMag.put("keyword3", new WeChatTemplateMsg("上课地点N304")); + sendMag.put("remark", new WeChatTemplateMsg("请开发者为用户提供定制提醒的选项,以免打扰。")); + RestTemplate restTemplate = new RestTemplate(); + //拼接base参数 + Map sendBody = new HashMap<>(); + sendBody.put("touser", openId); // openId + sendBody.put("url", domainTo); // 点击模板信息跳转地址 + sendBody.put("topcolor", "#FF0000"); // 顶色 + sendBody.put("data", sendMag); // 模板参数 + sendBody.put("template_id", templateId); // 模板Id + ResponseEntity forEntity = restTemplate.postForEntity(url, sendBody, String.class); + log.info("结果是: {}",forEntity.getBody()); + JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody()); + // 0 + String messageCode = jsonObject.getString("errcode"); + // 2431260672639467520 + String msgId = jsonObject.getString("msgid"); + System.out.println("messageCode : " + messageCode + ", msgId: " +msgId); + return forEntity.getBody(); + } + +}