微信公众平台开发(四)——微信网页授权:获取用户openid&用户基本信息

这篇具有很好参考价值的文章主要介绍了微信公众平台开发(四)——微信网页授权:获取用户openid&用户基本信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信网页授权

在开发中,如果web产品需要使用到微信的功能,比如微信授权登录、微信支付、微信投票等,我是开发的东东是一个web项目,然而如果需要接入微信的话,就需要使用道微信的微信网页开发相关的功能。
其中我们需要的东西就是拿到微信服务器的回调,比如用户扫码登录我们的web项目时,用户正确授权之后,微信服务器能回调到我们期望的url并且返回相应的参数信息。

网页授权流程分为四步:

  1. 引导用户进入授权页面同意授权,获取code
  2. 通过code换取网页授权access_token(与基础支持中的access_token不同)
  3. 如果需要,开发者可以刷新网页授权access_token,避免过期
  4. 通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
    具体的接口和参数说明参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

其中需要注意的时: 第一步获取code时,scope参数的设置,当scope参数值为snsapi_base时 (不弹出授权页面,直接跳转,只能获取用户openid),当scope参数值为snsapi_userinfo时 (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )

微信网页授权开发步骤

这里我直接贴开发及代码步骤:
0. 在微信公众号后台配置域名
需要注意的是只有微信认证的服务号才有微信网页授权的权限。
在开发的时候我们可以使用申请的测试号进行调试开发,测试号拥有大部分服务号有的接口权限。
然后需要在这两个地方设置JS接口的安全域名(开发阶段可以使用内网穿透域名):
第一处:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

第二处(向下拉):
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

分别设置好就可以使用安全域名开始开发了

在后端写代码时,一般会使用官方的SDK:weixin-java-mp(如果向官网那样每一个步骤发送请求拼接参数真的太不友好了)

  1. 引入下面坐标
        <!--微信开发sdk-->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>2.7.0</version>
        </dependency>
  1. 在配置文件application.yml中加入
wechat:
  mpAppId: wx90a9158b6acc5584
  mpAppSecret: ec23a5d78f12afa569c64794570d753c
  // 后端项目回调地址
  projecturl: http://uhi4iv.natappfree.cc/
  1. 编写两个配置文件注入spring
    WechatAccountConfig.java
package cn.kt.mywxdemo.wechatmp.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * Created by tao.
 * Date: 2023/3/21 15:02
 * 描述:
 */

@Data
@Component
//从配置文件里获取
@ConfigurationProperties(prefix = "wechat")
public class WechatAccountConfig {

    /**
     * 公众平台id
     */
    private String mpAppId;

    /**
     * 公众平台密钥
     */
    private String mpAppSecret;

    /**
     * 微信模版id
     */
    private Map<String, String> templateId;
}

WechatMpConfig.java

package cn.kt.mywxdemo.wechatmp.config;


import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
 * Created by tao.
 * Date: 2023/3/21 15:00
 * 描述:
 */

@Component
public class WechatMpConfig {

    @Autowired
    private WechatAccountConfig accountConfig;

    /**
     * @author :tao
     * @date :Created in 2021/3/12 10:15
     * @param: :
     * @return: WxMpService 对象
     * 配置wxMpConfigStorage,返回 WxMpService 对象
     */
    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }

    /**
     * @author :tao
     * @date :Created in 2021/3/12 10:20
     * @param: :
     * @return: WxMpConfigStorage 对象
     * 配置AppId、和AppSecret,获取WxMpConfigStorage 对象
     */
    @Bean
    public WxMpConfigStorage wxMpConfigStorage() {
        WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
        wxMpConfigStorage.setAppId(accountConfig.getMpAppId());
        wxMpConfigStorage.setSecret(accountConfig.getMpAppSecret());
        return wxMpConfigStorage;
    }
}
  1. 编写和微信服务器交互的controller
    WxJsController.java
package cn.kt.mywxdemo.wechatmp.controller;

import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * Created by tao.
 * Date: 2023/3/21 15:04
 * 描述:
 */

@Controller
@RequestMapping("/wechat")
@Slf4j
public class WxJsController {

    @Autowired
    private WxMpService wxMpService;

