package cn.ksource.web.controller.wechat.menu.util;
|
|
import java.io.BufferedReader;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.io.OutputStream;
|
import java.net.ConnectException;
|
import java.net.URL;
|
|
import javax.net.ssl.HttpsURLConnection;
|
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLSocketFactory;
|
import javax.net.ssl.TrustManager;
|
|
import cn.ksource.web.controller.wechat.menu.domain.AccessToken;
|
import cn.ksource.web.controller.wechat.menu.domain.Menu;
|
|
|
import net.sf.json.JSONException;
|
import net.sf.json.JSONObject;
|
|
/**
|
* 公众平台通用接口工具类
|
*
|
* @author jiangxiaolei
|
* @date 2013-10-15
|
*/
|
public class WeixinUtil {
|
|
// 获取access_token的接口地址(GET) 限200(次/天)
|
public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
|
// 菜单创建(POST) 限100(次/天)
|
public static String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
|
|
//关注者列表地址
|
public static String attention_people_url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID";
|
|
/**
|
* 发起https请求并获取结果
|
*
|
* @param requestUrl 请求地址
|
* @param requestMethod 请求方式(GET、POST)
|
* @param outputStr 提交的数据
|
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
|
*/
|
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
|
JSONObject jsonObject = null;
|
StringBuffer buffer = new StringBuffer();
|
try {
|
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
|
TrustManager[] tm = { new MyX509TrustManager() };
|
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
|
sslContext.init(null, tm, new java.security.SecureRandom());
|
// 从上述SSLContext对象中得到SSLSocketFactory对象
|
SSLSocketFactory ssf = sslContext.getSocketFactory();
|
|
URL url = new URL(requestUrl);
|
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
|
httpUrlConn.setSSLSocketFactory(ssf);
|
|
httpUrlConn.setDoOutput(true);
|
httpUrlConn.setDoInput(true);
|
httpUrlConn.setUseCaches(false);
|
// 设置请求方式(GET/POST)
|
httpUrlConn.setRequestMethod(requestMethod);
|
|
if ("GET".equalsIgnoreCase(requestMethod))
|
httpUrlConn.connect();
|
|
// 当有数据需要提交时
|
if (null != outputStr) {
|
OutputStream outputStream = httpUrlConn.getOutputStream();
|
// 注意编码格式,防止中文乱码
|
outputStream.write(outputStr.getBytes("UTF-8"));
|
outputStream.close();
|
}
|
|
// 将返回的输入流转换成字符串
|
InputStream inputStream = httpUrlConn.getInputStream();
|
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
|
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
|
|
String str = null;
|
while ((str = bufferedReader.readLine()) != null) {
|
buffer.append(str);
|
}
|
bufferedReader.close();
|
inputStreamReader.close();
|
// 释放资源
|
inputStream.close();
|
inputStream = null;
|
httpUrlConn.disconnect();
|
jsonObject = JSONObject.fromObject(buffer.toString());
|
} catch (ConnectException ce) {
|
System.out.println("Weixin server connection timed out.");
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return jsonObject;
|
}
|
|
|
|
|
/**
|
* 获取关注者信息
|
*
|
* @param token
|
* @return
|
*/
|
public static int getAttentionPeople(String token) {
|
int total = 0;
|
String requestUrl = attention_people_url.replace("ACCESS_TOKEN", token).replace("NEXT_OPENID", "");
|
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
|
//只查询关注总数,没有查询列表信息,有待扩展
|
if (null != jsonObject) {
|
try {
|
total = jsonObject.getInt("total");
|
} catch (JSONException e) {
|
// 获取关注者信息失败
|
System.out.println("获取关注者失败errcode:{"+jsonObject.getInt("errcode")+"} errmsg:{"+jsonObject.getString("errmsg")+"}");
|
}
|
}
|
return total;
|
}
|
|
|
/**
|
* 获取access_token
|
*
|
* @param appid 凭证
|
* @param appsecret 密钥
|
* @return
|
*/
|
public static AccessToken getAccessToken(String appid, String appsecret) {
|
AccessToken accessToken = null;
|
|
String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
|
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
|
// 如果请求成功
|
if (null != jsonObject) {
|
try {
|
accessToken = new AccessToken();
|
accessToken.setToken(jsonObject.getString("access_token"));
|
accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
|
} catch (JSONException e) {
|
// 获取token失败
|
accessToken = null;
|
System.out.println("获取token失败errcode:{"+jsonObject.getInt("errcode")+"} errmsg:{"+jsonObject.getString("errmsg")+"}");
|
}
|
}
|
return accessToken;
|
}
|
|
|
|
/**
|
* 创建菜单
|
*
|
* @param menu 菜单实例
|
* @param accessToken 有效的access_token
|
* @return 0表示成功,其他值表示失败
|
*/
|
public static int createMenu(Menu menu, String accessToken) {
|
int result = 0;
|
|
// 拼装创建菜单的url
|
String url = menu_create_url.replace("ACCESS_TOKEN", accessToken);
|
// 将菜单对象转换成json字符串
|
String jsonMenu = JSONObject.fromObject(menu).toString();
|
// 调用接口创建菜单
|
JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);
|
|
if (null != jsonObject) {
|
if (0 != jsonObject.getInt("errcode")) {
|
result = jsonObject.getInt("errcode");
|
System.out.println("创建菜单失败errcode:{"+jsonObject.getInt("errcode")+"} errmsg:{"+jsonObject.getString("errmsg")+"}");
|
}
|
}
|
|
return result;
|
}
|
}
|