【微信】公众号授权绑定登录流程详解

在做微信公众号开发时,经常需要对公众号上面的菜单做授权登录,如果是首次登录还需要做微信openId和系统账号的绑定操作。

这里做如下假设:

  • 系统前端地址:http://www.test.com
  • 系统接口地址:http://api.test.com
  • 需要打开的页面地址:http://www.test.com/home/index

一、微信公众号配置

1、公众号注册以及实名认证
2、在“基本配置”中启用开发者密码(记得复制AppID、AppSecret),并设置IP白名单
3、在“公众号设置-功能设置”中,配置“业务域名、JS接口安全域名、网页授权域名”

注意:上面几个操起需要将微信授权文件(MP_verify_xxxxx.txt)下载存放在服务器上,需要让http://www.test.com/MP_verify_xxxxx.txt可以访问。
假设把文件放在目录/usr/share/nginx/file中,然后配置nginx,让该链接可以访问,例如:

# 微信授权文件通用匹配规则
location ~(MP_verify_)*\.(txt)$ {
    root   /usr/share/nginx/file;
}

在这里插入图片描述

4、在“开发者工具-web开发者工具”中,绑定开发者微信号,便于在微信开发者工具中调试

在这里插入图片描述

二、服务端开发

1、引入第三方微信公众号sdk

这里推荐开源项目WxJava

在pom.xml中引入第三方jar包

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>4.5.0</version>
</dependency>

2、配置微信公众号服务

1)将复制下来的AppID、AppSecret配置在application.yml

wx:
  appId: wxd8e8db2818fxxxxx
  appSecret: 4a22ab04b25eb155bd8b6a540cxxxxx
  # 前端账号绑定页面url
  bindUrl: http://www.test.com/wxBind
  # 后端微信授权回调url
  callback: http://api.test.com/wx/auth/callback

2)新建配置属性类WxProperties.java

@ConfigurationProperties(prefix = "wx")
@Data
public class WxProperties {

    private String appId;
    private String appSecret;
    private String bindUrl;
    private String callback;
}

3)新增配置类WxConfig.java

@Configuration
@EnableConfigurationProperties(WxProperties.class)
public class WxConfig {

    private WxProperties wxProperties;

    public WxConfig(WxProperties wxProperties) {
        this.wxProperties = wxProperties;
    }

    @Bean
    public WxMpService wxMpService(){
        WxMpService wxMpService = new WxMpServiceImpl();
        WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();
        configStorage.setAppId(wxProperties.getAppId());
        configStorage.setSecret(wxProperties.getAppSecret());
        wxMpService.setWxMpConfigStorage(configStorage);
        return wxMpService;
    }
}

3、编写回调及绑定接口

1)新建微信授权回调接口Controller,编写授权回调接口

如果用户还未绑定,需要把openId传给前端,前端在绑定登录时,一起作为参数传回到后端的绑定接口

@Slf4j
@Controller
@RequestMapping("/wx/auth")
public class WxAuthController {
    @Resource
    private WxMpService wxMpService;
    @Resource
    private WxProperties wxProperties;

    @RequestMapping("/callback")
    public String callback(Model model, String state, String code) throws WxErrorException {
        log.info("wx callback, code:{},state:{}", code, state);
        WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code);
        String openId = accessToken.getOpenId();
        // 根据openId查找账号,如果不存在则新增绑定
        String sysUserId = sysUserService.loadByWxOpenId(openId);
        if (StringUtils.isNotBlank(sysUserId)) {
            // 执行登录
            LoginUser loginUser = sysUserService.getUserById(sysUserId);
            // 跳转到前端页面地址
            if (StringUtils.isNotBlank(state) && StringUtils.startsWith(state, "http")) {
                // 生成登录Token,返回给前端
                // 示例代码是通过Jwt生成Token,然后存储在Redis中
                String token = saveToken(loginUser);
                model.addAttribute("token", token);
                log.info("公众号自动登录,userId:{},wxOpenId:{}", loginUser.getId(), openId);
                return "redirect:" + state + "?token=" + token;
            }
        }
        log.info("公众号未绑定,wxOpenId:{}", openId);
        // 找不到已绑定记录,跳转到绑定页面,执行绑定
        return "redirect:" + wxProperties.getBindUrl() + "?wxOpenId=" + openId + "&state=" + state;
    }
    
    // ... 暂时忽略其他方法 ....//
}

2)编写账号绑定接口

先校验账号密码,然后把微信openId和用户userId绑定,下次登录时候就可以根据openId查询到userId

@Data
public class WxBindVo {
    @ApiModelProperty(value = "微信openId")
    private String wxOpenId;
    @ApiModelProperty(value = "账号")
    private String username;
    @ApiModelProperty(value = "密码")
    private String password;
}

@RequestMapping("/bind")
@ResponseBody
public Result<JSONObject> bind(@RequestBody WxBindVo wxBindVo) throws WxErrorException {
    log.info("wx bind, {}", wxBindVo);
    Result<JSONObject> result = new Result<>();
    JSONObject obj = new JSONObject();
    // 执行绑定,然后自动登录,等完成后跳转到原来的页面
    LoginUser loginUser = sysUserService.checkUser(wxBindVo.getUsername(), wxBindVo.getPassword());
    if (loginUser != null) {
        //绑定微信OpenId
        sysUserService.saveWxAccount(loginUser.getId(), wxBindVo.getWxOpenId());
        //用户登录信息
        obj.put("userInfo", loginUser);
        obj.put("token", saveToken(loginUser));
        result.setResult(obj);
        result.setSuccess(true);
        result.setCode(200);
        log.info("微信公众号绑定后自动登录,userId:{}, wxOpenId:{}", loginUser.getId(), wxBindVo.getWxOpenId());
        return result;
    }
    result.setResult(obj);
    result.setSuccess(false);
    result.setMessage("公众号登录失败,请联系管理员");
    return result;
}

