From 0292006bfe7b996b92360b66c2af8232252d476d Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 12 Jan 2015 16:14:53 +0800 Subject: [PATCH] add js api --- README.md | 3 + .../java/weixin/popular/api/TicketAPI.java | 29 +++++ src/main/java/weixin/popular/bean/Ticket.java | 26 ++++ src/main/java/weixin/popular/bean/Token.java | 10 -- .../weixin/popular/support/TicketManager.java | 64 ++++++++++ src/main/java/weixin/popular/util/JsUtil.java | 114 ++++++++++++++++++ 6 files changed, 236 insertions(+), 10 deletions(-) create mode 100644 src/main/java/weixin/popular/api/TicketAPI.java create mode 100644 src/main/java/weixin/popular/bean/Ticket.java create mode 100644 src/main/java/weixin/popular/support/TicketManager.java create mode 100644 src/main/java/weixin/popular/util/JsUtil.java diff --git a/README.md b/README.md index 300acdf2..ea19067d 100644 --- a/README.md +++ b/README.md @@ -18,11 +18,13 @@ weixin-popular 包括微信公众平台基础API与支付API,提供便捷的API * [SnsAPI](https://github.com/liyiorg/weixin-popular/wiki/SnsAPI) 网签授权 * [UserAPI](https://github.com/liyiorg/weixin-popular/wiki/UserAPI) 用户管理 * [ShorturlAPI](https://github.com/liyiorg/weixin-popular/wiki/ShorturlAPI) 长链接转短链接 +* [TicketAPI](https://github.com/liyiorg/weixin-popular/wiki/TicketAPI) JSAPI ticket ## 工具类 * PayUtil 支付工具类,生成JS支付,原生支付 * SignatureUtil 签权生成、验证 * XMLConverUtil XML 对象转换(JAXB) +* JsUtil JsAPI config,chooseWXPay JSON生成 ## example * [消息事件接收](https://github.com/liyiorg/weixin-popular/wiki/消息事件接收) @@ -31,6 +33,7 @@ weixin-popular 包括微信公众平台基础API与支付API,提供便捷的API ## 其它 * [TokenManager token 自动刷新](https://github.com/liyiorg/weixin-popular/wiki/TokenManager-token-自动刷新) +* [TicketManager ticket 自动刷新](https://github.com/liyiorg/weixin-popular/wiki/TicketManager-ticket-自动刷新) * [设置API HttpClient 请求池大小](https://github.com/liyiorg/weixin-popular/wiki/设置API HttpClient 请求池大小) * [设置API MCH KeyStore](https://github.com/liyiorg/weixin-popular/wiki/设置API MCH KeyStore) diff --git a/src/main/java/weixin/popular/api/TicketAPI.java b/src/main/java/weixin/popular/api/TicketAPI.java new file mode 100644 index 00000000..d175aab4 --- /dev/null +++ b/src/main/java/weixin/popular/api/TicketAPI.java @@ -0,0 +1,29 @@ +package weixin.popular.api; + +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; + +import weixin.popular.bean.Ticket; +import weixin.popular.client.LocalHttpClient; + +/** + * JSAPI ticket + * @author LiYi + * + */ +public class TicketAPI extends BaseAPI{ + + /** + * 获取 jsapi_ticket + * @param access_token + * @return + */ + public static Ticket ticketGetticket(String access_token){ + HttpUriRequest httpUriRequest = RequestBuilder.post() + .setUri(BASE_URI + "/cgi-bin/ticket/getticket") + .addParameter("access_token",access_token) + .addParameter("type", "jsapi") + .build(); + return LocalHttpClient.executeJsonResult(httpUriRequest,Ticket.class); + } +} diff --git a/src/main/java/weixin/popular/bean/Ticket.java b/src/main/java/weixin/popular/bean/Ticket.java new file mode 100644 index 00000000..ece5b803 --- /dev/null +++ b/src/main/java/weixin/popular/bean/Ticket.java @@ -0,0 +1,26 @@ +package weixin.popular.bean; + +public class Ticket extends BaseResult{ + + private String ticket; + + private Integer expires_in; + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public Integer getExpires_in() { + return expires_in; + } + + public void setExpires_in(Integer expires_in) { + this.expires_in = expires_in; + } + + +} diff --git a/src/main/java/weixin/popular/bean/Token.java b/src/main/java/weixin/popular/bean/Token.java index cf77e1a2..d481d665 100644 --- a/src/main/java/weixin/popular/bean/Token.java +++ b/src/main/java/weixin/popular/bean/Token.java @@ -4,7 +4,6 @@ public class Token extends BaseResult { private String access_token; private int expires_in; - private long genTime; public String getAccess_token() { return access_token; @@ -22,13 +21,4 @@ public void setExpires_in(int expiresIn) { expires_in = expiresIn; } - public long getGenTime() { - return genTime; - } - - public void setGenTime(long genTime) { - this.genTime = genTime; - } - - } diff --git a/src/main/java/weixin/popular/support/TicketManager.java b/src/main/java/weixin/popular/support/TicketManager.java new file mode 100644 index 00000000..8d20d4ad --- /dev/null +++ b/src/main/java/weixin/popular/support/TicketManager.java @@ -0,0 +1,64 @@ +package weixin.popular.support; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import weixin.popular.api.TicketAPI; +import weixin.popular.bean.Ticket; + +/** + * TicketManager ticket 自动刷新 + * @author LiYi + * + */ +public class TicketManager { + + private static Map ticketMap = new LinkedHashMap(); + + private static Map timerMap = new HashMap(); + + + /** + * 初始化ticket 刷新,每119分钟刷新一次。 + * 依赖TokenManager + * @param appid + */ + public static void init(final String appid){ + if(!timerMap.containsKey(appid)){ + Timer timer = new Timer(true); + timer.schedule(new TimerTask() { + @Override + public void run() { + String access_token = TokenManager.getToken(appid); + Ticket ticket = TicketAPI.ticketGetticket(access_token); + ticketMap.put(appid,ticket.getTicket()); + } + },0,1000*60*119); + timerMap.put(appid,timer); + } + } + + /** + * 获取 jsapi ticket + * @param appid + * @return + */ + public static String getTicket(final String appid){ + return ticketMap.get(appid); + } + + /** + * 获取第一个appid 的 jsapi ticket + * 适用于单一微信号 + * @param appid + * @return + */ + public static String getDefaultTicket(){ + Object[] objs = ticketMap.values().toArray(); + return objs.length>0?objs[0].toString():null; + } + +} diff --git a/src/main/java/weixin/popular/util/JsUtil.java b/src/main/java/weixin/popular/util/JsUtil.java new file mode 100644 index 00000000..4fb37e54 --- /dev/null +++ b/src/main/java/weixin/popular/util/JsUtil.java @@ -0,0 +1,114 @@ +package weixin.popular.util; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + +import weixin.popular.bean.pay.PayPackage; + +public class JsUtil { + + /** + * 生成 config接口 signature + * @param noncestr + * @param jsapi_ticket + * @param timestamp + * @param url + * @return + */ + public static String generateConfigSignature(String noncestr,String jsapi_ticket,String timestamp,String url){ + Map map = new HashMap(); + map.put("noncestr", noncestr); + map.put("jsapi_ticket", jsapi_ticket); + map.put("timestamp", timestamp); + map.put("url", url); + return SignatureUtil.generatePaySign(map, null); + } + + /** + * 生成 config接口注入权限验证 JSON + * @param jsapi_ticket + * @param debug + * @param appId + * @param url + * @param jsApiList + * onMenuShareTimeline + onMenuShareAppMessage + onMenuShareQQ + onMenuShareWeibo + startRecord + stopRecord + onVoiceRecordEnd + playVoice + pauseVoice + stopVoice + onVoicePlayEnd + uploadVoice + downloadVoice + chooseImage + previewImage + uploadImage + downloadImage + translateVoice + getNetworkType + openLocation + getLocation + hideOptionMenu + showOptionMenu + hideMenuItems + showMenuItems + hideAllNonBaseMenuItem + showAllNonBaseMenuItem + closeWindow + scanQRCode + chooseWXPay + openProductSpecificView + addCard + chooseCard + openCard + * @return + */ + public static String generateConfigJson(String jsapi_ticket,boolean debug,String appId,String url,String... jsApiList){ + long timestamp = System.currentTimeMillis()/1000; + String nonceStr = UUID.randomUUID().toString(); + String signature = generateConfigSignature(nonceStr, jsapi_ticket,timestamp+"",url); + return new StringBuilder() + .append("{") + .append("debug:").append(debug).append(",") + .append("appId:").append("'").append(appId).append("'").append(",") + .append("timestamp:").append(timestamp).append(",") + .append("nonceStr:").append("'").append(nonceStr).append("'").append(",") + .append("signature:").append("'").append(signature).append("'").append(",") + .append("jsApiList:").append(JsonUtil.toJSONString(jsApiList)) + .append("}").toString(); + } + + /** + * 生成微信支付JSON + * @param payPackage + * @param appid + * @param paternerKey + * @param paySignkey + * @return + */ + public static String generateChooseWXPayJson(PayPackage payPackage, + String appid, + String paternerKey, + String paySignkey){ + Map mapP = MapUtil.objectToMap(payPackage); + String package_ = SignatureUtil.generatePackage(mapP, paternerKey); + Map map = new LinkedHashMap(); + long timestamp = System.currentTimeMillis()/1000; + String noncestr = UUID.randomUUID().toString(); + map.put("timestamp", timestamp+""); + map.put("noncestr",noncestr); + map.put("package",package_); + map.put("appid",appid); + String paySign = SignatureUtil.generatePaySign(map,paySignkey); + map.put("paySign", paySign); + map.remove("appid"); + return JsonUtil.toJSONString(map); + } + +}