(感谢好多老哥提供的文档,哈哈,这里我就只是代码贴出来,方便以后copy)
1获取token
String token = Wechat.getAccess_token(appId, appSecret).getString("access_token");
public static JSONObject getAccess_token(String appId, String appSecret) {String url = "https://api./cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;String accessToken = null;JSONObject jsonObj = null;try {URL urlGet = new URL(url);HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();http.setRequestMethod("GET"); // 必须是get方式请求http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");http.setDoOutput(true);http.setDoInput(true);http.connect();InputStream is = http.getInputStream();int size = is.available();byte[] jsonBytes = new byte[size];is.read(jsonBytes);accessToken = new String(jsonBytes, "UTF-8");System.err.println(accessToken);jsonObj = JSONObject.parseObject(accessToken);is.close();} catch (Exception e) {e.printStackTrace();}return jsonObj;}
2调用service层发消息模板
TemplateMessageService.sendTemp(appId, token, appSecret, entity.realAmount, tenantEntity.name, memberEntity.wechatOpenId);
3进入该模板后会调用httputil类,发送消息
package mon.services;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import mon.utils.HttpSend;import mon.utils.HttpUtil;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;public class TemplateMessageService {public static void sendTemp(String appid, String accessToken, String appSecret, Double realAmount, String shopName, String openId) {String url = "https://api./cgi-bin/token";String param = "grant_type=client_credential" + "&appid=" + appid + "&secret=" + appSecret;String accTemp = HttpSend.sendGet(url, param);JSONObject jsonObject = JSONObject.parseObject(accTemp);System.out.println("1--->" + jsonObject);accessToken = jsonObject.getString("access_token"); // 获取到了access_token,调用接口都要用到的,有时效// 封装要发送的jsonMap<String, Object> map = new HashMap();map.put("touser", openId);//你要发送给某个用户的openid 前提是已关注该公众号,该openid是对应该公众号的,不是普通的openidmap.put("template_id", "VkxwzizOa2YS_M2RQbVQHPHzHTbabAqLvqU5FNFqQVs");//模板消息id//map.put("url","");//用户点击模板消息,要跳转的地址// 封装miniprogram 跳转小程序用,不跳不要填Map<String, String> mapA = new HashMap<>();mapA.put("appid", ""); //小程序appidmapA.put("pagepath", ""); //小程序页面pagepathmap.put("miniprogram", mapA);// 以下就是根据模板消息的格式封装好,我模板的是:问题反馈结果通知 可以和我一样试试// 封装firstMap firstMap = new HashMap();firstMap.put("value", "新的消费通知!"); //内容firstMap.put("color", "#173177"); //字体颜色// 封装keyword1 提交的问题Map keyword1Map = new HashMap();keyword1Map.put("value", shopName);keyword1Map.put("color", "#fff");// 封装keyword2此处也可以是商品名Map keyword2Map = new HashMap();keyword2Map.put("value", "-");keyword2Map.put("color", "#fff");// 封装keyword2此处可以是商品价格Map keyword3Map = new HashMap();keyword3Map.put("value", realAmount + "元");keyword3Map.put("color", "#fff");// 封装keyword4// 封装remarkDate date = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Map keyword4Map = new HashMap();keyword4Map.put("value", simpleDateFormat.format(date));keyword4Map.put("color", "#fff");Map remarkMap = new HashMap();remarkMap.put("value", "尊敬的用户,您于" + simpleDateFormat.format(date) + "在" + shopName + "消费了" + realAmount + "元");remarkMap.put("color", "#fff");// 封装dataMap dataMap = new HashMap();dataMap.put("first", firstMap);dataMap.put("keyword1", keyword1Map);dataMap.put("keyword2", keyword2Map);dataMap.put("keyword3", keyword3Map);dataMap.put("keyword4", keyword4Map);dataMap.put("remark", remarkMap);map.put("data", dataMap);String r = HttpUtil.getJsonData(JSONObject.parseObject(JSON.toJSONString(map)), "https://api./cgi-bin/message/template/send?access_token=" + accessToken); //发送模板消息,这里有个工具类,我给你哟System.out.println("-->" + r);}public static void sendTempPoint(String appid, String accessToken, String appSecret, Integer Id, String name, String mobile, Double amount, String wechatOpenId) {String url = "https://api./cgi-bin/token";String param = "grant_type=client_credential" + "&appid=" + appid + "&secret=" + appSecret;String accTemp = HttpSend.sendGet(url, param);JSONObject jsonObject = JSONObject.parseObject(accTemp);System.out.println("1--->" + jsonObject);accessToken = jsonObject.getString("access_token"); // 获取到了access_token,调用接口都要用到的,有时效// 封装要发送的jsonMap<String, Object> map = new HashMap();map.put("touser", wechatOpenId);//你要发送给某个用户的openid 前提是已关注该公众号,该openid是对应该公众号的,不是普通的openidmap.put("template_id", "672dPs0Jwl9zLvhVrncI0nyEHxX3Mx-fPNLBcIEb05A");//模板消息id//map.put("url","");//用户点击模板消息,要跳转的地址// 封装miniprogram 跳转小程序用,不跳不要填Map<String, String> mapA = new HashMap<>();mapA.put("appid", ""); //小程序appidmapA.put("pagepath", ""); //小程序页面pagepathmap.put("miniprogram", mapA);// 以下就是根据模板消息的格式封装好,我模板的是:问题反馈结果通知 可以和我一样试试// 封装firstMap firstMap = new HashMap();firstMap.put("value", "会员积分消费提醒!"); //内容firstMap.put("color", "#173177"); //字体颜色String newname;try {newname = (.URLDecoder.decode(name, "UTF-8"));} catch (UnsupportedEncodingException e) {newname = name;}// 封装keyword1 提交的问题Map XM = new HashMap();XM.put("value", newname);XM.put("color", "#fff");// 封装keyword2此处也可以是商品名Map KH = new HashMap();KH.put("value", Id);KH.put("color", "#fff");Date date = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 封装keyword3此处可以是商品价格Map CONTENTS = new HashMap();CONTENTS.put("value", "尊敬的用户,您的账户于" + simpleDateFormat.format(date) + "增加了" + amount + "积分");CONTENTS.put("color", "#fff");Map remarkMap = new HashMap();remarkMap.put("value", "消息惠顾");remarkMap.put("color", "#fff");// 封装dataMap dataMap = new HashMap();dataMap.put("first", firstMap);dataMap.put("XM", XM);dataMap.put("KH", KH);dataMap.put("CONTENTS", CONTENTS);dataMap.put("remark", remarkMap);map.put("data", dataMap);String r = HttpUtil.getJsonData(JSONObject.parseObject(JSON.toJSONString(map)), "https://api./cgi-bin/message/template/send?access_token=" + accessToken); //发送模板消息,这里有个工具类,我给你哟System.out.println("-->" + r);}}
4发送消息
package mon.utils;import com.alibaba.fastjson.JSONObject;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .HttpURLConnection;import .URL;public class HttpUtil {public static String getJsonData(JSONObject jsonParam, String urls) {StringBuffer sb = new StringBuffer();try {// 创建url资源URL url = new URL(urls);// 建立http连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置允许输出conn.setDoOutput(true);// 设置允许输入conn.setDoInput(true);// 设置不用缓存conn.setUseCaches(false);// 设置传递方式conn.setRequestMethod("POST");// 设置维持长连接conn.setRequestProperty("Connection", "Keep-Alive");// 设置文件字符集:conn.setRequestProperty("Charset", "UTF-8");// 转换为字节数组byte[] data = (jsonParam.toString()).getBytes();// 设置文件长度conn.setRequestProperty("Content-Length", String.valueOf(data.length));// 设置文件类型:conn.setRequestProperty("contentType", "application/json");// 开始连接请求conn.connect();//OutputStream out = new DataOutputStream(conn.getOutputStream()) ;//防止消息乱码OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");// 写入请求的字符串out.write(jsonParam.toString());out.flush();out.close();System.out.println(conn.getResponseCode());// 请求返回的状态if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {System.out.println("连接成功");// 请求返回的数据InputStream in1 = conn.getInputStream();try {String readLine = new String();BufferedReader responseReader = new BufferedReader(new InputStreamReader(in1, "UTF-8"));while ((readLine = responseReader.readLine()) != null) {sb.append(readLine).append("\n");}responseReader.close();System.out.println(sb.toString());} catch (Exception e1) {e1.printStackTrace();}} else {System.out.println("error++");}} catch (Exception e) {}return sb.toString();}/*** @auther: cxl* @Description 发送post请求 参数String* @date: /4/28 19:38*/public static String post(String jsonParam, String urls) {StringBuffer sb = new StringBuffer();try {// 创建url资源URL url = new URL(urls);// 建立http连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置允许输出conn.setDoOutput(true);// 设置允许输入conn.setDoInput(true);// 设置不用缓存conn.setUseCaches(false);// 设置传递方式conn.setRequestMethod("POST");// 设置维持长连接conn.setRequestProperty("Connection", "Keep-Alive");// 设置文件字符集:conn.setRequestProperty("Charset", "UTF-8");// 转换为字节数组//byte[] data = (jsonParam.toString()).getBytes();// 设置文件长度// conn.setRequestProperty("Content-Length", String.valueOf(data.length));// 设置文件类型:conn.setRequestProperty("contentType", "application/text");// 开始连接请求conn.connect();//防止消息乱码OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");// 写入请求的字符串out.write(jsonParam.toString());out.flush();out.close();System.out.println(conn.getResponseCode());// 请求返回的状态if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {System.out.println("连接成功");// 请求返回的数据InputStream in1 = conn.getInputStream();try {String readLine = new String();BufferedReader responseReader = new BufferedReader(new InputStreamReader(in1, "UTF-8"));while ((readLine = responseReader.readLine()) != null) {sb.append(readLine).append("\n");}responseReader.close();System.out.println(sb.toString());} catch (Exception e1) {e1.printStackTrace();}} else {System.out.println("error++");}} catch (Exception e) {e.printStackTrace();}return sb.toString();}}
5以下问题是之后出的问题
此处如果不写utf-8本地postman测试不一定会乱码 ,上传线上有几率乱码,我遇到了,被骂死,哈哈,其他的真没什么问题,openid是他们提供的,我不太清楚,然后千万别乱给微信公众号,他们给错公众号害得我一直显示未关注公众号,擦,说了他们不信