Java开发微信公众号
2021/11/22 20:12:34
本文主要是介绍Java开发微信公众号,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
复源码(文章结尾)
目录
申请公众号测试号与设置
各配置解释
接口配置信息
JS接口安全域名
测试号二维码
模板消息接口
如何获取用户的openid
获取网页授权用户基本信息解释
域名
参数scope
UnionID
代码获取openId、scope=snsapi_base
第一步:先获取code
第二步:通过code换取access_token(鉴权token)
第三步:通过openid 获取用户个人信息
代码获取openId、scope=snsapi_userinfo
太多了,直接贴代码
两个access_token的不同
采坑说明
说两句废话
前言:工作中需要用到开发公众号,第一次摸索,记一下笔记,避免以后忘干净;
申请公众号测试号与设置
微信提供了测试开发平台给开发者,开发者可以申请测试号来进行申请;刚开始开发的时候,我还申请了一个公众号,现在发现根本没有必要,虽然在开发中,也可以在自己的公众号中进行设置,也可以开发,但是毕竟也走了一些弯路,而且很多高级接口需要权限才能调用,或者有次数限制,不推荐;申请的测试号如下图
其中:appID、appsecret这两个信息,是你公众号的标识;调用接口的时候知道带上就行
各配置解释
-
接口配置信息
刚开始开发,就傻乎乎的配置了一通,也成功了,但是在后面的开发中,发现这玩意配置不配置无所谓,一样能调用微信的接口,比如创建公众号菜单等;可能是我太菜鸡?
其实反复查看微信文档说的,这个接口配置是这个意思,一下是微信官方文档原话;“开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。”
一句话描述就是,微信调我们的接口的时候需要用到;这就懂了,艹皿艹 ;所以我们项目中还没有用到(尴尬);
源码位置(com.wechat.demo.wxcontroller.WeChatController#wechat)
-
JS接口安全域名
就是,你可以设置一个域名(反正不可能支持ip地址调用),直接调用微信的JS接口;关于域名,可以使用ngrok做映射,就不啰嗦;
-
测试号二维码
微信提供的测试公众号,使用手机微信扫码关注就行,可以实时看到自己开发的咋样;
-
模板消息接口
没用过,不清楚,等我用过之后,再来完善文章;
-
体验接口权限表
这些列表就是微信提供的所有接口了;按照说明文档开发就行; 比较重要的是下图中的 网页授权获取用户信息 这个接口;
点击修改的时候,会展示下图;意思是,用户同意授权之后,微信会调用咱们写的页面,或者是接口。把code专递过来,然后我们自己再通过code换取access_token;
如何获取用户的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)
登录的连接如下
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
觉得还不错的话,点个赞吧;奥利给、、、、、、、、、、、、
这篇关于Java开发微信公众号的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器
- 2024-11-26Java云原生资料:新手入门教程与实战指南
- 2024-11-26JAVA云原生资料入门教程
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程