这个工具类是为了方便近期快速开发微信公众号而写的,可能URL及关键字量大的话要拆成多个类来存放了。不过量少的话可以用这个方法:
public class WxCommonInfo {
/** put() remove() synchronized (this)*/
public static volatile Map<String,Object> noticerUserNameHashMap = new ConcurrentHashMap<String,Object>();
public final static String APPID = "APPID";
public final static String APPSECRET = "APPSECRET";
public final static String ACCESS_TOKEN = "ACCESS_TOKEN";
public final static String REDIRECT_URI = "REDIRECT_URI";
public final static String SCOPE = "SCOPE";
public final static String STATE = "STATE";
public final static String CODE = "CODE";
public final static String OPENID = "OPENID";
public final static String NEXT_OPENID = "NEXT_OPENID";
/**刷新access_token*/
public static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**获取access_token的第二个地址(不确定)*/
private static String ACCESS_TOKEN_URL_2 = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
/**得到ticket*/
public static String TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
/**得到code*/
public static String CODE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
/**获取生成用户关注二维码所需二维码ticket*/
private static String LS_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN";
/**得到openid*/
public static String OPEN_ID_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
/**获取用户信息*/
public static String USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
/**判断用户是否关注公众号*/
public static String USER_FOCUS_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
/**菜单创建(POST) 限100(次/天)*/
public static String MENU_CREATE_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
/**客服接口地址*/
public static String SEND_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";
/**批量获取用户基本信息,最多支持一次拉取100条。(POST)*/
public static String USER_INFO_LIST_URL = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN";
/**
* 获取帐号的关注者列表,next_openid:第一个拉取的OPENID,不填默认从头开始拉取
* 一次拉取调用最多拉取10000个关注者的OpenID
* 返回数据里:next_openid:拉取列表的最后一个用户的OPENID
*/
public static String USER_INFO_NEXT_URL = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID";
/**微信公众号主动发送的url*/
public static String CUSTOM_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";
/**模板消息: 设置所属行业 POST (有参数)*/
public static String SET_INDUSTRY_URL = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN";
/**获取设置的行业信息 GET*/
public static String GET_INDUSTRY_URL = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=ACCESS_TOKEN";
/**获得模板ID POST (有参数)*/
public static String ADD_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN";
/**获取模板列表 GET*/
public static String GET_ALL_PRIVATE_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN";
/**删除模板 POST*/
public static String DEL_PRIVATE_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token=ACCESS_TOKEN";
/**发送模板消息 POST (有参数 json样式)*/
public static String TEMPLATE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
/**根据OpenID列表群发 POST(有参数,json样式)*/
public static String MASS_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=ACCESS_TOKEN";
public static String transformURL(String targetUrl,Map<String,String> maps) throws IllegalAccessException {
System.out.println("开始转换URL里面的变量");
Class<?> clz = WxCommonInfo.class;
Field[] fields = clz.getDeclaredFields();
if(maps != null && maps.size() > 0){
for (Map.Entry<String, String> entry : maps.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
for (int i = 0; i < fields.length; i++) {
//判断是不是final类型
if (Modifier.isFinal(fields[i].getModifiers())) {
// fields[i].setAccessible(true);//如果成员变量是private的,则需要设置accessible为true
//获取变量的值
Object object = fields[i].get(clz);
//判断map里面的值是否有与final值相匹配的
if(key.equals(object.toString())){
if(targetUrl.contains(object.toString())){
targetUrl = targetUrl.replace(object.toString(),value);
}else {
return null;
}
}
}
}
}
return targetUrl;
}else {
if(targetUrl != null){
return targetUrl;
}else {
return null;
}
}
}
}
然后使用方式:
String ticketUrl = WxCommonInfo.TICKET_URL;
Map<String,String> maps = new HashMap<String, String> ();
maps.put(WxCommonInfo.ACCESS_TOKEN,token);
try {
ticketUrl = WxCommonInfo.transformURL(ticketUrl,maps);
} catch (IllegalAccessException e) {
ticketUrl = null;
logger.error(e.getMessage());
e.printStackTrace();
}
用这个方法就不用再单独一个个的进行URL替换了,都走这一个方法就可以了。