新手小编

本人已入坑2年也是通过在哈尔滨图灵云培训学习的Java,且年龄也比较大的码农

目前在北京也是刚刚才接触微信公众号的网页开发所得经验进行跟大家分享

因为代码写的少大多都是无用的重复代码,请大家勿喷

我刚开始做不需要unionid 所有需要 unionid 的小伙伴请自己直接set获取即可

首先是微信公众号的官方开发文档

https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

首先需要一张能接收微信字段的表和一张自己用户的信息表

/*** 王丹老师* weixin->15104585927*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("XXX")
@ApiModel(value="XXX对象", description="微信用户")
public class OmsWeixinUserInfo {/*** Database Column Remarks:*   用户的标识** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_weixin_user_info.openid** @mbg.generated*/@TableId(value = "openid")private String openid;/*** Database Column Remarks:*   昵称** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.nickname** @mbg.generated*/@ApiModelProperty(value = "昵称")private String nickname;/*** Database Column Remarks:*   用户的性别(1是男性,2是女性,0是未知)** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.sex** @mbg.generated*/@ApiModelProperty(value = "用户的性别(1是男性,2是女性,0是未知)")private Short sex;/*** Database Column Remarks:*   用户所在国家** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.country** @mbg.generated*/@ApiModelProperty(value = "用户所在国家")private String country;/*** Database Column Remarks:*   用户所在省份** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.province** @mbg.generated*/@ApiModelProperty(value = "用户所在省份")private String province;/*** Database Column Remarks:*   用户所在城市** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.city** @mbg.generated*/@ApiModelProperty(value = "用户所在城市")private String city;/*** Database Column Remarks:*   用户头像** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.headImgUrl** @mbg.generated*/@ApiModelProperty(value = "用户头像")private String headimgurl;/*** Database Column Remarks:*   状态 -1.删除, 1.启用, 2.停用** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.status** @mbg.generated*/@ApiModelProperty(value = "状态 -1.删除, 1.启用, 2.停用")private Short status;/*** Database Column Remarks:*   创建人** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.create_user** @mbg.generated*/@ApiModelProperty(value = "创建人")private String createUser;/*** Database Column Remarks:*   创建时间** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.create_time** @mbg.generated*/@ApiModelProperty(value = "创建时间")private Date createTime;/*** Database Column Remarks:*   修改人** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.update_user** @mbg.generated*/@ApiModelProperty(value = "修改人")private String updateUser;/*** Database Column Remarks:*   修改时间** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.update_time** @mbg.generated*/@ApiModelProperty(value = "修改时间")private Date updateTime;}

自己的用户表

