您所在的位置: 首页>关于我们>公司动态>建站知识>微信公众号开发并没有那么难

微信公众号开发并没有那么难

发表于:2019-09-10 阅读:6903 关键词: 微信公众号开发 公众号开发

  微信公众号开发需要很多前期需要准备的东西,如一台服务器,以及对应的域名、备案等问题。在完成这一切之后,开始准备微信公众号的开发。


微信开发前期准备


  首先,需要进行微信开发者验证。填写完页面上的服务器配置项。

微信开发者验证


  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。