微信公众号自定义菜单和推送模板消息
- Java代码: 准备工作: (1)填写JS接口安全域名 (2)填写接口配置信息: (2)java的Token验证接口
@RequestMapping(value = "/verifier",method = {
RequestMethod.GET})
public void processGet(HttpServletRequest request, HttpServletResponse response) throws Exception{
System.out.println("验证接口消息");
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
//校验证签名
boolean check = wxService.check(signature, timestamp, nonce);
if (check){
System.out.println("接入成功");
PrintWriter writerOut = response.getWriter();
writerOut.print(echostr);
writerOut.flush();
writerOut.close();
}else {
System.out.println("接入失败");
}
}
验证签名:
public boolean check(String signature, String timestamp, String nonce){
//字典排序
String token = "自定义的Token值";
String[] wxStrArr = {
token, timestamp, nonce};
Arrays.sort(wxStrArr);
//进行sha1加密
String wxString = wxStrArr[0]+wxStrArr[1]+wxStrArr[2];
String wxSha1 = sha1(wxString);
//加密后的数据和signature进行对比
return StringUtils.equalsIgnoreCase(wxSha1,signature);
}
private static String sha1(String wxString) {
try {
//获取加密对象
MessageDigest sha1 = MessageDigest.getInstance("sha1");
byte[] digest = sha1.digest(wxString.getBytes());
StringBuilder sb = new StringBuilder();
char[] chars = {
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f};
//处理加密结果
for (byte b : digest) {
sb.append(chars[(b>>4)&15]);
sb.append(chars[b&15]);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
###创建菜单;
(1)抽象的菜单类
public class AbstractButton {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public AbstractButton(String name) {
super();
this.name = name;
}
}
(2)view菜单
public class ViewButton extends AbstractButton {
private String type = "view";
private String url;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public ViewButton(String name, String url) {
super(name);
this.url = url;
}
}
###获取Token
Token的有效时间为2小时,创建一个保存Token值和判断Token是否过期的类;
public class WxAccessToken {
private String accessToken;
private long expiresTime;
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public long getExpiresTime() {
return expiresTime;
}
public void setExpiresTime(long expiresTime) {
this.expiresTime = expiresTime;
}
public WxAccessToken(String accessToken, String expiresIn) {
super();
this.accessToken = accessToken;
expiresTime = System.currentTimeMillis()+Integer.parseInt(expiresIn)*1000;
}
/**
*判断 accessToken是否过期
*/
public boolean isExpires(){
return System.currentTimeMillis()>expiresTime;
}
}
向外暴露 获取Token方法
/**
*向外暴露 获取Token方法
*
*/
public String getAccessToken(){
if (wxAccessToken == null || wxAccessToken.isExpires()){
getToken();
}
return wxAccessToken.getAccessToken();
}
//1,推送消息
JSONObject templateMessage = disposeTemInfo("用户的openId");
//3,如果是正式版发送模版消息,这里需要配置你的信息
JSONObject msgJsonObject = disposePushInfoList();
JSONObject jsonObject = JSONObject.fromObject(templateMessage);
jsonObject.put("data",msgJsonObject);
//发起推送
try {
sendTemplateMsg(jsonObject);
System.out.println("推送成功");
} catch (Exception e) {
System.out.println("推送失败:" + e.getMessage());
e.printStackTrace();
}
