微信网页开发(3)–微信网页授权

微信网页开发(3)–微信网页授权本文目录 1 什么是授权 2 两种授权方式 3 网页授权 access token 和普通 access token4 网页授权流程 5 网页授权代码开发 5 1 项目搭建 5 2 修改配置文件 5 3 开发启动类 5 4 开发公众号配置类 5 5 开发控制器 5 6 开发测试网页 6 测试 6 1 网页授权测试 6 2 获取用户 code 测试 6 3 获取 JSSDK 配置信息测试 7 本地地址测试问题 8 小结 1 什么是授权先解释下什么是授权 授权是指微信用户 授权网页获取用户相关的信息 也就是说 微信官方为了保护用户隐私

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载

1. 什么是授权

先解释下什么是授权,授权是指微信用户,授权网页获取用户相关的信息。

也就是说,微信官方为了保护用户隐私权益,默认是不允许咱们开发的网页,获取用户的信息的,我们需要让用户授权。

2. 两种授权方式

有两种授权方式,snsapi_base和snsapi_userinfo。

snsapi_base静默授权,不需要用户手工同意,但是该授权方式只能获取access_token和openID。

snsapi_userinfo可以获取更多用户信息,如头像、性别、昵称,但是需要用户手工确认授权。另外注意,如果用户已关注公众号,那么在进入公众号网页时,使用snsapi_userinfo也是静默授权。微信官方认为既然关注了公众号,公众号就有权力获取用户信息。

3. 网页授权access_token和普通access_token

这个是非常容易混淆的概念,普通access_token是公众号接口使用的,网页授权access_token是调用网页接口使用的,它俩不是一个,功能也不同。

此处吐槽下微信,搞一个名字,太容易误导开发者了。

4. 网页授权流程

微信网页授权是通过OAuth2.0实现的,熟悉OAuth2.0的容易理解流程,不熟悉的此处我再解释下,确实不好理解。

第一步,构造一个url,引导用户授权,用户授权后,会向我们指定的回调地址发送授权码code。

第二步,通过code获取网页授权access_token、openid。

第三步,获取JSSDK配置信息,以便调用各种微信JS接口。

5. 网页授权代码开发

5.1 项目搭建

创建SpringBoot项目,并引入微信公众号、微信支付依赖。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0 
     modelVersion> <parent> <groupId>org.springframework.boot 
      groupId> <artifactId>spring-boot-starter-parent 
       artifactId> <version>2.2.5.RELEASE 
        version> <relativePath />  
         
         parent> <groupId>cn.pandabrother 
          groupId> <artifactId>wx-server 
           artifactId> <version>0.0.1-SNAPSHOT 
            version> <packaging>war 
             packaging> <properties> <project.build.sourceEncoding>UTF-8 
              project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8 
               project.reporting.outputEncoding> <java.version>1.8 
                java.version> <maven-jar-plugin.version>3.0.0 
                 maven-jar-plugin.version>  
                  properties> <dependencies> <dependency> <groupId>org.springframework.boot 
                   groupId> <artifactId>spring-boot-starter-web 
                    artifactId>  
                     dependency> <dependency> <groupId>org.projectlombok 
                      groupId> <artifactId>lombok 
                       artifactId>  
                        dependency> <dependency> <groupId>org.springframework.boot 
                         groupId> <artifactId>spring-boot-devtools 
                          artifactId>  
                           dependency>  
                           <dependency> <groupId>io.springfox 
                            groupId> <artifactId>springfox-swagger2 
                             artifactId> <version>2.9.2 
                              version>  
                               dependency>  
                               <dependency> <groupId>io.springfox 
                                groupId> <artifactId>springfox-swagger-ui 
                                 artifactId> <version>2.9.2 
                                  version>  
                                   dependency>  
                                   <dependency> <groupId>com.github.binarywang 
                                    groupId> <artifactId>weixin-java-mp 
                                     artifactId> <version>4.1.0 
                                      version>  
                                       dependency>  
                                       <dependency> <groupId>com.github.binarywang 
                                        groupId> <artifactId>weixin-java-pay 
                                         artifactId> <version>4.1.0 
                                          version>  
                                           dependency>  
                                            dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot 
                                             groupId> <artifactId>spring-boot-maven-plugin 
                                              artifactId>  
                                               plugin>  
                                                plugins>  
                                                 build>  
                                                  project> 

5.2 修改配置文件

修改配置文件application.yml,设置启动端口即访问路径。

server: port: 80 #端口 servlet: context-path: /wx-server 

5.3 开发启动类

/ * SpringBoot启动类 */ @SpringBootApplication public class WxServerApplication { 
    public static void main(String[] args) { 
    SpringApplication.run(WxServerApplication.class, args); } } 

5.4 开发公众号配置类

开发供公众号配置类,将公众号的appid、appsecret等参数注入容器。注意代码中xxx需要替换为实际参数。

