因为认证问题,所以就先用测试账号,点击开发者工具,进入公众平台测试帐号
域名验证:
1.服务器验证,修改接口配置信息:
注意,接口配置信息中,url为你服务器下验证token合法所在的地址的绝对路径,此处为hello/start在服务器下的绝对路径,token为一个约定的钥匙,服务器验证时,微信会用token加密一段字符串,它会把加密字符串用到的其它参数发送到服务器,用服务器定义的token进行加密并拿到结果,随后它会对比两次结果,如果相同则通过验证,所以微信后台的token和服务器上token必须一致,用相同加密方法加密后才能得到相同结果。
验证方法如下:方法为GET
@RequestMapping(value="Start",method=RequestMethod.GET)
public void start(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("开始签名校验");
//得到服务器传过来的4个参数
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
ArrayList<String> array = new ArrayList<String>();
array.add(signature);
array.add(timestamp);
array.add(nonce);
// 1.将token、timestamp、nonce三个参数进行字典序排序
String sortString = sort(token, timestamp, nonce);
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
String mytoken = Decript.SHA1(sortString);
// 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信
if (mytoken != null && mytoken != "" && mytoken.equals(signature)) {
System.out.println("签名校验通过。");
response.getWriter().println(echostr); //如果检验成功输出echostr,微信服务器接收到此输出,才会确认检验完成。
} else {
System.out.println("签名校验失败。");
}
}
sort方法:
/**
* 排序方法
* @param token
* @param timestamp
* @param nonce
* @return
*/
public static String sort(String token, String timestamp, String nonce) {
String[] strArray = { token, timestamp, nonce };
Arrays.sort(strArray);
StringBuilder sbuilder = new StringBuilder();
for (String str : strArray) {
sbuilder.append(str);
}
return sbuilder.toString();
}
SHA1加密
/**
*
* @param decript待加密字段
* @return
*/
public static String SHA1(String decript) {
try {
MessageDigest digest = MessageDigest
.getInstance("SHA-1");
digest.update(decript.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
与微信服务器上利用token生成的字符串相同后,则通过验证。
自定义菜单:
利用在线接口调试工具可以直接生成:
首先用公众号账号密码拿到一个基础token,拿到基础接口的一个调用凭证,用于创建菜单,然后自定义菜单
body示例如下:
{
"button":[
{
"type":"view",
"name":"一键申请",
"url":"http://Scanhandle?Page=1"
},
{
"type":"view",
"name":"进度查询",
"url":"http://Scanhandle?Page=2"
},
{
"type":"view",
"name":"个人中心",
"url":"http://Scanhandle?Page=3"
}]
}
还可以生成子菜单,自行查阅官方文档。
消息推送:
在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,此处为验证签名的地址,hello/start在服务器下的绝对路径,方法为POST:,因为消息要符合微信推送XML数据包结构比如:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></