微信登入获取用户唯一标识(后端实现)

最近工作中碰到与安卓对接一系列的平台登录功能,众所周知,登录之后对用户经行持久化操作的前提是得获取用户得唯一标识,今天就来讲讲如何对接微信登录后获取到用户得唯一标识

目录

前言

一、准备工作

二、实现逻辑(后端)

1.查看所需参数

 2.查看返回结果

 3.代码实现

总结


前言

        在做软件开发中,与第三方平台互联是必不可少的,当出现要调用第三方接口的时候,我们可以先了解接口调用的时序图,一般会出现在平台官网提供的第三方接口开放平台,其次是需要了解到接口的传参以及回参,如何调用,如何接收,本文以微信登录为例,讲解如何通过官网提供的文档来进行的接口调用。


一、准备工作

         在调用任何第三方平台接口之前一定要去平台的官网上查看接口的流程,前提是什么,这里可以通过下面链接查看

微信官方文档 | 开放平台

         在调用接口之前,我们需要注册这个平台的开发者账号,成为开发者,并且拥有一个已审核通过的网站应用,并获得相应的 AppID 和AppSecret(这些参数在接口调用中需要涉及),申请微信登录且通过审核后,即可开始接入流程。在官网的开饭平台文档上,也可以了解到接口调用的时序图,这可以让我们了解如何分工。

二、实现逻辑(后端)

        这我们后端只需要实现后端的接口调用即可,code一般是前端调用获取之后返回给我们服务器端,我们接收到这个code(零时凭证)之后可获得相关参数

1.查看所需参数

 通过 code 获取access_token

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

 可以看出,接口调用的方式其实并不难,是简单的Get请求,需要的参数是我们注册的开发者账号申请的应用中的参数AppId和Secret,Code是前端传给我们的,还有一个是固定值

 2.查看返回结果

         返回结果的类型并没有code,msg这些包装的,也比较好处理,在返回结果中我们可以拿到我们想要的结果,比如此次我们只要拿到用户的唯一标识openId,这个唯一是指用户在这个我们注册开发者账号申请的应用中是唯一的,也就是说openId+AppID是唯一的

 3.代码实现

package com.lyj.biz.login;


import com.alibaba.fastjson.JSONObject;
import com.lyj.biz.domain.valueobject.UserLoginInfo;
import com.lyj.biz.enums.LoginTypeEnum;
import com.lyj.biz.param.UserLoginParam;
import com.lyj.common.exception.BaseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.Date;


/**
 * 微信号登入策略.
 */
@Component
public class WeCheatLoginStrategy implements LoginStrategy {

    private static final Logger log = LoggerFactory.getLogger(WeCheatLoginStrategy.class);

    private static final String ERR_CODE = "errcode";

    private static final String OPEN_ID = "openid";

    private static final String WX_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
    private static final String AUTHORIZATION_CODE = "authorization_code";

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

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

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public boolean support(String loginType) {
        return LoginTypeEnum.WE_CHAT.getType().equals(loginType);
    }

    @Override
    public UserLoginInfo login(UserLoginParam userLoginParam) {
        // 零时凭证code
        String code = userLoginParam.getLoginId();
        log.info("获取微信信息入参,code:{}", code);

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(WX_ACCESS_TOKEN_URL)
                .queryParam("appid", appId)
                .queryParam("secret", appSecret)
                .queryParam("code", code)
                .queryParam("grant_type", AUTHORIZATION_CODE);
        ResponseEntity<JSONObject> response = restTemplate.exchange(builder.toUriString(),
                HttpMethod.GET,
                null,
                JSONObject.class);
        JSONObject body = response.getBody();
        log.info("拉取微信信息返回结果:{}", body);
        if (body == null || null != body.getString(ERR_CODE)) {
            throw new BaseException("获取微信信息失败");
        }
        String openId = body.getString(OPEN_ID);

//            String access_token = Convert.toStr(data.get("access_token"));
//            String expires_in = Convert.toStr(data.get("expires_in"));
//            String refresh_token = Convert.toStr(data.get("refresh_token"));
//            String unionid = Convert.toStr(data.get("unionid"));

        return UserLoginInfo.builder()
                .loginId(openId)
                .loginType(LoginTypeEnum.WE_CHAT)
                .loginTime(new Date())
                .build();
    }
}

         接口调用我用的是spring提供的webclient的第三方接口调用封装类Rest Template,功能十分强大,配合UriComponentsBuilder可以模拟许多接口请求,比较简单的接口调用也可以使用httpclient,在获取微信小程序用户唯一标识时我也有使用到,大家可以去参观参观。对于结果返回,用Json处理一下就能得到


总结

        与第三方平台互联时程序员开发路上不可避免地,可以系统的学习一下接口的模拟请求,多浏览平台的官方文档,也是挺有益处。以上就是我通过RestTemplate请求第三方接口拿到我想要的数据,实现我碰到的需求功能。大家有不足的地方或者更好的建议可以提出来,互相进步!

猜你喜欢

转载自blog.csdn.net/liyingjie2001/article/details/128123498