Java开发微信公众号

复源码(文章结尾)

目录

申请公众号测试号与设置

 各配置解释

接口配置信息

JS接口安全域名

测试号二维码

模板消息接口

如何获取用户的openid

获取网页授权用户基本信息解释

域名

参数scope

UnionID

代码获取openId、scope=snsapi_base

第一步:先获取code

第二步:通过code换取access_token(鉴权token)

第三步:通过openid 获取用户个人信息

代码获取openId、scope=snsapi_userinfo

太多了,直接贴代码

两个access_token的不同

采坑说明

说两句废话


 

前言:工作中需要用到开发公众号,第一次摸索,记一下笔记,避免以后忘干净;

申请公众号测试号与设置

         微信提供了测试开发平台给开发者,开发者可以申请测试号来进行申请;刚开始开发的时候,我还申请了一个公众号,现在发现根本没有必要,虽然在开发中,也可以在自己的公众号中进行设置,也可以开发,但是毕竟也走了一些弯路,而且很多高级接口需要权限才能调用,或者有次数限制,不推荐;申请的测试号如下图

Java开发微信公众号

 其中:appID、appsecret这两个信息,是你公众号的标识;调用接口的时候知道带上就行

 各配置解释

  • 接口配置信息

Java开发微信公众号

 

刚开始开发,就傻乎乎的配置了一通,也成功了,但是在后面的开发中,发现这玩意配置不配置无所谓,一样能调用微信的接口,比如创建公众号菜单等;可能是我太菜鸡?

其实反复查看微信文档说的,这个接口配置是这个意思,一下是微信官方文档原话;“开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。”

一句话描述就是,微信调我们的接口的时候需要用到;这就懂了,艹皿艹 ;所以我们项目中还没有用到(尴尬);

