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

导读:本篇文章讲解 通过授权微信,达到软件登录账号的效果~~未完,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1.使用公众号

1.注册公众号

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

在这里插入图片描述
在这里插入图片描述

2.登录公众号

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

3.创建测试账号

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

保存好appIDappsecret

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

在这里插入图片描述
点击查看接口详情
在这里插入图片描述
在这里插入图片描述
使用上面接口前我们还需要完成前期准备,点击查看接口对接流程

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.未完…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83829.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!