100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 小白专用微信公众号网页授权通过code获取用户信息

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

时间:2019-07-12 06:25:01

相关推荐

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

新手小编

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

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

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

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

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

https://developers./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"})@Slf4jpublic class OmsMPController {/* 微信用户Service */@Resourceprivate IOmsWeixinUserInfoSerivce omsWeixinUserInfoService;/*** 公众号微信登录授权同意之后回调地址** @param code* @throws Exception* @return* @author ZhaoChao* @date /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 /6/16*/public interface IOmsWeixinUserInfoSerivce extends IService<OmsWeixinUserInfo> {/*** 公众号微信登录授权同意之后回调地址** @param code* @param pid* @throws Exception* @return* @author ZhaoChao* @date /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./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./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":"/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","privilege":[ "PRIVILEGE1" "PRIVILEGE2"],"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}

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

@Service@Slf4jpublic 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./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./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给前端

看一下数据库微信表

用户表

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。