当前位置:网站首页>通过授权微信,达到软件登录账号的效果~~未完
通过授权微信,达到软件登录账号的效果~~未完
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.未完…
边栏推荐
猜你喜欢

Alibaba microservice component Nacos registry

Data consistency between redis and MySQL

MySQL CPU usage is soaring. How to locate who is occupying it

【MQTT从入门到提高系列 | 06】MQTT3.1.1之SUBSCRIBE订阅工作流

Abstract classes and derived classes

OSPF appendix anti ring Reissue

最大堆与堆排序和优先队列

MySQL CPU使用率飙升,如何定位是被谁占用了

ORA-00054

Problème de la valeur maximale de la fenêtre coulissante
随机推荐
Deployment principle
Explain C language dynamic memory management in detail
SQL related time date type
009 面试题 SQL语句各部分的执行顺序
深入理解事务隔离级别
Domestic fpga/dsp/zynq Chip & board scheme
DMA方式的特点
见鬼,U盘空间怎么少了,原来是EFI分区搞的鬼,删除它
SDL image display
Single channel 6Gsps 12 bit AD acquisition and single channel 6Gsps 16 bit Da (ad9176) output sub card based on vita57.1 standard
Behind the high salary of programmers' operation and maintenance
session管理
国科大.深度学习.期末复习知识点总结笔记
PCIe Cameralink signal generator (Cameralink image analog source)
2. MySQL introduction
背包问题 (Knapsack problem)
End repeated development and personalize the login system in twoorthree times
Explain the operation of C language file in detail
UCAS. Deep learning Final examination questions and brief thinking analysis
JVM common tuning configuration parameters




