Skip to content

Commit

Permalink
add js api
Browse files Browse the repository at this point in the history
  • Loading branch information
liyiorg committed Jan 12, 2015
1 parent db834b6 commit 0292006
Show file tree
Hide file tree
Showing 6 changed files with 236 additions and 10 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/消息事件接收)
Expand All @@ -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)

Expand Down
29 changes: 29 additions & 0 deletions src/main/java/weixin/popular/api/TicketAPI.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
26 changes: 26 additions & 0 deletions src/main/java/weixin/popular/bean/Ticket.java
Original file line number Diff line number Diff line change
@@ -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;
}


}
10 changes: 0 additions & 10 deletions src/main/java/weixin/popular/bean/Token.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}


}
64 changes: 64 additions & 0 deletions src/main/java/weixin/popular/support/TicketManager.java
Original file line number Diff line number Diff line change
@@ -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<String,String> ticketMap = new LinkedHashMap<String,String>();

private static Map<String,Timer> timerMap = new HashMap<String, Timer>();


/**
* 初始化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;
}

}
114 changes: 114 additions & 0 deletions src/main/java/weixin/popular/util/JsUtil.java
Original file line number Diff line number Diff line change
@@ -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<String, String> map = new HashMap<String, String>();
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<String, String> mapP = MapUtil.objectToMap(payPackage);
String package_ = SignatureUtil.generatePackage(mapP, paternerKey);
Map<String, String> map = new LinkedHashMap<String, String>();
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);
}

}

0 comments on commit 0292006

Please sign in to comment.