    @Value("${wechat.projecturl}")
    private String projectUrl;

    @GetMapping("/auth")
    @ResponseBody
    public String auth(@RequestParam(value = "echostr", defaultValue = "没有获取到") String echostr) {
        return echostr;
    }


    /**
     * @author :tao
     * @param: :
     * @return: 重定向到获取用户信息的类
     * 微信授权登录
     */
    @GetMapping("/authorize")
    public String authorize(@RequestParam(value = "returnUrl", defaultValue = "https://qkongtao.cn/") String returnUrl) throws UnsupportedEncodingException {
        log.info("【微信网页授权】进来了,参数={}", returnUrl);
        System.out.println("进来了:" + returnUrl);
        //1. 配置
        //2. 调用方法
        String url = projectUrl + "wechat/userInfo";
        /*
         * 相当于这种形式
         * URLEncoder.decode(returnUrl,"UTF-8"
         * https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
         */
        String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_USER_INFO, URLEncoder.encode(returnUrl, "utf-8"));
        log.info("【微信网页授权】获取code,result={}", redirectUrl);
        return "redirect:" + redirectUrl;
    }

    /**
     * @author :tao
     * @param: :
     * @return: 重定向
     * 获取用户信息类,最后重定向到指定url
     */
    @GetMapping("/userInfo")
    public String userInfo(@RequestParam("code") String code,
                           @RequestParam("state") String returnUrl) throws WxErrorException {
        /*当用户同意授权后,会回调所设置的url并把authorization code传过来,
        然后用这个code获得access token,其中也包含用户的openid等信息*/
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
        try {
            //获取access token
            wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
            log.info("【AccessToken:】{}", wxMpOAuth2AccessToken.getAccessToken());
        } catch (WxErrorException e) {
            log.error("【微信网页授权】{}", e);
        }

        // 拿到openid
        String openId = wxMpOAuth2AccessToken.getOpenId();
        log.info("【openid:】{}", openId);
        log.info("【我是前端要回调的地址:】{}", returnUrl + "&openid=" + openId);
        // 顺便获取一下用户信息
        WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, "zh_CN");
        log.info("【用户信息:】{}", wxMpUser.toString());

        //注意拼接参数,第一个参数需要加问号,之后参数使用&拼接的问题
        //return "redirect:" + returnUrl + "/#/?openid=" + openId;
        return "redirect:" + returnUrl + "&openid=" + openId;
    }
}

运行结果

上述代码已经处理好了微信授权的流程,我们调用只需要使用/authorize接口,并且传入回调url(授权之后需要重定向的路径)即可进行授权
示例如下
uhi4iv.natappfree.cc为后台绑定域名
http://uhi4iv.natappfree.cc/wechat/authorize?returnUrl=https://qkongtao.cn?1=1

使用微信打开结果:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

由于我已经刚刚授权过了,就进行了静默授权。否则将弹出授权选项需要用户确认。
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

获取用户openid和用户基本信息

