|
@@ -0,0 +1,246 @@
|
|
|
|
+package com.iamberry.rst.core.tools;
|
|
|
|
+
|
|
|
|
+import com.iamberry.cache.LocalCache;
|
|
|
|
+import com.iamberry.wechat.core.entity.wx.*;
|
|
|
|
+import com.iamberry.wechat.tools.MyX509TrustManager;
|
|
|
|
+import com.iamberry.wechat.tools.NameUtils;
|
|
|
|
+import net.sf.json.JSONObject;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+
|
|
|
|
+import javax.net.ssl.HttpsURLConnection;
|
|
|
|
+import javax.net.ssl.SSLContext;
|
|
|
|
+import javax.net.ssl.SSLSocketFactory;
|
|
|
|
+import javax.net.ssl.TrustManager;
|
|
|
|
+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 java.net.URLEncoder;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.logging.Logger;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 公众平台通用接口工具类
|
|
|
|
+ *
|
|
|
|
+ * @author fzh
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+public class WeixinUtil {
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // 日志
|
|
|
|
+ private static org.slf4j.Logger logger = LoggerFactory.getLogger(WeixinUtil.class);
|
|
|
|
+
|
|
|
|
+ // 发送短信模板的URL
|
|
|
|
+ private static String sendTemplate = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
|
|
|
|
+
|
|
|
|
+ // token缓存
|
|
|
|
+ private static LocalCache<String, Token> cache = new LocalCache<>(2);
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 网页授权获取access_token
|
|
|
|
+ *
|
|
|
|
+ * @param code
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static JSONObject getParamByOauth2(String code) {
|
|
|
|
+ JSONObject jsonObject = null;
|
|
|
|
+ try {
|
|
|
|
+ // 得到access_token和openid
|
|
|
|
+ jsonObject = httpRequest(NameUtils.oauth2_getToken_url.replaceAll("CODE", code).replaceAll("APPID", NameUtils.getConfig("appId")).replaceAll("SECRET", NameUtils.getConfig("appSecret")), "GET", null);
|
|
|
|
+ if (null != jsonObject) {
|
|
|
|
+ return jsonObject;
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ // 获取token失败
|
|
|
|
+ logger.error("获取token失败 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 发起https请求并获取结果
|
|
|
|
+ *
|
|
|
|
+ * @param requestUrl
|
|
|
|
+ * 请求地址
|
|
|
|
+ * @param requestMethod
|
|
|
|
+ * 请求方式(GET/POST)
|
|
|
|
+ * @param outputStr
|
|
|
|
+ * 提交的数据
|
|
|
|
+ * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
|
|
|
|
+ * java.lang.ClassCastException:
|
|
|
|
+ * sun.net.www.protocol.http.HttpURLConnection cannot be cast to
|
|
|
|
+ * javax.net.ssl.HttpsURLConnection
|
|
|
|
+ */
|
|
|
|
+ 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) {
|
|
|
|
+ Logger.getAnonymousLogger().info("Weixin server connection timed out.");
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ Logger.getAnonymousLogger().info("信任管理器请求时..." + e);
|
|
|
|
+ Logger.getAnonymousLogger().info("jsonObject..." + jsonObject);
|
|
|
|
+ }
|
|
|
|
+ return jsonObject;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取access_token
|
|
|
|
+ *
|
|
|
|
+ * @param appid
|
|
|
|
+ * 凭证
|
|
|
|
+ * @param appsecret
|
|
|
|
+ * 密钥
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static AccessToken getAccessToken(String appid, String appsecret) {
|
|
|
|
+
|
|
|
|
+ // 根据public No查询access_token
|
|
|
|
+ Token token = cache.get(NameUtils.getConfig("pubNo"));
|
|
|
|
+
|
|
|
|
+ AccessToken accessToken = null;
|
|
|
|
+ //判断数据库中是否存在token
|
|
|
|
+ if (token != null) {
|
|
|
|
+ //判断token是否失效
|
|
|
|
+ Date date = new Date();
|
|
|
|
+ if (date.getTime() < token.getEndDate().getTime()) {
|
|
|
|
+ accessToken = new AccessToken();
|
|
|
|
+ accessToken.setExpiresIn(7200);
|
|
|
|
+ accessToken.setToken(token.getToken());
|
|
|
|
+ return accessToken;
|
|
|
|
+ } else {
|
|
|
|
+ String requestUrl = NameUtils.access_token_url.replace("APPID", NameUtils.getConfig("appId")).replace("APPSECRET", NameUtils.getConfig("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"));
|
|
|
|
+ token.setToken(accessToken.getToken());
|
|
|
|
+ token.setEndDate(new Date(date.getTime() + 6500000));
|
|
|
|
+ token.setAppid(NameUtils.getConfig("pubNo"));
|
|
|
|
+ try {
|
|
|
|
+ cache.put(NameUtils.getConfig("pubNo"), token);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error(e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ return accessToken;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ accessToken = null;
|
|
|
|
+ // 获取token失败
|
|
|
|
+ logger.error("获取token失败 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ String requestUrl = NameUtils.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"));
|
|
|
|
+
|
|
|
|
+ token = new Token();
|
|
|
|
+ token.setToken(accessToken.getToken());
|
|
|
|
+ token.setEndDate(new Date(new Date().getTime() + 6500000));
|
|
|
|
+ token.setAppid(NameUtils.getConfig("pubNo"));
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ cache.put(NameUtils.getConfig("pubNo"), token);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ // 更新失败
|
|
|
|
+ logger.error(e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ return accessToken;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ accessToken = null;
|
|
|
|
+ // 获取token失败
|
|
|
|
+ logger.error("获取token失败 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return accessToken;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 创建二维码
|
|
|
|
+ *
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static QRCJson createQrcode(String json) {
|
|
|
|
+ QRCJson qrcJson = new QRCJson();
|
|
|
|
+ try {
|
|
|
|
+ AccessToken at = getAccessToken(NameUtils.getConfig("appId"), NameUtils.getConfig("appSecret"));
|
|
|
|
+ if (at != null) {
|
|
|
|
+ String token = at.getToken();
|
|
|
|
+ JSONObject jsonObject = httpRequest(NameUtils.get_token_url.replaceAll("TOKEN", token), "POST", json);
|
|
|
|
+ if (jsonObject != null) {
|
|
|
|
+ String ticket = URLEncoder.encode(jsonObject.getString("ticket"), "UTF-8");
|
|
|
|
+ qrcJson.setTicket(ticket);
|
|
|
|
+ qrcJson.setUrl(NameUtils.show_qrcode_url + ticket);
|
|
|
|
+ if (json.contains("expire_seconds")) {// 临时二维码才有过期时间
|
|
|
|
+ qrcJson.setExpire_seconds(jsonObject.getString("expire_seconds"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return qrcJson;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|