微信公众号开发需要很多前期需要准备的东西,如一台服务器,以及对应的域名、备案等问题。在完成这一切之后,开始准备微信公众号的开发。
首先,需要进行微信开发者验证。填写完页面上的服务器配置项。
url为在服务器上对应的接口,微信接入只支持80端口和443端口,此时可以使用nginx将服务反向代理到这些端口。Token是一个固定的字符串,这个字符串是在接下来的字典排序中所用到的。EncodingAESKey是一个密钥。使用这个密钥可以使用AES算法将微信服务器传给自己的服务器的消息进行解密。
写接口这一步比较简单,通过实现一个接口,将nonce、timestamp、Token进行字典排序并完成SHA1哈希加密算法后与服务器端signature相同,此时原样返回加密字符串echostr。
public String validate(String signature,String timestamp,String nonce,String echostr){
logger.info("获取到的signature:"+signature);
logger.info("获取到的timestamp:"+timestamp);
logger.info("获取到的nonce:"+nonce);
logger.info("获取到的echoStr:"+echostr);
logger.info("获取到的token:"+token);
//1. 将token、timestamp、nonce三个参数进行字典序排序
String[] arr = {timestamp,nonce,token};
Arrays.sort(arr);
//2. 将三个参数字符串拼接成一个字符串进行sha1加密
StringBuilder sb = new StringBuilder();
for (String temp : arr) {
sb.append(temp);
}
Log log = new Log();
//3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
try {
String sign = SHA1Utils.getSha(sb.toString());
logger.info("自己生产的sign:"+sign);
if(sign.equals(signature)){
//接入成功
log.setLogContent("接入微信接口成功");
log.setType("access_verification");
logger.info("接入微信接口成功");
return echostr;
}
} catch (Exception e) {
logger.error("接入失败",e);
}
//接入失败
return null;
}
其中,signature为服务器加密之后的哈希串,timestamp为服务器进行哈希加密时的时间戳,nonce为一个最长10位的随机数,echostr为加密字符串。
此处的Token与accessToken不同。
实现加密算法后,可以获得微信公众平台颁发的appId和APPSecret。APPSecret只展示一次,如果忘记,只能进行重置操作,比较繁琐。建议加到服务的配置文件中。此外,还需要配置accessToken白名单。只能使用该白名单的IP来获取accessToken。如果白名单为空,则无法获取accessToken。
获取accessToken时,使用GET方法请求接口,如下所示:
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
获取到的返回值如下所示:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
accessToken即为token值,expires_in为accessToken的过期时间。accessToken每天只能获取2000次,每次获取的token在7200秒内均可使用。所以,为了避免频繁调用accessToken,将token值存入redis中,设置对应的7200秒过期。如果redis中的token过期,再调用接口获取accessToekn。
可能您还想看