Java微信公众号开发常用请求方法
- 一、根据openid和token获取用户的基本信息
https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html
/**
* 获取用户基本信息
* @return
*/
public static UserInfo getUserInfo(String openId,String accessToken){
HttpURLConnection conn = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
try {
String GET_USERINFO = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN";
String url = String.format(GET_USERINFO,accessToken,openId);
URL u = new URL(url);
conn = (HttpURLConnection) u.openConnection();
conn.setRequestMethod("GET");
conn.connect();
inputStreamReader = new InputStreamReader(conn.getInputStream(), "utf-8");
bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
JSONObject jsonObject = JSONObject.fromObject(buffer.toString());
UserInfo weixinUserInfo = new UserInfo();//自己建的bean
if("1".equals(jsonObject.getString("subscribe"))){//关注用户
// 用户的标识
weixinUserInfo.setSj_openId(jsonObject.getString("openid"));
// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
weixinUserInfo.setSj_subscribe(jsonObject.getInt("subscribe"));
// 用户关注时间
weixinUserInfo.setSj_subscribe_time(jsonObject.getString("subscribe_time"));
// 昵称
weixinUserInfo.setSj_nickname(jsonObject.getString("nickname"));
// 用户的性别(1是男性,2是女性,0是未知)
weixinUserInfo.setSj_sex(jsonObject.getInt("sex"));
// 用户所在国家
weixinUserInfo.setSj_country(jsonObject.getString("country"));
// 用户所在省份
weixinUserInfo.setSj_province(jsonObject.getString("province"));
// 用户所在城市
weixinUserInfo.setSj_city(jsonObject.getString("city"));
// 用户的语言,简体中文为zh_CN
weixinUserInfo.setSj_language(jsonObject.getString("language"));
// 用户头像
weixinUserInfo.setSj_headImgUrl(jsonObject.getString("headimgurl"));
//关注渠道
weixinUserInfo.setSj_subscribe_scene(jsonObject.getString("subscribe_scene"));
}else if("0".equals(jsonObject.getString("subscribe"))){//未关注用户
weixinUserInfo.setSj_openId(openId);
weixinUserInfo.setSj_subscribe(0);
}
return weixinUserInfo;
}catch (Exception e){
e.printStackTrace();
}finally {
try {
// 释放资源
if(bufferedReader!=null){
bufferedReader.close();
}
if(inputStreamReader!=null){
inputStreamReader.close();
}
if(conn!=null){
conn.disconnect();
}
}catch (Exception e){
e.printStackTrace();
}
}
return null;
}
- 二、网页授权用户同意授权,获取code(snsapi_base静默授权并自动跳转到回调页的,snsapi_userinfo这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。)
@RequestMapping(value = "/auth")
@ResponseBody
public void GuideServlet(HttpServletRequest request,HttpServletResponse response) throws Exception {
// 设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
/**
* 第一步:用户同意授权,获取code:https://open.weixin.qq.com/connect/oauth2/authorize
* ?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE
* &state=STATE#wechat_redirect
*/
String redirect_uri = URLEncoder.encode(
"http://1.1.1.1/wechatServer/login", "UTF-8");// 授权后重定向的回调链接地址,请使用urlencode对链接进行处理(文档要求)
// 按照文档要求拼接访问地址
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="
+ GlobalParams.APPID
+ "&redirect_uri="
+ redirect_uri
+ "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
response.sendRedirect(url);// 跳转到要访问的地址
}
- 三、根据 appid(自己的),secret(自己的),code(上一步获取的)
https://developers.weixin.qq.com/doc/offiaccount/User_Management/User_Tag_Management.html
/**
* 获取openid accesstoken
* @param appid
* @param secret
* @param code
* @return
*/
public static String getOpenId(String appid,String secret,String code){
HttpURLConnection conn = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
JSONObject jsonObject = null;
try {
String GET_OPENID = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
String url = String.format(GET_OPENID,appid,secret,code);
URL u = new URL(url);
conn = (HttpURLConnection) u.openConnection();
conn.setRequestMethod("GET");
conn.connect();
inputStreamReader = new InputStreamReader(conn.getInputStream(), "utf-8");
bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
jsonObject = JSONObject.fromObject(buffer.toString());
String openid = jsonObject.getString("openid");
return openid;
}catch (Exception e){
System.out.println("----------------------openidError---------------------------"+jsonObject);
e.printStackTrace();
}finally {
try {
// 释放资源
if(bufferedReader!=null){
bufferedReader.close();
}
if(inputStreamReader!=null){
inputStreamReader.close();
}
if(conn!=null){
conn.disconnect();
}
}catch (Exception e){
e.printStackTrace();
}
}
return null;
}
-
四、发送自定义模板消息
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html1.建立模板(必须以data结尾) 消息模板: {{first.DATA}} 留言内容:{{keyword1.DATA}} 留言文章:{{keyword2.DATA}} 留言时间:{{keyword3.DATA}} {{remark.DATA}}
最后发送的
直接写代码了:
public static void main(String[] args) {
TemplateData td = new TemplateData();//模板消息
Template template = new Template();//模板
td.setFirst(new DetailData("恭喜你留言入选为精选留言!"));
td.setKeyword1(new DetailData("略略略"));
td.setKeyword2(new DetailData("【理论学习】脱贫攻坚的实践总结与前沿思考——评"));
td.setKeyword3(new DetailData("2019-11-06 16:51:23"));
td.setRemark(new DetailData("谢谢关注!"));
template.setTemplate_id("自己的模板id");
template.setTouser("发送用户的openid");
template.setData(td);//上边的内容
template.setUrl("https://www.baidu.com");//模板跳转的链接
sendMessage(template,accesstoekn);
}
/**
* 关键字的详细设置
*/
public class DetailData {
private String value;//值
private String color = "#000000";//颜色 黑色
public DetailData() {
}
public DetailData(String value, String color) {
this.value = value;
this.color = color;
}
public DetailData(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
/**
* 模板消息 模板标题 爆料结案通知
*/
public class Template {
/**
* touser 是 接收者openid
template_id 是 模板ID
url 否 模板跳转链接
miniprogram 否 跳小程序所需数据,不需跳小程序可不用传该数据
appid 是 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
pagepath 否 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),暂不支持小游戏
data 是 模板数据
color 否 模板内容字体颜色,不填默认为黑色
*/
private String touser;
private String template_id;
private String url;
private TemplateData data;
public String getTouser() {
return touser;
}
public void setTouser(String touser) {
this.touser = touser;
}
public String getTemplate_id() {
return template_id;
}
public void setTemplate_id(String template_id) {
this.template_id = template_id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public TemplateData getData() {
return data;
}
public void setData(TemplateData data) {
this.data = data;
}
}
/**
* 模板中的data
*/
public class TemplateData {
private DetailData first;//欢迎语
private DetailData keyword1;//关键字1
private DetailData keyword2;//关键字2
private DetailData keyword3;//关键字3
private DetailData keyword4;//关键字3
private DetailData remark;//结束语
public DetailData getFirst() {
return first;
}
public void setFirst(DetailData first) {
this.first = first;
}
public DetailData getKeyword1() {
return keyword1;
}
public void setKeyword1(DetailData keyword1) {
this.keyword1 = keyword1;
}
public DetailData getKeyword2() {
return keyword2;
}
public void setKeyword2(DetailData keyword2) {
this.keyword2 = keyword2;
}
public DetailData getKeyword3() {
return keyword3;
}
public void setKeyword3(DetailData keyword3) {
this.keyword3 = keyword3;
}
public DetailData getKeyword4() {
return keyword4;
}
public void setKeyword4(DetailData keyword4) {
this.keyword4 = keyword4;
}
public DetailData getRemark() {
return remark;
}
public void setRemark(DetailData remark) {
this.remark = remark;
}
}
/**
* 给用户发消息
* @param t
*/
public static String sendMessage(String template,String accesstoekn){
HttpURLConnection conn = null;
JSONObject jsonObject = null;
String result = "";
InputStreamReader isr = null;
BufferedReader bf = null;
OutputStreamWriter osw = null;
PrintWriter printw = null;
try {
String send_message = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s&";
String url = String.format(send_message,accesstoekn);
URL u = new URL(url);
conn = (HttpURLConnection) u.openConnection();
conn.setRequestMethod("POST");
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/x-www-form-urlencoded; charset=utf-8");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("contentType", "UTF-8");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
osw = new OutputStreamWriter(conn.getOutputStream(),"UTF-8");
printw = new PrintWriter(osw);
logger.info("发送模板消息,参数:"+t);
printw.print(t); //输入参数
printw.flush();
//获取返回值
isr = new InputStreamReader(conn.getInputStream(),"UTF-8");
bf = new BufferedReader(isr);
String line;
while((line = bf.readLine()) != null){
result += line;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(bf != null){
try {
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(isr != null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(printw != null){
printw.close();
}
if(osw != null){
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
logger.info("发送模板消息结果:"+result);
return result;
}
- 五、获取公众号的黑名单用户
https://developers.weixin.qq.com/doc/offiaccount/User_Management/Manage_blacklist.html
/**
* 获取公众号的黑名单用户
* @param accesstoekn
* @return
*/
public static String getHmdUser(String accesstoekn){
HttpURLConnection conn = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
JSONObject jsonObject = null;
String result = "";
OutputStreamWriter osw = null;
PrintWriter printw = null;
try {
String getHmdUser = "https://api.weixin.qq.com/cgi-bin/tags/members/getblacklist?access_token=%s&";
String url = String.format(getHmdUser,accesstoekn);
URL u = new URL(url);
conn = (HttpURLConnection) u.openConnection();
conn.setRequestMethod("POST");
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/x-www-form-urlencoded; charset=utf-8");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("contentType", "UTF-8");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
osw = new OutputStreamWriter(conn.getOutputStream(),"UTF-8");
String begin_openid = null;
JSONObject t = JSONObject.fromObject(begin_openid);
printw = new PrintWriter(osw);
printw.print(t); //输入参数
printw.flush();
//获取返回值
inputStreamReader = new InputStreamReader(conn.getInputStream(),"UTF-8");
bufferedReader = new BufferedReader(inputStreamReader);
String line;
StringBuffer buffer = new StringBuffer();
while((line = bufferedReader.readLine()) != null){
buffer.append(line);
}
jsonObject = JSONObject.fromObject(buffer.toString());
String total = (String) jsonObject.getString("total");
String count = (String) jsonObject.getString("count");
String data = (String) jsonObject.getString("data");
String next_openid = (String) jsonObject.getString("next_openid");
logger.info("------------返回的json数据----------------------"+jsonObject);
return null;
}catch (Exception e){
e.printStackTrace();
}finally {
try {
// 释放资源
if(bufferedReader!=null){
bufferedReader.close();
}
if(inputStreamReader!=null){
inputStreamReader.close();
}
if(conn!=null){
conn.disconnect();
}
}catch (Exception e){
e.printStackTrace();
}
}
return null;
}