文章目录
1、微信接入中填写的服务器配置主要包含哪些参数,各个参数作用
服务器地址(URL):开发者用来接收微信消息和事件的接口URL。
Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
2、微信接入过程中如何判断请求是来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
@GetMapping("/hello")
@ResponseBody
public String hello(HttpServletRequest request, HttpServletResponse response) throws IOException {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
//接入校验signature, timestamp, nonce
boolean check = weXinService.check(signature, timestamp, nonce);
if(check){
//原样返回echostr参数
PrintWriter out = response.getWriter();
out.print(echostr);
out.flush();
out.close();
}else {
System.out.println("接入失败");
}
return null;
}
@Override
public boolean check(String signature,String timestamp,String nonce) {
//1)将token、timestamp、nonce三个参数进行字典序排序
String[] strs = new String[]{
TOKEN,timestamp,nonce};
Arrays.sort(strs);
//2)将三个参数字符串拼接成一个字符串进行sha1加密
String str = strs[0]+strs[1]+strs[2];
String sha1 = sha1(str);
System.out.println(sha1);
System.out.println(signature);
//3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
return sha1.equalsIgnoreCase(signature);
}
//sha1 加密算法
private static String sha1(String str){
try {
//获取一个加密对象
MessageDigest md = MessageDigest.getInstance("sha1");
//加密
byte[] digest = md.digest(str.getBytes());
char[] chars = {
'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
StringBuilder sb = new StringBuilder();
//处理加密结果
for(byte b:digest){
sb.append(chars[(b>>4)&15]);
sb.append(chars[b&15]);
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
3、调用微信服务器接口时accesstoken是根据什么获取的,有效时间是多长,是如何保证accesstoken不被非法获取的。
公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。
接口调用请求说明
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。
我们知道,HTTP请求都是明文传输的,所谓的明文指的是没有经过加密的信息,如果HTTP请求被黑客拦截,并且里面含有银行卡密码等敏感数据的话,会非常危险。为了解决这个问题,Netscape 公司制定了HTTPS协议,HTTPS可以将数据加密传输,也就是传输的是密文,即便黑客在传输过程中拦截到数据也无法破译,这就保证了网络通信的安全。
HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。
4、应用中accesstoken一般是需要缓存的,为什么?如果主动刷新accesstoken时,服务器缓存正好为脏数据,接口还能正常调用吗?
access_token,是微信开发者调用微信所提供的各种接口的一个凭证,有效时间为7200秒,也就是两个小时,而且一个公众号每天获取它的次数微信那边是有限制的,上限是2000次。频繁的调用会造成服务器压力。效率低。
脏数据:从目标中取出的数据已经过期、错误或者没有意义,这种数据就叫做脏数据。
脏读:读取出来脏数据就叫脏读。
目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;
5、简述微信页面授权过程,页面授权作用是什么?
第一步:用户同意授权,获取code
引导关注者打开如下页面获取code:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
第二步:通过code换取网页授权access_token
第三步:刷新access_token(如果需要)
第四步:拉取用户信息(需scope为 snsapi_userinfo)
作用:可以拿到用户的信息。
6、jsapi_ticket的作用是什么?
调用微信内网页调用微信原生功能的JS-SDK接口须使用的签名票据,详情见:JS-SDK部分
jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
7、举例几个jssdk可实现的功能
官方文档
基本类
举报: “menuItem:exposeArticle”
调整字体: “menuItem:setFont”
日间模式: “menuItem:dayMode”
夜间模式: “menuItem:nightMode”
刷新: “menuItem:refresh”
查看公众号(已添加): “menuItem:profile”
查看公众号(未添加): “menuItem:addContact”
传播类
发送给朋友: “menuItem:share:appMessage”
分享到朋友圈: “menuItem:share:timeline”
分享到QQ: “menuItem:share:qq”
分享到Weibo: “menuItem:share:weiboApp”
收藏: “menuItem:favorite”
分享到FB: “menuItem:share:facebook”
分享到 QQ 空间 “menuItem:share:QZone”
保护类
编辑标签: “menuItem:editTag”
删除: “menuItem:delete”
复制链接: “menuItem:copyUrl”
原网页: “menuItem:originPage”
阅读模式: “menuItem:readMode”
在QQ浏览器中打开: “menuItem:openWithQQBrowser”
在Safari中打开: “menuItem:openWithSafari”
邮件: “menuItem:share:email”
一些特殊公众号: “menuItem:share:brand”
8、微信公众平台中网页授权域名和JS接口安全域名是什么作用
所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。