社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
(感谢好多老哥提供的文档,哈哈,这里我就只是代码贴出来,方便以后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.weixin.qq.com/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 com.mall.common.services;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mall.common.utils.HttpSend;
import com.mall.common.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.weixin.qq.com/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,调用接口都要用到的,有时效
// 封装要发送的json
Map<String, Object> map = new HashMap();
map.put("touser", openId);//你要发送给某个用户的openid 前提是已关注该公众号,该openid是对应该公众号的,不是普通的openid
map.put("template_id", "VkxwzizOa2YS_M2RQbVQHPHzHTbabAqLvqU5FNFqQVs");//模板消息id
//map.put("url","https://www.vipkes.cn");//用户点击模板消息,要跳转的地址
// 封装miniprogram 跳转小程序用,不跳不要填
Map<String, String> mapA = new HashMap<>();
mapA.put("appid", ""); //小程序appid
mapA.put("pagepath", ""); //小程序页面pagepath
map.put("miniprogram", mapA);
// 以下就是根据模板消息的格式封装好,我模板的是:问题反馈结果通知 可以和我一样试试
// 封装first
Map 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
// 封装remark
Date 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");
// 封装data
Map 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.weixin.qq.com/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.weixin.qq.com/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,调用接口都要用到的,有时效
// 封装要发送的json
Map<String, Object> map = new HashMap();
map.put("touser", wechatOpenId);//你要发送给某个用户的openid 前提是已关注该公众号,该openid是对应该公众号的,不是普通的openid
map.put("template_id", "672dPs0Jwl9zLvhVrncI0nyEHxX3Mx-fPNLBcIEb05A");//模板消息id
//map.put("url","https://www.vipkes.cn");//用户点击模板消息,要跳转的地址
// 封装miniprogram 跳转小程序用,不跳不要填
Map<String, String> mapA = new HashMap<>();
mapA.put("appid", ""); //小程序appid
mapA.put("pagepath", ""); //小程序页面pagepath
map.put("miniprogram", mapA);
// 以下就是根据模板消息的格式封装好,我模板的是:问题反馈结果通知 可以和我一样试试
// 封装first
Map firstMap = new HashMap();
firstMap.put("value", "会员积分消费提醒!"); //内容
firstMap.put("color", "#173177"); //字体颜色
String newname;
try {
newname = (java.net.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");
// 封装data
Map 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.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken); //发送模板消息,这里有个工具类,我给你哟
System.out.println("-->" + r);
}
}
4发送消息
package com.mall.common.utils;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.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: 2019/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是他们提供的,我不太清楚,然后千万别乱给微信公众号,他们给错公众号害得我一直显示未关注公众号,擦,说了他们不信
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!