3)编写微信公众号授权菜单入口

有了这个入口方法,只要将微信公众号菜单统一配置到这就可以,将需要打开的页面url传给state参数。

例如:http://api.test.com/wx/auth/index?state=http://www.test.com/home/index

/**
 * 微信公众号授权菜单入口
 * @param state 授权登录跳转的页面url
 */
@RequestMapping("/index")
public String index(String state) {
    String url = wxProperties.getCallback();
    String authorizationUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_BASE, URIUtil.encodeURIComponent(state));
    log.info("authorizationUrl = {}", authorizationUrl);
    return "redirect:" + authorizationUrl;
}

三、前端页面开发

当然,还有前端绑定页面开发,这里主要讲解流程,前端代码省略

四、在公众号中配置菜单

打开公众号“内容于互动-自定义菜单”,添加添加菜单,输入菜单名单和跳转网页链接

这里网页链接假设是:http://api.test.com/wx/auth/index?state=http://www.test.com/home/index

在这里插入图片描述

四、相关流程图

1、公众号授权登录时序图

在这里插入图片描述

2、公众号授权登录流程图

在这里插入图片描述

### 回答1: 微信公众号用户绑定是指将微信用户的身份信息与公众号进行绑定。这样,公众号就可以给用户提供个性化的服务,并跟踪用户的使用情况。 要进行微信公众号用户绑定,需要获取用户的授权。用户可以通过扫描二维码或者点击链接来进行授权。 在用户授权后,公众号可以使用 access_token 来获取用户的身份信息。access_token 是一个令牌,可以用来调用微信提供的接口,如获取用户信息、发送消息等。 获取 access_token 需要使用 appid 和 appsecret,这两个值是在微信公众平台注册公众号时获得的。可以使用以下方式获取 access_token: 1. 通过微信公众平台提供的接口:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 2. 使用微信开发工具包(如 wechat-sdk)提供的方法。 获取到 access_token 后,可以使用它来调用微信的各种接口,实现公众号的功能。 希望这些信息对您有帮助。 ### 回答2: 微信公众号用户绑定和获取access_token是指在开发微信公众号时,用户需要通过绑定微信公众号获取用户的唯一标识,同时需要获取access_token,用于进行微信公众号的接口调用。 微信公众号用户绑定是指将用户的微信账号与公众号进行关联。当用户使用微信扫描公众号的二维码或搜索公众号并关注后,用户的微信账号就会与公众号产生绑定关系。通过绑定公众号可以获取用户的微信唯一标识openid,并在后续的业务中使用该openid进行用户身份的识别和处理。用户绑定后,可以接收公众号的消息推送,参与互动等。 获取access_token是为了进行微信公众号的接口调用,如发送消息,获取用户信息等。access_token是公众号接口调用的全局唯一票据,在一定时间内有效。开发者可以使用appid和appsecret去微信开放平台接口获取access_token,获取成功后,可以保存起来在一定时间内复用,减少请求次数。在接口调用时,需要在请求中携带access_token,微信服务器会校验并返回相应的结果。 可以通过以下步骤来获取access_token: 1. 使用appid和appsecret向微信开放平台接口发送请求。 2. 微信开放平台接口验证appid和appsecret的正确性,并生成access_token。 3. 将生成的access_token保存起来,方便后续的接口调用使用。 总结:微信公众号用户绑定和获取access_token是在开发微信公众号时必要的步骤。用户绑定后,公众号可以获取用户的唯一标识openid,进行个性化推送等业务。获取access_token后,公众号可以使用该票据进行接口的调用,如发送消息,获取用户信息等。 ### 回答3: 微信公众号用户绑定是指将用户的微信账号与公众号进行绑定,让用户能够接收公众号的消息和使用公众号提供的服务。用户可以通过扫描公众号的二维码、点击公众号的链接或搜索公众号的名称等方式进行绑定绑定之后,用户可以在微信中收到公众号的推送消息,并能够参与公众号提供的互动内容。 获取access_token是为了进行微信公众号开发所必需的操作之一。access_token是用于调用接口的全局唯一凭证,每个公众号是唯一的。微信公众平台会为每个公众号生成一个有效期为2小时的access_token,并且提供了接口用于获取access_token。获取access_token的方法是使用公众号的唯一凭证AppID和AppSecret在微信公众平台接口中进行请求,返回结果中包含了access_token的值。 开发者可以利用access_token调用微信公众平台提供的各种接口,比如发送消息、获取用户信息等。在开发过程中,需要特别注意access_token的有效期,及时更新access_token以确保接口调用的正常进行。为了提高效率和安全性,可以将access_token保存在服务器中进行管理,每次需要使用时从服务器中获取最新的access_token进行调用。 总结来说,微信公众号用户绑定是为了让用户与公众号进行关联,而获取access_token是为了开发者能够调用各种微信公众平台接口进行开发。这两者都是微信公众号开发中非常重要的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顽石九变

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值