1.申请一个“微信公众平台服务号”;
2.开发者模式 - 配置服务器(微信公众平台里面的配置)
我们需要配置三个值:服务器地址(接收消息的地址)、自定义token、消息加密方式(可选择明文或者密文),暂时地址只支持80端口,其他端口接收不到消息哦。
在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数signature、timestamp、nonce、echostr(开发者配置的token与timestamp与nonce字典排序后进行sha1加密后的字符串签名、时间戳、随机数、随机字符串),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。此后,每次开发者接收用户消息的时候,微信也都会带上这四个参数访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。
get请求校验请求是否来自微信的方法是:
a. 将token、timestamp、nonce三个参数进行字典排序
b. 将三个参数字符串拼接成一个字符串进行sha1加密
c. 开发者获得加密后的字符串可与signature对比,若相等,原样返回echostr给微信,若不等,此次请求非微信请求,什么也不做。
java后台配置服务器的代码如下:
“`
public class CheckUtil {
// 与接口配置信息中的Token要一致
private static String token = “*******”;
/*验证签名 /
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
// Arrays.sort(arr);
sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
String tmpStr = null;
try {
MessageDigest md = MessageDigest.getInstance(“SHA-1”);
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/*** 将字节数组转换为十六进制字符串*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串*/private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}public static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}}}
`/**
* 微信公众平台,基本配置 - 服务器配置 调用
*/
@Controller
@RequestMapping(“/wechat”)
public class wechat {
//微信消息接收和token验证
@RequestMapping(value=”/ownerCheck”,method = RequestMethod.GET)
public void ownerCheck(HttpServletRequest request, HttpServletResponse response) throws IOException {
boolean isGet = request.getMethod().toLowerCase().equals(“get”);
PrintWriter print;
if (isGet) {
// 微信加密签名
String signature = request.getParameter(“signature”);
// 时间戳
String timestamp = request.getParameter(“timestamp”);
// 随机数
String nonce = request.getParameter(“nonce”);
// 随机字符串
String echostr = request.getParameter(“echostr”);
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (signature != null && CheckUtil.checkSignature(signature, timestamp, nonce)) {
try {
print = response.getWriter();
print.write(echostr);
print.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.服务器配置完成之后界面
4.申请一个微信”开放平台”账号;
5.在微信“开放平台”绑定“公众平台服务号”
每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID,可以在用户管理-获取用户基本信息(UnionID机制)文档了解详情
6.设置公众号-网页授权域名
【注: 如果是自己电脑的内网,可以申请一个花生壳账号,绑定一个域名,内网穿透:
端口必须是80端口】
将文件MP_verify_N8no8dpNO9n7wuBZ.txt(点击下载)上传至填写域名或路径指向的web服务器(或虚拟主机)的目录(若填写域名,将文件放置在域名根目录下,例如wx.qq.com/MP_verify_N8no8dpNO9n7wuBZ.txt;若填写路径,将文件放置在路径目录下,例如wx.qq.com/mp/MP_verify_N8no8dpNO9n7wuBZ.txt),并确保可以访问。
然后我上传到tomcat 下的webapp下
在h5-web.xml里面配置,配置这句之后,静态资源直接访问
7.以上外部环境配置完成之后
“` 前端页面判定
window.οnlοad=function(){
if(is_weixin()){
// 是微信,跳转微信登陆
(“#weixinLogin”).click(function () {
window.location.href=’{rc.contextPath}/h5/weixin/login/index.html’;
});
}else{
//跳转到微信浏览器
$(“#weixinLogin”).click(function () {
window.location.href=’http://weixin.qq.com/r/ykzexmzEPzFArSil9xnY‘;
});
}
}