0
点赞
收藏
分享

微信扫一扫

通过授权微信,达到软件登录账号的效果~~未完

霸姨 2022-12-16 阅读 153


📣文章目录

  • ​​1.使用公众号​​
  • ​​1.注册公众号​​
  • ​​2.登录公众号​​
  • ​​3.创建测试账号​​
  • ​​4.完成微信接口配置信息​​
  • ​​1.编写接口​​
  • ​​2.内网穿透​​
  • ​​3.配置接口​​
  • ​​5.网页授权​​
  • ​​前期配置​​
  • ​​1.用户同意授权,获取code​​
  • ​​2.通过 code 换取网页授权access_token​​
  • ​​3. 第三步:刷新access_token(如果需要)​​
  • ​​4. 第四步:拉取用户信息(需 scope 为 snsapi_userinfo)​​
  • ​​5. 附:检验授权凭证(access_token)是否有效​​
  • ​​6.未完...​​

1.使用公众号

1.注册公众号

百度搜索微信公众号,可以自己去试着注册一个,个人订阅号

通过授权微信,达到软件登录账号的效果~~未完_公众号


通过授权微信,达到软件登录账号的效果~~未完_微信_02

2.登录公众号

由于微信公众号有对权限划分,所以使用个人订阅号可能有许多Api功能使用不了,但是我们可以登录订阅号在​​设置与开发中​​找到开发工具下的公众平台测试账号,下方的小字已经说到测试账号可以体验公众号的所有高级接口

通过授权微信,达到软件登录账号的效果~~未完_System_03

3.创建测试账号

使用测试账号来体验微信公众号的高级接口

保存好​​appID​​​和​​appsecret​

通过授权微信,达到软件登录账号的效果~~未完_公众号_04


我们使用该接口来完成第三方软件,通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

通过授权微信,达到软件登录账号的效果~~未完_公众号_05


点击查看接口详情

通过授权微信,达到软件登录账号的效果~~未完_公众号_06


通过授权微信,达到软件登录账号的效果~~未完_微信_07


使用上面接口前我们还需要完成前期准备,点击查看接口对接流程

4.完成微信接口配置信息

通过授权微信,达到软件登录账号的效果~~未完_公众号_08


点击查看开发指南

通过授权微信,达到软件登录账号的效果~~未完_微信_09

1.编写接口

我们添加好接口提交信息后,微信服务器将发送 ​​GET 请求到填写的服务器地址 URL 上​​,GET请求携带参数如下表所示:

通过授权微信,达到软件登录账号的效果~~未完_微信_10


那么我们想要在自己的程序中按照参数来添加接口,用于接受微信发送的验证信息

/**
* @Author Itmei
* @Date 2022/7/14 22:43
* @Version 1.0
* 微信接口验证类
* Get请求用于验证
*/
@RestController
@RequestMapping("/weChat")
public class WeixinController {

@GetMapping("/accept")
public String acceptWeChatVerify(@RequestParam("signature") String signature,
@RequestParam("timestamp") Long timestamp,
@RequestParam("nonce") String nonce,
@RequestParam("echostr") String echostr){
System.out.println(signature);
System.out.println(timestamp);
System.out.println(nonce);
System.out.println(echostr);
//若确认此次 GET 请求来自微信服务器,请原样返回 echostr 参数内容
return echostr;
}
}

2.内网穿透

注意:配置接口需要使用内网穿透,我们填写的域名或者ip都是要外网地址的,不然微信服务器没办法访问到我们的接口中,所以我们想要使用内网穿透软件来代理我们的ip,通常该类软件都是要在本机运行脚本然后会给我们一个外网域名,我们使用这个域名就可以访问我们的程序,本次使用的穿透工具​​natapp​​不懂的小朋友可以看往前内容​​点击直达​​

3.配置接口

按照步骤配置好​​natapp​​后运行,我们可以得到域名

通过授权微信,达到软件登录账号的效果~~未完_System_11

复制域名信息回到微信公众号里面配置,在natapp里面配置80映射我本地的8080程序,这样微信就可以通过这个域名来访问我们的程序

通过授权微信,达到软件登录账号的效果~~未完_System_12

单点击提交后如果出现配置成功则证明微信服务器访问到我们程序了

通过授权微信,达到软件登录账号的效果~~未完_微信_13

我们看打印日志可以看出请求的数据信息

通过授权微信,达到软件登录账号的效果~~未完_微信_14


到这部就完成了微信公众号,接口配置信息!

5.网页授权

前期配置

首先需要设置网页授权的回调接口,点击修改

通过授权微信,达到软件登录账号的效果~~未完_System_15


请勿加 http:// 等协议头;

通过授权微信,达到软件登录账号的效果~~未完_公众号_16


要和以下域名一样

通过授权微信,达到软件登录账号的效果~~未完_公众号_17


完成上面步骤后可以看开发指南,拼接好url,用户用户在微信点击后出现授权界面如下图,点击后会打开次界面

通过授权微信,达到软件登录账号的效果~~未完_微信_18

1.用户同意授权,获取code

看自己需求更改​​scope​​对应的值

通过授权微信,达到软件登录账号的效果~~未完_System_19


我们​​scope为snsapi_userinfo​​演示,拼接地址

​https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的APPID&redirect_uri=回调地址&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect​

只需要更改2处地方:

你的APPID:

通过授权微信,达到软件登录账号的效果~~未完_公众号_20

回调地址

通过授权微信,达到软件登录账号的效果~~未完_公众号_21


文档说需要使用urlEncode 进行编码下,网上很多在线网址都可以进行这个编码


通过授权微信,达到软件登录账号的效果~~未完_微信_22


​/weChat/acceptCode​

​:该接口用于接受用户回调的code值