/ * 微信公众平台配置 */ @Configuration public class WxMpConfig { 
    @Bean public WxMpDefaultConfigImpl wxMpDefaultConfigImpl() { 
    WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl(); config.setAppId("xxx"); // 设置微信公众号的appid config.setSecret("xxx"); // 设置微信公众号的app corpSecret config.setToken("xxx"); // 设置微信公众号的token config.setAesKey("xxx"); // 设置微信公众号的EncodingAESKey return config; } @Bean public WxMpService wxMpService() { 
    WxMpService wxMpService = new WxMpServiceImpl();// 实际项目中请注意要保持单例,不要在每次请求时构造实例,具体可以参考demo项目 wxMpService.setWxMpConfigStorage(wxMpDefaultConfigImpl()); return wxMpService; } } 

5.5 开发控制器

开发微信网页相关的后端控制器WxPageController:

/ * 微信网页控制器 */ @Controller public class WxPageController { 
    @Autowired private WxMpService wxMpService; / * 第一步,引导用户授权 */ @GetMapping("/wxAuth") public String wxAuth(HttpServletRequest request) throws Exception { 
    String url = "http://easypanda.oicp.io/wx-server/wxUserInfo"; String redirectUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, null); return "redirect:" + redirectUrl; } / * 第二步,用户授权后,回调该方法,拿到code换取access_token */ @GetMapping("/wxUserInfo") public String userInfo(@RequestParam("code") String code, @RequestParam("state") String state) throws Exception { 
    WxOAuth2AccessToken wxOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(code); String openId = wxOAuth2AccessToken.getOpenId(); // 返回我们开发的网页 return "redirect:" + "http://easypanda.oicp.io/wx-server/wxpage.html?openid=" + openId; } / * 第三步,获取JSSDK配置信息 */ @GetMapping("/wxJsapiSignature") @ResponseBody public WxJsapiSignature wxJsapiSignature(String url) throws Exception { 
    return wxMpService.createJsapiSignature(url); } } 

此处需要注意的是,此处网页地址我均使用的公网可访问的域名地址,此处使用的是内网穿透。有公网服务器的也可以选择直接使用公网服务器测试。

5.6 开发测试网页

为了便于测试,我们在resource目录下创建static文件夹,并开发wxpage.html页面:

<html> <head> <meta charset="utf-8">  
     head> <body> hello  
      body>  
       html> 

6. 测试

6.1 网页授权测试

打开开发者工具,输入地址http://easypanda.oicp.io/wx-server/wxAuth引导用户授权,此时开发者工具提示:
在这里插入图片描述
我们登录公众号,在【设置与开发】-【公众号设置】-【功能设置】-【网页授权域名】中添加当前域名。注意此处需要下载txt文件,放到域名根目录。
在这里插入图片描述
此时再次尝试,注意此时方式为SNSAPI_USERINFO,微信提醒用户授权:
在这里插入图片描述
我们更换为SNSAPI_BASE,再次请求授权:此时可以直接进入我们指定的网页。












6.2 获取用户code测试

进入我们指定网页后,我们将地址栏的重定向地址拷贝出来:

http://easypanda.oicp.io/wx-server/wxpage.html?openid=oINiq6UqTiKqfXN3H6RmeKvvRnmw

可见已经成功获取到用户的openid,也就是说,用户授权后,会自动定向到wxUserInfo方法并传递code参数。

6.3 获取JSSDK配置信息测试

此时访问http://easypanda.oicp.io/wx-server/wxJsapiSignature,可以获取JSSDK配置信息,如下:

{ 
   "appId":"wxa0168d6e3b5547ff","nonceStr":"AbMcd6UcZNgmBcSa","timestamp":,"url":null,"signature":"91073ffc3ef83fbe7fbee0c01a65c5ff"} 

我们可以通过该配置信息,调用JSSDK啦。

7. 本地地址测试问题

我们可以访问http://127.0.0.1/wx-server/wxAuth,但是如果回调地址填写本地地址微信会提示redirect_uri参数错误,所以使用本地地址测试是不方便的。

8. 小结

微信网页授权的过程确实比较绕,但是该功能比较重要,包括后续的微信公众号支付开发,也需要借助网页授权。

另外在大多数情况下,可以采用SNSAPI_BASE授权方式,静默的体验比弹窗提示授权更好!

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228048.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:56
下一篇 2026年3月16日 下午7:57


相关推荐

  • navicat premium 15 激活【2021免费激活】

    (navicat premium 15 激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0VOERWDQ5R-eyJsa…

    2022年3月31日
    132
  • IDEA注释快捷键[通俗易懂]

    IDEA注释快捷键[通俗易懂]IDEA可以使用快捷键添加行注释Ctrl+/、块注释Ctrl+Shift+/,还可以快速生成类注释、方法注释等,下面就介绍这几种快捷键的用法.[1]行注释Ctrl+/首先你的光标要处于这一行,处于这行的哪个位置都可以,按Ctrl+/,就可以往行首添加”//”,将该行注释掉。再次按Ctrl+/,可以去掉该行注释。[2]块注释Ctrl+Shift+/使用块注释需要先选中要注释的块。…

    2022年8月15日
    31
  • Java 基础高频面试题(2021年最新版)

    最新Java基础高频面试题

    2022年4月6日
    37
  • Python中字符串的Format用法。

    Python中字符串的Format用法。一、例子:二、结果:

    2022年7月5日
    23
  • 大数据应用的现实案例

    大数据应用的现实案例互联网企业拥有大量的线上数据,而且数据量还在快速增长,除了利用大数据提升自己的业务之外,互联网企业已经开始实现数据业务化,利用大数据发现新的商业价值。以阿里巴巴为例,它不仅在不断加强个性化推荐、“千人千面”这种面向消费者的大数据应用,并且还在尝试利用大数据进行智能客户服务,这种应用场景会逐渐从内部应用延展到外部很多企业的呼叫中心之中。在面向商家的大数据应用中,以“生意参谋”为例,超过600万商家在利用“生意参谋”提升自己的电商店面运营水平。除了面向自己的生态之外,阿里巴巴数据业务化也在不断加速,

    2022年6月1日
    73
  • C++数组求和用自带的库超级方便

    C++数组求和用自带的库超级方便C 数组求和用自带的库超级方便 而且也达到代码更加简洁的目的 你只需要做 2 步 1 导入库文件 include2 添加空间名 usingnamespa 然后就可以直接使用 accumulate arrayName arrayName 数组长度 数组起始位 demo intarray 6 1 2 3 4 5 6 in

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号