需要提前说明:

  1. 在网页授权中的openid和基础公众号关注后得到的openid的是不一样的
  2. 网页授权access_token和普通access_token的区别
  • 微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
  • 其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
  1. 在关注者与公众号产生消息交互后,公众号可获得关注者的openid(加密后的微信号,每个用户对每个公众号的openid是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据openid获取用户基本信息,包括语言和关注时间。
  2. UnionID机制说明:开发者可通过openid来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
  3. 目前基础公众号关注后获取到openid,后台是无法根据openid和access_token获取到用户头像、昵称信息、地址等信息;必须通过OAuth2.0机制的微信网页授权,在用户确认授权之后才可以获取到用户头像、昵称信息、地址等信息。

网页授权获取用户信息

参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#3

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

请求方法:

http:GET(请使用https协议):
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

请求结果:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

昵称乱码需要使用utf8重新编码:String result = new String(nickname, “utf-8”);

在上面的controller中也顺便把用户信息也进行获取了一下:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

后台输出结果如下:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

基础公众号关注获取用户信息

官方文档:https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId

其实和上面差不多,也是通过openid和access_token换取用户信息
接口如下:
接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

结果如下:
前端如何获取微信openid,java,服务器,微信,微信公众平台,spring boot

可以看出相比较微信网页授权,基础公众号关注可获取用户信息相对少了很多。

源码下载

源码链接:https://gitee.com/qkongtao/my-wx-demo文章来源地址https://www.toymoban.com/news/detail-591722.html

到了这里,关于微信公众平台开发(四)——微信网页授权:获取用户openid&用户基本信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信公众号开发以及测试公众号前端自测网页授权

    测试号申请(开发的时候需要使用微信测试号进行开发) 微信测试号申请地址 进入网页之后选择微信登陆,直接用微信扫码登录,微信测试号就申请成功了 测试号配置 申请成功之后会有一个测试号管理界面 1、会自动生成appID、appsecret(需要记录一下,后面会用到)。 2、接口

    2024年02月06日
    浏览(50)
  • JAVA 微信公众号授权给开放平台(第三方平台)开发流程及第三方平台代公众号实现业务

    一 、开放平台账户注册及开发配置请参考我之前的文章 开发前准备工作。 二、授权流程 官方文档细节比较多 我说的比较直白 (1)首先 启动票据推送服务 (2)接收消息→解密→验证并获取票据→保存票据 component_verify_ticket (3)获取第三方平台调用凭证 component_access_tok

    2024年03月15日
    浏览(67)
  • 微信小程序引导关注公众号(超详细),获取公众号openID,是否关注公众号信息

    需求背景:微信小程序里,需要判断使用该小程序的用户是否有关注该小程序关联的公众号,如未关注要引导用户去关注公众号(用于公众号推送信息) 官网: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 接口(获取Code): 参数: APPID:公众号的唯

    2024年02月15日
    浏览(79)
  • 微信小程序与公众号关联(同一主体),获取unionId并关联公众号openid

    有一些同学在实际开发中,会有通过微信的openid获取公众号的openid,或者其他内容,这几天正好在研究这个功能的实现(已实现),现做思路上的简单分享,希望能对需要解决该问题的同学有所帮助,有误之处敬请指正。 工具/语言/依赖 版本 备注 uniapp 2023-12 Springboot 2.1.12.

    2024年04月14日
    浏览(36)
  • 微信公众平台测试号申请、使用HBuilder X与微信开发者工具实现授权登陆功能以及单点登录

    测试账号申请 测号响应流程:客户端发送请求,微信服务器收到请求后,转发到开发者服务器上,处理完后在发送给微信服务器,在返回给客户端 1、打开微信公众平台,点击测试帐号申请。地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login, 通过微信扫一扫授权就能进

    2024年02月02日
    浏览(60)
  • 通过java方式获取微信用户openId

    https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 目的:使本地的服务能在微信客户端进行访问 1.购买隧道 https://natapp.cn/tunnel/buy 2.进行配置 配置域名,ip和端口。在这里配本地可以访问的服务的ip和端口。 3 下载客户端 3 打开命令行在客户端同级目录执

    2024年02月11日
    浏览(48)
  • 【微信小程序】通过云函数获取用户openid

    1.pages同级目录下新建新文件夹,命名为cloudFunctions(其他名字也可以)。 2.project.config.json中添加以下内容,值为上一步创建的文件夹名字。编译一次后上一步创建的文件夹前图标就带“云”了。 3.app.js内的App中添加 1.右击cloudFunctions文件夹,点击【新建Node.js云函数】,命名为

    2024年02月10日
    浏览(62)
  • PHP实践:手把手微信公众号网页授权登录功能实现

    🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于PHP专栏:PHP进阶实战教程。 🏆另有专栏PHP入门基础教程,希望各位大佬

    2024年02月12日
    浏览(53)
  • uniapp 企业微信侧边栏开发网页授权 注入企业权限 注入应用权限 获取userid(2)

    想知道怎么搭建一个企业微信侧边栏应用的,请移步: https://blog.csdn.net/u013361179/article/details/131936040?spm=1001.2014.3001.5501 1、网页授权,获取code 代码: 里面用到的方法: // 获取url后参数code // 删除URL中指定search参数 这个时候就会发现,如果你是从企业微信客户端侧边栏配置的

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包