微信公众号学习

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接口安全域名”。

猜你喜欢

转载自blog.csdn.net/Crush_kylin/article/details/115689500