/*** 王丹老师* weixin->15104585927*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("XXX")
@ApiModel(value="XXX对象", description="用户表")
public class OmsUser {private static final long serialVersionUID = 1L;/*** Database Column Remarks:*   人员信息id** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.id** @mbg.generated*/@TableId(value = "id", type = IdType.AUTO)private Integer id;/*** Database Column Remarks:*   手机号** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.phone** @mbg.generated*/@ApiModelProperty(value = "手机号")private String phone;/*** Database Column Remarks:*   姓名** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.name** @mbg.generated*/@ApiModelProperty(value = "姓名")private String name;/*** Database Column Remarks:*   邮箱** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.email** @mbg.generated*/@ApiModelProperty(value = "邮箱")private String email;/*** Database Column Remarks:*   生日** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.birthday** @mbg.generated*/@ApiModelProperty(value = "生日")private Date birthday;/*** Database Column Remarks:*   1.身份证,2.护照,3.港澳通行证** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.id_type** @mbg.generated*/@ApiModelProperty(value = "证件类型 1.身份证,2.护照,3.港澳通行证")private Short idType;/*** Database Column Remarks:*   证件号码** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.id_number** @mbg.generated*/@ApiModelProperty(value = "证件号码")private String idNumber;/*** Database Column Remarks:*   推荐二维码路径** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.recommend_code_path** @mbg.generated*/@ApiModelProperty(value = "推荐二维码路径")private String recommendCodePath;/*** Database Column Remarks:*   所属上级** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.pid** @mbg.generated*/@ApiModelProperty(value = "所属上级")private Integer pid;/*** Database Column Remarks:*   用户的标识** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.openid** @mbg.generated*/@ApiModelProperty(value = "用户的标识")private String openid;/*** Database Column Remarks:*   昵称** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.nickname** @mbg.generated*/@ApiModelProperty(value = "昵称")private String nickname;/*** Database Column Remarks:*   用户的性别(1是男性,2是女性,0是未知)** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.sex** @mbg.generated*/@ApiModelProperty(value = "用户的性别(1是男性,2是女性,0是未知)")private Short sex;/*** Database Column Remarks:*   用户所在国家** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.country** @mbg.generated*/@ApiModelProperty(value = "用户所在国家")private String country;/*** Database Column Remarks:*   用户所在省份** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.province** @mbg.generated*/@ApiModelProperty(value = "用户所在省份")private String province;/*** Database Column Remarks:*   用户所在城市** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.city** @mbg.generated*/@ApiModelProperty(value = "用户所在城市")private String city;/*** Database Column Remarks:*   用户头像** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.headImgUrl** @mbg.generated*/@ApiModelProperty(value = "用户头像")private String headimgurl;/*** Database Column Remarks:*   状态 -1.删除, 1.启用, 2.停用** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.status** @mbg.generated*/@ApiModelProperty(value = "状态 -1.删除, 1.启用, 2.停用")private Short status;/*** Database Column Remarks:*   创建人** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.create_user** @mbg.generated*/@ApiModelProperty(value = "创建人")private String createUser;/*** Database Column Remarks:*   创建时间** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.create_time** @mbg.generated*/@ApiModelProperty(value = "创建时间")private Date createTime;/*** Database Column Remarks:*   修改人** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.update_user** @mbg.generated*/@ApiModelProperty(value = "修改人")private String updateUser;/*** Database Column Remarks:*   修改时间** This field was generated by MyBatis Generator.* This field corresponds to the database column oms_user.update_time** @mbg.generated*/@ApiModelProperty(value = "修改时间")private Date updateTime;}

工具类 把返回的结果转成为JSON对象

