首先贴上官方文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
私以为这份文档写的还是很不错的,在开发的时候没有给我造成多大的困扰,比微信支付的文档好的不要太多。当然也可能是因为我调用的功能太少,没有碰上坑。
接下来进入正题。
这里会分步介绍代码所实现的功能,在文章最后会附上完整的类以及用到的其他类。
1. 获取AccessToken
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
HttpConnection conn = new HttpConnection();
StringBuilder sb = new StringBuilder("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential");
sb.append("&appid="+PropertiesUtil.getInstance().getPropMap().get("wx.AppKey"));
sb.append("&secret="+PropertiesUtil.getInstance().getPropMap().get("wx.AppSecret"));
String result = conn.get(sb.toString());
System.out.println(result);
JSONObject obj = new JSONObject(result);
String accessToken = obj.getString("access_token");
Instance.ACCESS_TOKEN = accessToken;
System.out.println(accessToken);
这里用到了HttpConnection类和PropertiesUtil,在文章最后会贴出该类的完整代码
2. 群发消息
String resp = "";//响应
String reqUrl = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token="+Instance.ACCESS_TOKEN;
try {
// 构造httprequest设置
HttpClient client = new HttpClient();
PostMethod request = new PostMethod(reqUrl);
// 添加request headers
request.addRequestHeader("Content-type", "application/json");
request.addRequestHeader("Accept", "application/json");
Map<String, Object> param = new HashMap<String, Object>();
param.put("touser", openId);
param.put("msgtype", "text");
Map<String, Object> content = new HashMap<String, Object>();
content.put("content", text);
param.put("text",content);
String json = new Gson().toJson(param);
request.setRequestEntity(new ByteArrayRequestEntity(json.getBytes("UTF-8")));
client.executeMethod(request);
resp = request.getResponseBodyAsString();
System.out.println(resp);
} catch (Exception e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
该方法参数中的openId为用户在微信的唯一标识,text为需要发送的消息内容。
需要注意的两点,
1.群发接口的openId数组必须包含2个及以上,如果只传一个openid会发送失败,这是我所不能理解的。
2.如果返回code为48003,这个返回码在官方文档中没有说明,出现的原因可能是你的微信公众号没有开通群发功能,需要登录微信公众号,在首页点击“新建群发”按钮,同意之后就可以了。
最后贴上完整的代码,记得把package替换掉:
package com.diecolor.wxpay;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.json.JSONObject;
import com.diecolor.util.HttpConnection;
import com.diecolor.util.PropertiesUtil;
import com.google.gson.Gson;
public class MessageUtil {
/**
* 内部类
* 实例化当前对象
*
*/
private static class Instance{
private static final MessageUtil mu = new MessageUtil();
private static String ACCESS_TOKEN =