創藍閃驗一鍵登錄(Java實現)

閃驗業務流程
官網提供了demo下載(有簽名工具類,發送http請求工具類,加解密工具類):
在這裏插入圖片描述
下面貼出核心業務代碼:

package com.pica.cloud.account.account.server.model;

import com.alibaba.fastjson.JSONObject;
import com.pica.cloud.account.account.server.entity.LogLoginOnekey;
import com.pica.cloud.account.account.server.entity.MobileDataEntity;
import com.pica.cloud.account.account.server.entity.QueryMobileEntity;
import com.pica.cloud.account.account.server.mapper.LogLoginOnekeyMapper;
import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.HttpUtil;
import com.pica.cloud.account.account.server.util.MD5;
import com.pica.cloud.account.account.server.util.RSAUtil;
import com.pica.cloud.account.account.server.util.SignUtils;
import org.apache.commons.lang3.StringUtils;
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.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 創藍閃驗-一鍵登錄
*/
@Component
public class OneClickProcessor {
    private static final String DEFAULT_ENCRYPT_TYPE = "0";

    private Logger logger = LoggerFactory.getLogger(this.getClass());
    //手機號加解密方式 0 AES 1 RSA , 可以不傳,不傳則手機號解密直接使用AES解密
    private String aesEncryptType = DEFAULT_ENCRYPT_TYPE;
    private String rsaEncryptType = "1";
    private String encryptType = DEFAULT_ENCRYPT_TYPE;
    private static final String SHANYAN_SUCCESS_CODE = "200000";
    //創建應用時填入的rsa公鑰對應的私鑰字符串
    public static final String privateKey = "";
    public static final Integer TYPE_IOS = 2;
    public static final Integer TYPE_ANDROID = 1;
    private static final String TOKEN = "token";
    private static final String APPID = "appId";
    private static final String ENCRYPT_TYPE = "encryptType";
    private static final String SIGN = "sign";

    @Value("${shanyan.url.mobilequery}")
    private String mobileQueryUrl;
    @Value("${shanyan.android.appId}")
    private String androidAppId;
    @Value("${shanyan.android.appKey}")
    private String androidAppKey;
    @Value("${shanyan.ios.appId}")
    private String iosAppId;
    @Value("${shanyan.ios.appKey}")
    private String iosAppKey;

    @Autowired
    private LogLoginOnekeyMapper logLoginOnekeyMapper;

    public QueryMobileEntity tokenExchangeMobile(String token, Integer type) {
        if (type == null || StringUtils.isEmpty(token)) {
            return null;
        }
        String appId;
        String appKey;
        if (type.equals(TYPE_ANDROID)) {
            appId = androidAppId;
            appKey = androidAppKey;
        } else if (type.equals(TYPE_IOS)) {
            appId = iosAppId;
            appKey = iosAppKey;
        } else {
            return null;
        }
        //從SDK獲取的token參數
        QueryMobileEntity queryMobileEntity = null;
        try {
            Map<String, String> params = new HashMap<>();
            params.put(TOKEN, token);
            params.put(APPID, appId);
            params.put(ENCRYPT_TYPE, encryptType);//可以不傳,不傳則解密直接使用AES解密
            params.put(SIGN, SignUtils.getSign(params, appKey));
            queryMobileEntity = HttpUtil.postForm(mobileQueryUrl, params, QueryMobileEntity.class);
            if (null != queryMobileEntity) {
                logger.info("一鍵登錄token換取手機號結果:{}", queryMobileEntity);
                String code = queryMobileEntity.getCode();     //返回碼 200000爲成功
                if (SHANYAN_SUCCESS_CODE.equals(code)) {
                    MobileDataEntity mobileDataEntity = queryMobileEntity.getData();
                    String mobile = mobileDataEntity.getMobileName();
                    if (aesEncryptType.equals(encryptType)) {
                        String key = MD5.getMD5Code(appKey);
                        mobile = AESUtil.decrypt(mobile, key.substring(0, 16), key.substring(16));
                    } else if (rsaEncryptType.equals(encryptType)) {
                        mobile = RSAUtil.decryptByPrivateKeyForLongStr(mobile, privateKey);
                    }
                    queryMobileEntity.setMobile(mobile);
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        return queryMobileEntity;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章