public class OmsJSONUtil {public static JSONObject doGetJson(String url) throws Exception {JSONObject jsonObject = null;DefaultHttpClient client = new DefaultHttpClient();HttpGet httpGet =new HttpGet(url);HttpResponse response = client.execute(httpGet);HttpEntity entity =response.getEntity();if(entity != null){//把返回的结果转换为JSON对象String result = EntityUtils.toString(entity, "UTF-8");jsonObject = JSON.parseObject(result);}return jsonObject;}
}

首先就是Controller层 本身是暴露接口不做处理

/*** 在哈尔滨有小伙伴感兴趣想从事码农工作也可以咨询一下** 【咨询顾问】王丹老师* 【电话|微信】15104585927*/
@RestController
@RequestMapping("/XXX")
@Api(tags = {"XXX"})
@Slf4j
public class OmsMPController {/* 微信用户Service */@Resourceprivate IOmsWeixinUserInfoSerivce omsWeixinUserInfoService;/*** 公众号微信登录授权同意之后回调地址** @param code* @throws Exception* @return* @author ZhaoChao* @date 2023/6/16*/@ApiOperation("公众号微信登录授权同意之后回调地址")@ApiOperationSupport(order = 1)@GetMapping("/XXXX")public ResponseUtil <String> callBack(@Valid @ApiParam("code") String code,@ApiParam("非必填") @Nullable Integer pid) throws Exception {if (StringUtils.isBlank(code)) {//用的枚举,可以写成字符串"缺少必要参数"return ResponseUtil.fail(Constants.NOT_FOUND_DATA);}return ResponseUtil.success(omsWeixinUserInfoService.callBack(code,pid));}
}

Service接口层

/*** 微信用户Service接口** @author ZhaoChao* @date 2023/6/16*/
public interface IOmsWeixinUserInfoSerivce extends IService<OmsWeixinUserInfo> {/*** 公众号微信登录授权同意之后回调地址** @param code* @param pid* @throws Exception* @return* @author ZhaoChao* @date 2023/6/16*/String callBack(String code,Integer pid) throws Exception;
}

实现类

通过code换取网页授权access_token

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

请求方法

获取code后,请求以下链接获取access_token:

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

返回说明

正确时返回的JSON数据包如下:

{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE","is_snapshotuser": 1,"unionid": "UNIONID"
}

拉取用户信息(需scope为 snsapi_userinfo)

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

请求方法

http:GET(请使用https协议):

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

返回说明

正确时返回的JSON数据包如下:

{   "openid": "OPENID","nickname": NICKNAME,"sex": 1,"province":"PROVINCE","city":"CITY","country":"COUNTRY","headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

开上代码 app_id 和 app_secret 根据你自己的填写就行

@Service
@Slf4j
public class OmsWeixinUserInfoSerivceImpl extends ServiceImpl<OmsWeixinUserInfoMapper , OmsWeixinUserInfo> implements IOmsWeixinUserInfoSerivce {/* 公众账号appid,首先申请与之配套的公众账号 */private static final String app_id = "";/* 公众号secret,用户获取用户授权token */private static final String app_secret = "";/* 用户Service */@Resourceprivate IOmsUserService omsUserService;/* 微信用户Service */@Resourceprivate IOmsWeixinUserInfoSerivce omsWeixinUserInfoService;@Resourceprivate HttpServletRequest request;@Transactional(rollbackFor = Exception.class)@Overridepublic String callBack(String code, Integer pid) throws Exception {//通过code换取网页授权access_tokenString url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ app_id+ "&secret="+ app_secret+ "&code="+ code+ "&grant_type=authorization_code";JSONObject jsonObject = OmsJSONUtil.doGetJson(url);String openid = jsonObject.getString("openid");if (StringUtils.isBlank(openid)) {//直接返回错误信息log.error("openid为null");return Constants.NOT_FOUND_DATA;}String access_token = jsonObject.getString("access_token");String refresh_token = jsonObject.getString("refresh_token");// 拉取用户信息(需scope为 snsapi_userinfo)String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+ "&openid="+openid+ "&lang=zh_CN";JSONObject userInfo = OmsJSONUtil.doGetJson(infoUrl);//openid == null 时  当获取的用户信息存在库里if (userInfo != null) {//根据openid去库里查有没有OmsWeixinUserInfo weixinUserInfoOpenid = omsWeixinUserInfoService.listOpenid(openid);//openid != null 时 说明表里有此用户  判断此用户信息是否一致 如果不同就修改 没有数据就新增  如果一致就不操作if (weixinUserInfoOpenid != null) {//存进微信用户表OmsWeixinUserInfo weixinUserInfo = new OmsWeixinUserInfo();// 用户的标识weixinUserInfo.setOpenid(openid);// 昵称weixinUserInfo.setNickname(userInfo.getString("nickname"));// 用户的性别(1是男性,2是女性,0是未知)weixinUserInfo.setSex(userInfo.getShort("sex"));// 用户所在国家weixinUserInfo.setCountry(userInfo.getString("country"));// 用户所在省份weixinUserInfo.setProvince(userInfo.getString("province"));// 用户所在城市weixinUserInfo.setCity(userInfo.getString("city"));// 用户头像weixinUserInfo.setHeadimgurl(userInfo.getString("headimgurl"));weixinUserInfo.setCreateUser("");weixinUserInfo.setCreateTime(new Date());weixinUserInfo.setUpdateUser("");weixinUserInfo.setUpdateTime(new Date());weixinUserInfo.setStatus(CommonOtaStatusEnum.OPEN.getValue());omsWeixinUserInfoService.saveOrUpdate(weixinUserInfo);//存进用户表OmsUser omsUser = new OmsUser();BeanUtils.copyProperties(weixinUserInfo, omsUser);String omsUserOpenid = omsUser.getOpenid();if (omsUserOpenid == null) {log.error("omsUserOpenid 为 null");}//通过openid查idOmsUser omsUserInfo = omsUserService.listById(omsUserOpenid);if (omsUserInfo == null) {log.error("omsUserInfo 为 null");}Integer userId = omsUserInfo.getId();if (userId == null) {omsUser.setName("");omsUser.setPhone("");omsUser.setEmail("");omsUser.setIdType((short) 1);omsUser.setIdNumber("");omsUser.setCreateUser("系统");omsUser.setCreateTime(new Date());omsUser.setStatus(CommonOtaStatusEnum.OPEN.getValue());if (pid != null) {omsUser.setPid(pid);} else {omsUser.setPid(Constants.ZERO);}omsUserService.save(omsUser);} else {omsUser.setId(userId);omsUser.setUpdateUser("系统");omsUser.setUpdateTime(new Date());omsUser.setStatus(CommonOtaStatusEnum.OPEN.getValue());if (pid != null) {omsUser.setPid(pid);}omsUserService.saveOrUpdate(omsUser);}//成功后,返回给前端一个Tokenreturn TokenUtil.cacheToken(omsUser.getId(), LoginEnum.PUBLIC_ACCOUNT_KEY.getValue());} else {//存进微信用户表OmsWeixinUserInfo weixinUserInfo = new OmsWeixinUserInfo();// 用户的标识weixinUserInfo.setOpenid(openid);// 昵称weixinUserInfo.setNickname(userInfo.getString("nickname"));// 用户的性别(1是男性,2是女性,0是未知)weixinUserInfo.setSex(userInfo.getShort("sex"));// 用户所在国家weixinUserInfo.setCountry(userInfo.getString("country"));// 用户所在省份weixinUserInfo.setProvince(userInfo.getString("province"));// 用户所在城市weixinUserInfo.setCity(userInfo.getString("city"));// 用户头像weixinUserInfo.setHeadimgurl(userInfo.getString("headimgurl"));weixinUserInfo.setCreateUser("");weixinUserInfo.setCreateTime(new Date());weixinUserInfo.setStatus(CommonOtaStatusEnum.OPEN.getValue());omsWeixinUserInfoService.save(weixinUserInfo);//存进用户表OmsUser omsUser = new OmsUser();BeanUtils.copyProperties(weixinUserInfo,omsUser);omsUser.setName("");omsUser.setPhone("");omsUser.setEmail("");omsUser.setIdType((short) 1);omsUser.setIdNumber("");omsUser.setCreateUser("");omsUser.setCreateTime(new Date());omsUser.setStatus(CommonOtaStatusEnum.OPEN.getValue());if (pid != null) {omsUser.setPid(pid);} else {omsUser.setPid(Constants.ZERO);}omsUserService.save(omsUser);//成功后,返回给前端一个Tokenreturn TokenUtil.cacheToken(omsUser.getId(), LoginEnum.PUBLIC_ACCOUNT_KEY.getValue());}}//失败返回错误信息return Constants.NOT_FOUND_DATA;}
}

我们来测试一下

成功了 返回了一条Token给前端

看一下数据库微信表

用户表

小白专用微信公众号网页授权通过code获取用户信息相关推荐

  1. 微信公众号网页授权--前端获取code及用户信息(vue)

    前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路. 一.测试号相关配置 首先在你公司申请的测试号上配置好相关信息 ...

  2. 微信公众号网页授权--前端获取code及用户信息(vue)【简单详细版】

    嗨喽大家好,前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的遇到的一些问题的见解,希望对你们有帮助. 一.测试号相关配置 首 ...

  3. 微信公众号网页授权思路解析及具体代码

    微信公众号网页授权思路解析及具体代码 微信开发文档 实现方式也是两种: 1.静默授权登录 授权登录以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静 ...

  4. 微信公众号网页授权,获取用户信息以及openid -- PHP后台

    微信公众号网页授权,获取用户信息以及openid 这几天做项目,想通过公众号的appid获取用户的openid就,然后在网上查资料,问朋友,最后找到了方法,就是这个网页授权. 起初一直很蒙,这个怎么弄 ...

  5. 微信公众号网页授权时序图

    微信公众号网页授权时序图 公众号网页授权时序图

  6. 微信公众号网页授权登录的超简单实现步骤

    微信开放平台为第三方移动程序提供分享.传播的接口, 使用户可将第三方程序的内容发布给好友或分享至朋友圈, 下面这篇文章主要给大家介绍了关于微信公众号网页授权登录的超简单实现方法, 需要的朋友可以参考下 ...

  7. 微信公众号网页授权40163问题【php】

    微信公众号网页授权40163问题 tp5为例,emmmm-一直报40163或40029问题,翻遍了各大网站都没找到合适我的办法. 如图: 解决之后如图: 因为重定向所以请求了两次code,所以一直报4 ...

  8. 微信公众号网页授权代码优化过程(一)

    2019独角兽企业重金招聘Python工程师标准>>> 第一次更新 写本系列博客的主要原因是,我在处理一个微信公众号项目时要做一个网页授权的操作(官方地址是https://mp.we ...

  9. php微信授权没有code返回,解决关于微信公众号网页授权获取code参数的问题

    解决关于微信公众号网页授权获取code参数的问题 发布时间:2018-07-24 23:21, 浏览次数:3327 , 标签: code * 在微信网页授权过程中,需要获取code参数,因为我用的是公 ...

最新文章

  1. php controller 间调用,php – 在CodeIgniter中的另一个Controller中调用Controller函数
  2. linux之sed用法
  3. Install Mysql with SELinux on
  4. 【机器学习】HOG detectMultiScale 参数分析
  5. Strut2的属性驱动,模型驱动的理解
  6. 增加第三方插件_AE插件排行!!
  7. leetcode 692. 前K个高频单词
  8. mssql与oracle不同点,MySql,Mssql,Oracle的优缺点和异同(欢迎补充) *
  9. #化鲲为鹏,我有话说# 鲲鹏弹性云服务器配置 Tomcat
  10. 华为云微服务应用平台服务能力业界领先,通过微服务标准首批评估
  11. bcp大容量复制实用工具_运行中的BCP(大容量复制程序)命令
  12. Codeforces Round #511 (Div. 1) 题解
  13. 人生就是一个领域,一份爱,一杯茶
  14. opencv: 颜色通道 探究(图示+源码)
  15. 自定义绘制三阶B样条曲线
  16. JVM面试题(含答案和图和解释)
  17. RK3328_LPDDR3D178P132SD4_Template_V11_20170726,RK3328模块原理图和PCB
  18. uni-app接入友盟
  19. 2021程序员必看面试指南-进大厂年薪百万需要付出多少努力?你看看你们配吗......
  20. dockers 项目部署

热门文章

  1. 美化Windows 字体
  2. 【spring-boot-雷神】4、开发小技巧(2021-10-29
  3. 【认证】赢在国家软考-中高级考前培训大纲-讲师团俊平老师主讲
  4. Jquery 图片轮播实现原理总结
  5. 如何使用Hexo搭建属于自己的博客
  6. 我的世界java版mod怎么安装_我的世界中国版MOD安装教程 我的世界中国版MOD怎么安装...
  7. 如何在交换机上查找计算机,通过交换机在局域网中查找病毒攻击的方法
  8. GridBagConstraints 参数解释
  9. 六级(2021/6-1) Text1
  10. 【新书推荐】民异鬼事录