复源码(文章结尾)

目录

申请公众号测试号与设置

各配置解释

接口配置信息

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开发微信公众号相关推荐

  1. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  2. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  3. Java开发微信公众号之被动回复用户消息-回复图片消息

    一.前言 hello小伙伴们,大家好,做微信开发两年了,最近看到微信方面的文章阅读量和关注量上升的比较快速,激发了我满满的动力啊,所以就滋生了一个想法,从头开始整理一下微信公众号开发,写一个简易的教程 ...

  4. java开发微信公众号支付

    这篇文章主要给大家结合微信支付接口开发的实践,从获取用户授权到各主要接口的使用方法等方面介绍微信支付的关键点技术,有需要的小伙伴可以参考下 最近做了微信公众号支付的开发,由于是第一次做也摸索了几天的时 ...

  5. Java开发微信公众号之整合weixin-java-tools框架开发微信公众号

    微信开发者接入文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 微信公众平台测试账号申请: http ...

  6. java开发微信公众号(SpringMVC)2-消息管理功能

    微信移动端软件,可以向公众号发送消息,如文字,语音,图片等等,在这个过程中,微信端服务器首先要接受到你发送的消息,然后根据你发送的消息会产生不同的回应. 这个回应要想自己设定内容(微信公众号管理界面可 ...

  7. java开发微信公众号:微信公众号对接

    一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击"修改配置"按钮,填写服务器地址(URL).Tok ...

  8. java开发微信公众号(SpringMVC)1-简述

    很久之前就想了解并真正着手去做微信公众号的开发,在这一个多月终于有时间去看微信的开发文档,并利用自己的熟悉语言java去做这方面的一些东西. 要想真正去了解微信公众号的提供的接口的功能,开发文档虽然写 ...

  9. java开发微信公众号接受并回复消息[工程代码+图片全解]

    写这篇博客时犹豫了好久,因为步骤太多了,上班了也没时间,但是我依然记得当时实现公众号自动回复时的场景,找个案例好 难,也没有一个完整的案例,想了想还是写出来吧,希望能让实现这功能的人少走弯路. 微信公 ...

  10. 用java开发微信公众号:测试公众号与本地测试环境搭建(一)

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...

最新文章

  1. 大数据笔记2019.5.11
  2. 模型可解释性-树结构可视化
  3. 【转载】企业级服务器设计与实现经验之插件系统基础篇
  4. docwizard c++程序文档自动生成工具_工具用的好,老师下班早!老师的高效办公利器都在这!...
  5. Java Hashtable get()方法与示例
  6. 互联网分布式微服务云平台规划分析--SSO单点登录系统
  7. python爬虫案例——百度贴吧数据采集
  8. 机器学习入门——线性回归详细分析
  9. 解决西门子Step 7 basic 找不到许可证问题
  10. 【前端第七课】媒体查询的语法;移动端适配相关知识点;Grid高级布局
  11. java二重积分_java 版本二重积分计算
  12. html 转盘抽奖开发,html 大转盘抽奖
  13. 帝国cms7.2自定义列表建立tag效果 代码 教程
  14. 医疗常用信息化系统介绍
  15. 光电耦合器简单介绍以及作用
  16. Mac键盘符号说明(全)
  17. 但行好事 莫问前程 学习笔记
  18. Android 6.0/7.0权限
  19. 100句充满智慧的人生格言
  20. 计量经济学(九)---格兰杰因果关系检验

热门文章

  1. 正确使用计算机键盘的方法是,电脑键盘指法练习及图示
  2. 百度文库收费文档下载方法
  3. 临渊慕鱼,不如退而结网!
  4. Word文档编号工具,Word标题,图、表手动编号工具
  5. 计算机旅游网站毕业论文,旅游网站的设计与实现(毕业论文)
  6. android wps页面设置,WPS中设置纸张的方法
  7. book118可预览文档下载
  8. 金蝶K3工程变更操作指南
  9. Windows下修改hosts文件
  10. fluent设置uds c语言程序,Fluent中UDF和UDS二次开发高级实例专题