前言

用户登录原来的登录方式如下

1. 手机号+验证码

2. 账号+密码

运营觉得操作过于复杂, 因此想引入阿里自动登录的逻辑, 也就是号码认证服务,所以才有了这篇问文章

注: 本文只是记录Java端的实现, app端的请自行查询文档实现

官方资料

文档 : 什么是号码认证服务_号码认证服务(PNVS)-阿里云帮助中心

调试地址: GetMobile_云通信号码认证服务_API调试-阿里云OpenAPI开发者门户

错误码地址: 号码认证服务的服务端API返回码_号码认证服务(PNVS)-阿里云帮助中心

系统时序交互图

        其实并不复杂,简单说就是app获取token, 后端解析token,获取真正的手机号,但是经过阿里的加密可能会安全点咯

后端实现

引入依赖

参考来源 : 如何一键登录和本机号码校验GetMobile_号码认证服务(PNVS)-阿里云帮助中心

依赖如下:

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>dypnsapi20170525</artifactId>
  <version>1.0.6</version>
</dependency>

但是神奇的是没有提供具体的接口文档,或者是我自己没找到

工具类(直接使用)

@Slf4j
public class AliPhoneUtils {

    //阿里云基础信息
    private static final String KEY = "你的key";
    private static final String KEY_SECRET = "你的keySecret";
    //读取超时时间
    private static final int READ_TIME_OUT = 1000 * 10;
    //连接超时时间,防止系统卡死
    private static final int CONNECT_TIME_OUT = 1000 * 10;

    //成功标记
    private static final String SUCCESS = "OK";
    
    //只初始化一次即可
    private static Client client = null;


    static {
        try {
           initClient();
        } catch (Exception e) {
            log.error("初始化AliPhoneUtils->client失败");
        }
    }
    
    //初始化客户端
    private static void initClient() throws Exception{
        Config config = new Config();
        config.setAccessKeyId(KEY);
        config.setAccessKeySecret(KEY_SECRET);
        config.setReadTimeout(READ_TIME_OUT);
        config.setConnectTimeout(CONNECT_TIME_OUT);
        client = new Client(config);
    }

    //构建请求对象
    private static GetMobileRequest buildMobileRequest(String token) {

        GetMobileRequest mobileRequest = new GetMobileRequest();
        mobileRequest.setAccessToken(token);
        //可要可不要,应该是随机数之类的,但是不传也没影响,可能其他接口能用上这个值吧
//        mobileRequest.setOutId("");

        return mobileRequest;
    }

    public static AliPhoneResult getPhone(String token){

        GetMobileRequest mobileRequest = buildMobileRequest(token);

        AliPhoneResult aliPhoneResult = new AliPhoneResult();

        log.info("getPhone 参数:{}", JsonUtils.Object2Json(mobileRequest));

        try {

            GetMobileResponse mobileResponse = client.getMobile(mobileRequest);

            GetMobileResponseBody body = mobileResponse.getBody();
            GetMobileResponseBody.GetMobileResponseBodyGetMobileResultDTO mobileResultDTO = body.getMobileResultDTO;

            //成功逻辑
            if(Objects.equals(body.getCode(), SUCCESS) && mobileResultDTO != null) {
                aliPhoneResult.setSuccess(true);
                aliPhoneResult.setMobile(mobileResponse.getBody().getMobileResultDTO.getMobile());
            } else {
                //失败逻辑,可以根据文档确定具体是啥错
                //https://help.aliyun.com/zh/pnvs/developer-reference/api-return-code?spm=a2c4g.11186623.0.0.54c837fb7QGUJL
                aliPhoneResult.setErrorMsg(body.getMessage());
            }
            
            log.info("getPhone 返回参数:{}", JsonUtils.Object2Json(mobileResponse));
            log.info("getPhone 返回body参数:{}", JsonUtils.Object2Json(body));
        } catch (Exception e) {
            log.error("getPhone,异常", e);
            aliPhoneResult.setErrorMsg("请求阿里云失败");
        }

        return aliPhoneResult;
    }
    
    
    public static void main(String[] args) {


        String token = "token";


        System.out.println(getPhone(token));

    }
}

关联类

@Data
public class AliPhoneResult implements Serializable {

    private static final long serialVersionUID = 1L;

    //是否发送成功
    private boolean isSuccess;
    //错误消息
    private String errorMsg;
    //成功时返回的手机号
    private String mobile;
}

核心参数及获取

AccessKeyId、AccessKeySecret :   就是你账号信息(登录阿里云那个账号) (必须)

READ_TIME_OUT:  读取超时,不要因为阿里云影响你系统,单位为毫秒 (非必须)

CONNECT_TIME_OUT:  连接超时,不要因为阿里云影响你系统,单位毫秒(非必须)

其他的就没啥了,直接看代码,也可以查看以下类能配置的信息

com.aliyun.teaopenapi.models.Config

后续

        后面无非就是拿着手机号去进行注册或者登录,这里每个人业务可能不太一样,就没写了

总结

        这个功能其实并不复杂,只要理解了流程就能搞明白。所以建议大家有空还是可以多画画流程图的。不用想着啥,就当是为了自己,你画一遍下来自然就知道要干啥了

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