Step1:微信公众平台注册账号,登录
Step2:在左边栏最底端点击开发者中心,进入配置界面
Step3:修改自己的配置后点击提交,如果在最顶端显示提交成功那么说明就OK了!
Tips1:前提是服务器后台已经可以对微信的接入提供业务处理,不论使用什么框架,根据URL映射到位就好
Tips2: 微信首次接入服务用的是GET方式,接入成功后以后用的都是POST方式
Tips3:微信服务器首次接入时会以get方式传递一个Wechat类型的Model,后台接收该model后获取其中的signature,timestamp,nonce,echostr
Tips4:通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
Tips5:校验时首先将token,timestamp,nonce进行字典排序,然后进行sha1加密得到加密排序后的字符串,与微信服务器传进来的signature比较是否相等
Tips6:关键代码如下:
/**
* 微信验证实体类
*
* @author herosky
*
*/
public class WeChat {
// 包含token的字符串
private String signature;
// 时间戳
private String timestamp;
// 随机数
private String nonce;
// 随机字符串
private String echostr;
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public String getEchostr() {
return echostr;
}
public void setEchostr(String echostr) {
this.echostr = echostr;
}
}
/**
* 微信验证实体类
*
* @author herosky
*
*/
public class WeChat {
// 包含token的字符串
private String signature;
// 时间戳
private String timestamp;
// 随机数
private String nonce;
// 随机字符串
private String echostr;
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public String getEchostr() {
return echostr;
}
public void setEchostr(String echostr) {
this.echostr = echostr;
}
}
public String wechatInterface(WeChat wc) {
String signature = wc.getSignature(); // 微信加密签名
String timestamp = wc.getTimestamp(); // 时间戳
String nonce = wc.getNonce(); // 随机数
String echostr = wc.getEchostr(); // 随机字符串
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
return echostr;
} else{
System.out.println("不是微信服务器发来的请求,请小心!");
return null;
}
}
public String wechatInterface(WeChat wc) {
String signature = wc.getSignature(); // 微信加密签名
String timestamp = wc.getTimestamp(); // 时间戳
String nonce = wc.getNonce(); // 随机数
String echostr = wc.getEchostr(); // 随机字符串
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
return echostr;
} else{
System.out.println("不是微信服务器发来的请求,请小心!");
return null;
}
}
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
System.out.println("加密排序后的字符串:"+tmpStr);
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
System.out.println("加密排序后的字符串:"+tmpStr);
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}