当前位置:网站首页>通过授权微信,达到软件登录账号的效果~~未完
通过授权微信,达到软件登录账号的效果~~未完
2022-07-17 22:14:00 【Hi梅】
文章目录
1.使用公众号
1.注册公众号
百度搜索微信公众号,可以自己去试着注册一个,个人订阅号


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

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

点击查看接口详情

使用上面接口前我们还需要完成前期准备,点击查看接口对接流程
4.完成微信接口配置信息

点击查看开发指南
1.编写接口
我们添加好接口提交信息后,微信服务器将发送 GET 请求到填写的服务器地址 URL 上,GET请求携带参数如下表所示:
那么我们想要在自己的程序中按照参数来添加接口,用于接受微信发送的验证信息
/** * @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后运行,我们可以得到域名

复制域名信息回到微信公众号里面配置,在natapp里面配置80映射我本地的8080程序,这样微信就可以通过这个域名来访问我们的程序
单点击提交后如果出现配置成功则证明微信服务器访问到我们程序了
我们看打印日志可以看出请求的数据信息
到这部就完成了微信公众号,接口配置信息!
5.网页授权
前期配置
首先需要设置网页授权的回调接口,点击修改
请勿加 http:// 等协议头;
要和以下域名一样
完成上面步骤后可以看开发指南,拼接好url,用户用户在微信点击后出现授权界面如下图,点击后会打开次界面

1.用户同意授权,获取code
看自己需求更改scope对应的值
我们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:

回调地址
文档说需要使用urlEncode 进行编码下,网上很多在线网址都可以进行这个编码/weChat/acceptCode:该接口用于接受用户回调的code值
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
发送微信


点击同意后我们系统就会获取到code信息和state值
程序获取的值:
微信授权后页面
注意:
code作为换取access_token的票据,每次用户授权带上的 code 将不一样,code只能使用一次,5分钟未被使用自动过期,那就意味着要重新点击地址获取code。
2.通过 code 换取网页授权access_token

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

我们需要在获取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;
}
返回的参数如下:

把json格式化后得到的结果更直观些
参数描述

这个时候我们就可以保存用户的access_token,openid,refresh_token值等
重点openid参数:用户唯一标识,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
refresh_token: 当access_token快过期时我们需要该参数刷新access_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里面
这里放个疑问,第一次获取的refresh_token和刷新后返回的refresh_token是否相等??
运行查看结果:
授权后的refresh_token和刷新后的refresh_token是一样的
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);
}
可以看出已经可以获取微信授权用户信息

响应参数:
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;
}
授权后的效果:

6.未完…
边栏推荐
- Integrated video processing card based on Fudan micro FPGA + Huawei hisilic hi3531dv200 + Mji innovative MCU
- Read the paper: temporary graph networks for deep learning on dynamic graphs
- Li Kou 455 distribute cookie notes
- The first step of agile: turn "iteration" into "sprint" and start!
- MySQL CPU usage is soaring. How to locate who is occupying it
- End repeated development and personalize the login system in twoorthree times
- SDL image display
- 国科大. 深度学习. 期末试题与简要思路分析
- MySQL read / write separation
- 抽象类与派生类
猜你喜欢

揭开服务网格~Istio Service Mesh神秘的面纱

End repeated development and personalize the login system in twoorthree times

Qchartview overwrites the previous control when it is added in qgridlayout

模块1 作业

6U VPX high speed signal processing board based on ku115+mpsoc (xcku115 + zu9eg +dsp)

定时任务,vim直接创建修改用户

3438. Number system conversion

两种虚拟机的比较

Labview32-bit and 64 bit compatibility

Deployment 原理
随机推荐
Damn it, why is there less space on the USB flash drive? It's the EFI partition. Delete it
3U VPX cooling conduction high performance srio/ Ethernet data exchange board
dba
Classification of interrupts
UCAS. Deep learning Final review knowledge points summary notes
An unforgettable day in 2022 summer camp
Domestic fpga/dsp/zynq Chip & board scheme
2、MYSQL介绍
Scheduled tasks, VIM directly creates and modifies users
Explain C language dynamic memory management in detail
Vscode download historical version
程序员 运维那些高薪的背后
3438. Number system conversion
Sub database and sub table
Oserror: sndfile library not found solution
[mqtt from getting started to improving series | 06] subscribe subscription workflow of mqtt3.1.1
Several points to be analyzed in the domestic fpga/dsp/zynq scheme
Wechat applet -- wxss template style
抽象類與派生類
The bill module of freeswitch




