这段时间了解了一下微信小程序的订阅功能,用一篇文章记录下,首先需要了解下微信小程序的具体信息
首先根据这个文档我们需要先带着appid和secret,这两个参数是之前用户授权腾讯小程序的手生成的,这时候再去请求腾讯的接口
此处根据第一个接口请求,grant_type是固定的,此处查看说明文档。
在Java代码中去请求该接口
public Map dealData(){
Map map = new HashedMap();
//1.根据cod去请求微信接口
String resulturl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=XXXXXXXXXXX";
//请求的http接口
String param=resulturl; //请求的发送的参数
System.out.println(param);
try {
URL url = new URL(param);
//打开和url之间的连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
/**设置URLConnection的参数和普通的请求属性****start***/
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.setRequestProperty("content-type","application/json");
/**设置URLConnection的参数和普通的请求属性****end***/
//设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
//最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
//post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("GET");//GET和POST必须全大写
/**GET方法请求*****start*/
conn.connect();
/**GET方法请求*****end*/
//获取URLConnection对象对应的输入流
InputStream is = conn.getInputStream();
//构造一个字符流缓存
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = "";
while ((str = br.readLine()) != null) {
str=new String(str.getBytes(),"UTF-8");//解决中文乱码问题
JSONObject parseObject = JSONArray.parseObject(str);
//调用腾讯接口返回回来的openid
String access_token = (String) parseObject.get("access_token");
//调用腾讯接口返回回来的openid
Integer expires_in = (Integer) parseObject.get("expires_in");
map.put("access_token",access_token);
map.put("expires_in",expires_in);
}
//关闭流
is.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
这里我设置的是请求腾讯接口,获得access_token和expires_in 也就是过期时间,
通过拿到这两个参数,这时候再进行下一步请求。
第二步,需要POST请求腾讯接口,来进行消息通知发送
参考代码:
/***
*
*
* 处理第二次请求腾讯接口
*
*/
public Map dealPostData(String template_id,JSONObject data,String access_token,String openid){
// String template_id = "AAAAAAAAAAAAA";
Map map = new HashedMap();
//1.根据cod去请求微信接口
String resulturl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+access_token;
//请求的http接口
String param=resulturl; //请求的发送的参数
System.out.println(param);
try {
URL url = new URL(param);
//打开和url之间的连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
OutputStreamWriter out = null ;
/**设置URLConnection的参数和普通的请求属性****start***/
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.setRequestProperty("content-type","application/json");
/**设置URLConnection的参数和普通的请求属性****end***/
//设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
//最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
//post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");//GET和POST必须全大写
//json格式的请求数据封装
JSONObject params = new JSONObject();
//params.put("access_token",access_token);
params.put("touser",openid);
params.put("template_id",template_id);
params.put("page","/page/index/index");
params.put("data",data);
System.out.println(params.toString());
//获取URLConnection对象对应的输出流并开始发送参数
out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
//添加参数
out.write(params.toString());
out.flush();
/**POST方法请求*****start*/
conn.connect();
/**POST方法请求*****end*/
//获取URLConnection对象对应的输入流
InputStream is = conn.getInputStream();
//构造一个字符流缓存
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = "";
while ((str = br.readLine()) != null) {
str=new String(str.getBytes(),"UTF-8");//解决中文乱码问题
JSONObject parseObject = JSONArray.parseObject(str);
map.put("result",parseObject);
}
//关闭流
is.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
其中的data数据,这两个只是两个工具类,具体在代码中的调用
//2、进行消息通知
JSONObject templateData = new JSONObject();
Map thing1value = new HashedMap();
thing1value.put("value",myPayStubs.getJobTitle());
templateData.put("thing1",thing1value);
Map amount2value = new HashedMap();
amount2value.put("value",myPayStubs.getJobBmbackprice()+myPayStubs.getMonthPay());
templateData.put("amount2",amount2value);
JSONObject data = templateData;
String template_id = "AAAAAAAAAAAAA";
//1.先get请求到access_token
Map map = dealData();
//2.拿到access_token
String access_token = (String) map.get("access_token");
//3.根据access_token
Map postmap = dealPostData(template_id,data,access_token,sysUserEntity.getOpenid());
System.out.println("result:"+postmap.get("result"));
其中的template_id就是自己在小程序段设置的消息通知的模板的ID,最后需要在小程序端设置消息接收提醒,当调用该接口时候就能收到消息提醒
(注:其中的thing1,amount2都是设置的键值对的键值,模板中会根据thing1,amount2去取值)