通过授权微信,达到软件登录账号的效果~~未完_微信_23


produces解决返回的字符串乱码问题

我们进行打印code和state,​​还有就是这个state这个值重定向后会带上 state 参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节​

然后拼接好请求地址,把地址发送到微信

​​https://open.weixin.qq.com/connect/oauth2/authorize?appid=​​​​wx8140cd35​​​&redirect_uri=​​http%3A%2F%2F3juvem.natappfree.cc%2FweChat%2FacceptCode​​&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

发送微信

通过授权微信,达到软件登录账号的效果~~未完_公众号_24


通过授权微信,达到软件登录账号的效果~~未完_System_25


点击同意后我们系统就会获取到​​code​​​信息和​​state​​值

程序获取的值:

通过授权微信,达到软件登录账号的效果~~未完_公众号_26


微信授权后页面


通过授权微信,达到软件登录账号的效果~~未完_微信_27

注意:​​code​​​作为换取access_token的票据,每次用户授权带上的 code 将不一样,code只能使用一次,​​5分钟未被使用自动过期​​,那就意味着要重新点击地址获取code。

2.通过 code 换取网页授权access_token

通过授权微信,达到软件登录账号的效果~~未完_微信_28


​appid​​​ 对应 公众号的唯一标识(​​appID​​)

​secret​​​ 对应 公众号的(​​appsecret​​)

通过授权微信,达到软件登录账号的效果~~未完_System_29

我们需要在获取code的方法里面添加获取token代码

/**
*网页授权,用户同意授权后回调该接口
* @param code
* @param state
* @return
* produces解决返回的字符串乱码问题
*/
@GetMapping(value = "/acceptCode",produces="text/html;charset=UTF-8")
public String acceptWeChatVerify(@RequestParam("code") String code,
@RequestParam("state") String state){
//拼接好获取获取access_token的链接
String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APPID+"&secret="+SECRET+"&code="+code+"&grant_type=authorization_code";
System.out.println(code);
System.out.println(state);
//使用hutool工具包发送get请求获取token信息
String tokenMsg = HttpUtil.get(url);
System.out.println("通过code获取用户token:"+tokenMsg);

String returnMsg="完成授权认证";
return returnMsg;
}

返回的参数如下:

通过授权微信,达到软件登录账号的效果~~未完_公众号_30


把json格式化后得到的结果更直观些

通过授权微信,达到软件登录账号的效果~~未完_公众号_31

参数描述

通过授权微信,达到软件登录账号的效果~~未完_公众号_32


这个时候我们就可以保存用户的​​access_token,openid,refresh_token​​值等

3. 第三步:刷新access_token(如果需要)

由于​​access_token​​​拥有​​较短的有效期​​,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

编写刷新代码

/**
*
* @param appid 公众号的唯一标识
* @param refreshToken 填写通过access_token获取到的refresh_token参数
* @return
*/
public String refreshToken(String appid,String refreshToken){
String url="https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+appid+"&grant_type=refresh_token&refresh_token="+refreshToken;
String refreshTokenMsg = HttpUtil.get(url);
JSONObject refreshJson = JSONObject.parseObject(refreshTokenMsg);
//网页授权接口调用凭证
String access_token = refreshJson.getString("access_token");
//用户刷新access_token
String refresh_token = refreshJson.getString("refresh_token");

System.out.println("授权后的refresh_token和刷新后的refresh_token是否相等:"+refreshToken.equals(refresh_token));
return access_token;
}

演示就直接写在获取里code里面

通过授权微信,达到软件登录账号的效果~~未完_公众号_33

这里放个疑问,第一次获取的refresh_token和刷新后返回的refresh_token是否相等??

通过授权微信,达到软件登录账号的效果~~未完_公众号_34

运行查看结果:

授权后的refresh_token和刷新后的refresh_token是一样的

通过授权微信,达到软件登录账号的效果~~未完_System_35

4. 第四步:拉取用户信息(需 scope 为 snsapi_userinfo)

编写获取用户信息代码

/**
* 拉取用户信息
* @param access_token 网页授权接口调用凭证
* @param openid 用户的唯一标识
*/
public void userInfo(String access_token,String openid){
String url="https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
String userInfoMsg = HttpUtil.get(url);
//可以直接写个类来来存储用户信息
JSONObject userInfoJson = JSONObject.parseObject(userInfoMsg);
String nickname = userInfoJson.getString("nickname");
//只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。如果未关注unionid为null
String unionid = userInfoJson.getString("unionid");

System.out.println("授权用户信息名称:"+nickname);
System.out.println("用户信息:"+userInfoMsg);
}

可以看出已经可以获取微信授权用户信息

通过授权微信,达到软件登录账号的效果~~未完_System_36

通过授权微信,达到软件登录账号的效果~~未完_公众号_37

响应参数:

通过授权微信,达到软件登录账号的效果~~未完_System_38

5. 附:检验授权凭证(access_token)是否有效

检验授权凭证是否有效

/**
* 检验授权凭证是否有效
* @param access_token
* @param openid
* @return
*/
public boolean verifyToken(String access_token,String openid){
String url="https://api.weixin.qq.com/sns/auth?access_token="+access_token+"&openid="+openid;
String verifyTokenoMsg = HttpUtil.get(url);
//可以直接写个类来来存储用户信息
JSONObject verifyTokenJson = JSONObject.parseObject(verifyTokenoMsg);
String errcode = verifyTokenJson.getString("errcode");
String errmsg = verifyTokenJson.getString("errmsg");
if ("0".equals(errcode)){
//授权可用
return true;
}
return false;
}

授权后的效果:

通过授权微信,达到软件登录账号的效果~~未完_微信_39

6.未完…


举报

相关推荐

0 条评论