源码位置(com.wechat.demo.wxcontroller.WeChatController#wechat)

  • JS接口安全域名

Java开发微信公众号

 就是,你可以设置一个域名(反正不可能支持ip地址调用),直接调用微信的JS接口;关于域名,可以使用ngrok做映射,就不啰嗦;

  • 测试号二维码

Java开发微信公众号

 

微信提供的测试公众号,使用手机微信扫码关注就行,可以实时看到自己开发的咋样;

  • 模板消息接口

Java开发微信公众号

没用过,不清楚,等我用过之后,再来完善文章; 

  • 体验接口权限表

Java开发微信公众号

这些列表就是微信提供的所有接口了;按照说明文档开发就行; 比较重要的是下图中的 网页授权获取用户信息 这个接口;

Java开发微信公众号

 

点击修改的时候,会展示下图;意思是,用户同意授权之后,微信会调用咱们写的页面,或者是接口。把code专递过来,然后我们自己再通过code换取access_token;

Java开发微信公众号

 

如何获取用户的openid

在微信公众号开发中,获取关注公众号用户的openid是至关重要的,不然你都分不清谁是谁;点击 “网页授权获取用户基本信息” ,查看文档,按接口调用就行了,不过坑是真滴多;说一说,加强一下记忆吧;

获取网页授权用户基本信息解释

鄙人当时看过这个文档之后,就像说一句话,这啥啊?自己摸索了一周之后,搞明白了;

域名

网页授权获取用户基本信息 :这个修改时,填的是域名,不加 `http://`或者 `https://`的 (艹)

授权回调域名配置规范为全域名 : 意思是 redirect_uri (回调参数) 写的是带http的

参数scope

scope为snsapi_base :可以理解为,只要在微信公众号中,点击可按钮,就可以获取到用户的授权;

scope为snsapi_userinfo:可以理解为,弹出一个页面,让你点同意,才能授权;

UnionID

就是你公司有10个公众号,用户只认证了其中一个,其他公众号关注了之后也可以操作,不用再重复认证;

代码获取openId、scope=snsapi_base

第一步:先获取code

在申请的测试号中让用户点击一个连接登陆,或者点击一个菜单登录也行、如下图;创建菜单和公众号自动回复功能比较简单;太多了,实在是敲不动了;后面有源码,源码位置(com.wechat.demo.wxcontroller.WeChatController#getUserMsg)

Java开发微信公众号

 登录的连接如下

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxef4d3ff57f4ced1f&redirect_uri=http://9e18-222-94-217-138.ngrok.io/getUserInfoBase&response_type=code&scope=snsapi_base&state=123#wechat_redirect

当点击连接的时候,我们就可以获取code了;其中 url 中的 redirect_uri参数的值,回调的是我们自己的接口;这个时候我们可以在接口中获取到code中的值;其中 scope=snsapi_base

上面这个链接,只能在微信中打开,也可以在微信开发者中打开;

第二步:通过code换取access_token(鉴权token)

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

把第一步回调过来的code,放入url中,APPID、SECRET换成你自己的测试号信息就行;其实这一步,接口调用后,不光能获取到access_token;也能获取到openId;哈哈哈;

那获取access_token(鉴权token)有什么用呢?其实是有用的;如果scope为snsapi_userinfo,那么这个access_token(鉴权token)是有用的,下面再说;

其实这个时候就已经拿到openId 了;

第三步:通过openid 获取用户个人信息

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

说明:这个url是 scope为 snsapi_base 的获取个人信息的接口,它的access_token传值传的就是普通的access_token;这样就能获取管住的用户的个人信息了;返回的信息参考微信文档就行;

而下面这个url 

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

这个url 是 scope 为 snsapi_userinfo 的获取个人信息的接口,它的access_token传值传的是网页鉴权token,名字也叫 access_token;而这个access_token(鉴权access_token)怎么传值呢?其实就是上边说的第二步;

操蛋不操蛋?我搞清楚这两个不同,用了好几天,可能我是一个菜鸡啊;

/**
     * getUserInfoBase  通过code交换accessToken ,再通过accessToken获取openId,再通过openId,获取用户信息
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/getUserInfoBase",method = RequestMethod.GET)
    public Object getUserInfoBase(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
        String code = request.getParameter("code");
        System.out.println("code:"+code);

        // 通过code 换取accessToken的地址
        String getAccess_token = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        String replace = getAccess_token.replace("APPID", "wxef4d3ff57f4ced1f").replace("SECRET", "e012bfb1fc0bbebc67324112902a2ca6").replace("CODE", code);
        String s = HttpClientTool.doGet(replace, null);

        System.out.println("获取到的accessToken结果是:" + JSONObject.toJSONString(s));

        Object openid = JSONObject.parseObject(s).get("openid");

        // 获取用户的基本信息 scope为snsapi_base,静默的获取用户的信息
        String getUserInfo_ = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
        // 这个 access_token 是 调用公众号的接口需要传递的token,是普通的token(普通token通过以下url获取 :https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxef4d3ff57f4ced1f&secret=e012bfb1fc0bbebc67324112902a2ca6);
        String replace1 = getUserInfo_.replace("ACCESS_TOKEN", "51_YgCgtz8jCQK1szhYiTXEFzKNKMgMcF-2TE412oL8pqdap_qomREO78Sym8PzvaTtEFoiYd4oayt7J2B-2sS89Sgf4FuUhQCyA1Mj9lfe3LuSdYuSGsNJvkfy9Yk7zxq9U3O1OzZoTIUzinlqGOEaAFAQYO").replace("OPENID", openid.toString());
        String s1 = HttpClientTool.doGet(replace1, null);
        String s2 = JSONObject.toJSONString(s1);

        System.out.println("getUserInfoBase 用户的基本信息是 : " + s2);


        WxUser wxUser1 = JSON.parseObject(s1, WxUser.class);

        model.addAttribute("wxUser",wxUser1);
        return "index";

    }

代码获取openId、scope=snsapi_userinfo

太多了,直接贴代码

/**
     * getUserInfo  通过code交换accessToken ,再通过accessToken获取openId,再通过openId,获取用户信息
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/getUserInfo",method = RequestMethod.GET)
    public void getUserInfo(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String code = request.getParameter("code");
        System.out.println("code:"+code);

        // 通过code 换取accessToken的地址
        String getAccess_token = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        String replace = getAccess_token.replace("APPID", "wxef4d3ff57f4ced1f").replace("SECRET", "e012bfb1fc0bbebc67324112902a2ca6").replace("CODE", code);
        String s = HttpClientTool.doGet(replace, null);

        System.out.println("获取到的accessToken结果是:" + JSONObject.toJSONString(s));

        Object access_token = JSONObject.parseObject(s).get("access_token");
        Object openid = JSONObject.parseObject(s).get("openid");

        // 获取用户的基本信息 需scope为 snsapi_userinfo; 这个 access_token 是 调用用户信息,需要传递的token,是网页鉴权token;
        String getUserInfo_snsAPI_userinfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
        String replace1 = getUserInfo_snsAPI_userinfo.replace("ACCESS_TOKEN", access_token.toString()).replace("OPENID", openid.toString());
        String s1 = HttpClientTool.doGet(replace1, null);
        String s2 = JSONObject.toJSONString(s1);

        System.out.println("用户的基本信息是 : " + s2);

    }

两个access_token的不同

其中一个access_token就是普通的access_token,这个普通的access_token可以让我们调微信的接口,比如创建菜单,查询菜单,删除菜单等;就像我们网页中的登录token一样;

而网页鉴权access_token,是scope为snsapi_userinfo时,调用一面这个url、

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

中的access_token,而这个token是在第二步中获取的;

采坑说明

1、一个code只能使用一次;

2、授权连接只能在微信页面中打开;、

3、redirect_url 配置和后台不一致,认真检查配置就行;

4、vue 中如何获取code,是一个问题,获取之后还要刷新登录页;体验不好,暂时没有什么好的解决办法;

5、两个access_token贼搞笑;

 有空结合前端写个完整的(手动狗头)

说两句废话

文章就说这么多,也不可能说的很清楚;不懂的静下心来慢慢理解就行了;不懂的看B站视频(我也是看的B站视频才会的);还有我自己写的Demo;供大家交流学习;

链接: https://pan.baidu.com/s/1TsEobfHrN7R8PmsOCM65pA

提取码: y8yv 

觉得还不错的话,点个赞吧;奥利给、、、、、、、、、、、、

上一篇:linux的vm.overcommit_memory的内存分配参数详解


下一篇:最小的linux发行版TinyCore Linux 系统,从分区安装系统开始