提交 4d7af4f0 编写于 作者: wfy's avatar wfy

闪验:登录demo

上级 8ecde431
流水线 #21556 已失败 于阶段
in 0 second
...@@ -211,9 +211,8 @@ public class LoginController extends AccountBaseController { ...@@ -211,9 +211,8 @@ public class LoginController extends AccountBaseController {
@ApiOperation(value = "app端手机号码一键登录") @ApiOperation(value = "app端手机号码一键登录")
@PostMapping("/login/one-click") @PostMapping("/login/one-click")
public PicaResponse<OneClickLoginResultVo> oneClickLogin(@RequestBody OneClickLoginReq req){ public PicaResponse<OneClickLoginResultVo> oneClickLogin(@RequestBody OneClickLoginReq req) {
OneClickLoginResultVo oneClickLoginResultVo = new OneClickLoginResultVo(); OneClickLoginResultVo oneClickLoginResultVo = loginService.oneClickLogin(req);
oneClickLoginResultVo = loginService.oneClickLogin(req);
return PicaResponse.toResponse(oneClickLoginResultVo); return PicaResponse.toResponse(oneClickLoginResultVo);
} }
} }
package com.pica.cloud.account.account.server.entity;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:09
*/
public class MobileDataEntity {
private String mobileName;
private String tradeNo;
private Integer fanqizha;
private String tag;
public String getMobileName() {
return mobileName;
}
public void setMobileName(String mobileName) {
this.mobileName = mobileName;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public Integer getFanqizha() {
return fanqizha;
}
public void setFanqizha(Integer fanqizha) {
this.fanqizha = fanqizha;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
}
package com.pica.cloud.account.account.server.entity;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:06
*/
public class QueryMobileEntity {
private String code;
private String message;
private Integer chargeStatus;
private MobileDataEntity data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getChargeStatus() {
return chargeStatus;
}
public void setChargeStatus(Integer chargeStatus) {
this.chargeStatus = chargeStatus;
}
public MobileDataEntity getData() {
return data;
}
public void setData(MobileDataEntity data) {
this.data = data;
}
@Override
public String toString() {
return "QueryMobileEntity{" +
"code='" + code + '\'' +
", message='" + message + '\'' +
", chargeStatus=" + chargeStatus +
", data=" + data +
'}';
}
}
package com.pica.cloud.account.account.server.req;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 15:58
*/
public class OneClickLoginReq {
private Integer type = 0;
private String token = "";
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
package com.pica.cloud.account.account.server.req;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:11
*/
public class QueryMobileReq {
private String token;
private String appId;
private String clientIp;
private String encryptType;
private String outId;
private String sign;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getClientIp() {
return clientIp;
}
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
public String getEncryptType() {
return encryptType;
}
public void setEncryptType(String encryptType) {
this.encryptType = encryptType;
}
public String getOutId() {
return outId;
}
public void setOutId(String outId) {
this.outId = outId;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
}
...@@ -431,10 +431,10 @@ public class LoginServiceImpl implements LoginService { ...@@ -431,10 +431,10 @@ public class LoginServiceImpl implements LoginService {
String code = queryMobileEntity.getCode(); //返回码 200000为成功 String code = queryMobileEntity.getCode(); //返回码 200000为成功
String message = queryMobileEntity.getMessage();//返回消息 String message = queryMobileEntity.getMessage();//返回消息
Integer chargeStatus = queryMobileEntity.getChargeStatus(); //是否收费 Integer chargeStatus = queryMobileEntity.getChargeStatus(); //是否收费
o.setQueryMobileEntity(queryMobileEntity);
if ("200000".equals(code)) { if ("200000".equals(code)) {
MobileDataEntity mobileDataEntity = queryMobileEntity.getData(); MobileDataEntity mobileDataEntity = queryMobileEntity.getData();
String mobile = mobileDataEntity.getMobileName(); String mobile = mobileDataEntity.getMobileName();
String tradeNo = mobileDataEntity.getTradeNo();//交易流水号
if ("0".equals(encryptType)) { if ("0".equals(encryptType)) {
String key = MD5.getMD5Code(appKey); String key = MD5.getMD5Code(appKey);
mobile = AESUtil.decrypt(mobile, key.substring(0, 16), key.substring(16)); mobile = AESUtil.decrypt(mobile, key.substring(0, 16), key.substring(16));
...@@ -442,11 +442,7 @@ public class LoginServiceImpl implements LoginService { ...@@ -442,11 +442,7 @@ public class LoginServiceImpl implements LoginService {
mobile = RSAUtil.decryptByPrivateKeyForLongStr(mobile, privateKey); mobile = RSAUtil.decryptByPrivateKeyForLongStr(mobile, privateKey);
} }
System.out.println("mobile:" + mobile); //解密后的手机号码 System.out.println("mobile:" + mobile); //解密后的手机号码
o.setMobile(mobile); queryMobileEntity.getData().setMobileName(mobile);
o.setFanqizha(mobileDataEntity.getFanqizha());
o.setTag(mobileDataEntity.getTag());
o.setTradeNo(tradeNo);
o.setMessage(message);
} }
} }
} catch (Exception e) { } catch (Exception e) {
......
package com.pica.cloud.account.account.server.util;
public final class Base64 {
/**
* Base64编码表。
*/
private static final char[] BASE64CODE = { 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '+', '/', };
/**
* Base64解码表。
*/
private static final byte[] BASE64DECODE = { -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1,
-1,
-1, // 注意两个63,为兼容SMP,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 63,
-1,
63, // “/”和“-”都翻译成63。
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, // 注意两个0:
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1,
-1, // “A”和“=”都翻译成0。
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, };
private static final int HEX_255 = 0x0000ff;
private static final int HEX_16515072 = 0xfc0000;
private static final int HEX_258048 = 0x3f000;
private static final int HEX_4032 = 0xfc0;
private static final int HEX_63 = 0x3f;
private static final int HEX_16711680 = 0xff0000;
private static final int HEX_65280 = 0x00ff00;
private static final int NUMBER_TWO = 2;
private static final int NUMBER_THREE = 3;
private static final int NUMBER_FOUR = 4;
private static final int NUMBER_SIX = 6;
private static final int NUMBER_EIGHT = 8;
private static final int NUMBER_TWELVE = 12;
private static final int NUMBER_SIXTEEN = 16;
private static final int NUMBER_EIGHTEEN = 18;
/**
* 构造方法私有化,防止实例化。
*/
private Base64() {
}
/**
* Base64编码。将字节数组中字节3个一组编码成4个可见字符。
*
* @param b
* 需要被编码的字节数据。
* @return 编码后的Base64字符串。
*/
public static String encode(byte[] b) {
int code = 0;
// 按实际编码后长度开辟内存,加快速度
StringBuffer sb = new StringBuffer(
((b.length - 1) / NUMBER_THREE) << NUMBER_TWO + NUMBER_FOUR);
// 进行编码
for (int i = 0; i < b.length; i++) {
code |= (b[i] << (NUMBER_SIXTEEN - i % NUMBER_THREE * NUMBER_EIGHT))
& (HEX_255 << (NUMBER_SIXTEEN - i % NUMBER_THREE
* NUMBER_EIGHT));
if (i % NUMBER_THREE == NUMBER_TWO || i == b.length - 1) {
sb.append(BASE64CODE[(code & HEX_16515072) >>> NUMBER_EIGHTEEN]);
sb.append(BASE64CODE[(code & HEX_258048) >>> NUMBER_TWELVE]);
sb.append(BASE64CODE[(code & HEX_4032) >>> NUMBER_SIX]);
sb.append(BASE64CODE[code & HEX_63]);
code = 0;
}
}
// 对于长度非3的整数倍的字节数组,编码前先补0,编码后结尾处编码用=代替,
// =的个数和短缺的长度一致,以此来标识出数据实际长度
if (b.length % NUMBER_THREE > 0) {
sb.setCharAt(sb.length() - 1, '=');
}
if (b.length % NUMBER_THREE == 1) {
sb.setCharAt(sb.length() - NUMBER_TWO, '=');
}
return sb.toString();
}
/**
* Base64解码。
*
* @param code
* 用Base64编码的ASCII字符串
* @return 解码后的字节数据
*/
public static byte[] decode(String code) {
// 检查参数合法性
if (code == null) {
return null;
}
int len = code.length();
if (len % NUMBER_FOUR != 0) {
throw new IllegalArgumentException(
"Base64 string length must be 4*n");
}
if (code.length() == 0) {
return new byte[0];
}
// 统计填充的等号个数
int pad = 0;
if (code.charAt(len - 1) == '=') {
pad++;
}
if (code.charAt(len - NUMBER_TWO) == '=') {
pad++;
}
// 根据填充等号的个数来计算实际数据长度
int retLen = len / NUMBER_FOUR * NUMBER_THREE - pad;
// 分配字节数组空间
byte[] ret = new byte[retLen];
// 查表解码
char ch1, ch2, ch3, ch4;
int i;
for (i = 0; i < len; i += NUMBER_FOUR) {
int j = i / NUMBER_FOUR * NUMBER_THREE;
ch1 = code.charAt(i);
ch2 = code.charAt(i + 1);
ch3 = code.charAt(i + NUMBER_TWO);
ch4 = code.charAt(i + NUMBER_THREE);
int tmp = (BASE64DECODE[ch1] << NUMBER_EIGHTEEN)
| (BASE64DECODE[ch2] << NUMBER_TWELVE)
| (BASE64DECODE[ch3] << NUMBER_SIX) | (BASE64DECODE[ch4]);
ret[j] = (byte) ((tmp & HEX_16711680) >> NUMBER_SIXTEEN);
if (i < len - NUMBER_FOUR) {
ret[j + 1] = (byte) ((tmp & HEX_65280) >> NUMBER_EIGHT);
ret[j + NUMBER_TWO] = (byte) ((tmp & HEX_255));
} else {
if (j + 1 < retLen) {
ret[j + 1] = (byte) ((tmp & HEX_65280) >> NUMBER_EIGHT);
}
if (j + NUMBER_TWO < retLen) {
ret[j + NUMBER_TWO] = (byte) ((tmp & HEX_255));
}
}
}
return ret;
}
}
package com.pica.cloud.account.account.server.util;
/**
* 格式化操作类
*/
public class ByteFormat {
private static final char[] HEX = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public ByteFormat() {
}
public static final String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length);
for (int i = 0; i < bArray.length; ++i) {
String sTemp = Integer.toHexString(255 & bArray[i]);
if (sTemp.length() < 2) {
sb.append(0);
}
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
public static byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else {
char[] hex = str.toCharArray();
int length = hex.length / 2;
byte[] raw = new byte[length];
for (int i = 0; i < length; ++i) {
int high = Character.digit(hex[i * 2], 16);
int low = Character.digit(hex[i * 2 + 1], 16);
int value = high << 4 | low;
if (value > 127) {
value -= 256;
}
raw[i] = (byte) value;
}
return raw;
}
}
public static void main(String[] args) {
byte[] data = new byte[65536];
for (int i = 0; i < data.length; ++i) {
data[i] = (byte) i;
}
}
}
package com.pica.cloud.account.account.server.util;
import com.alibaba.fastjson.JSON;
import com.pica.cloud.foundation.utils.utils.HttpClientUtil;
import com.pica.cloud.foundation.utils.utils.StringUtil;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Iterator;
import java.util.Map;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:45
*/
public class HttpUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
private static final CloseableHttpClient hc;
static {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setDefaultMaxPerRoute(20);
cm.setMaxTotal(200);
hc = HttpClients.custom().setConnectionManager(cm).build();
}
public static Object postForm(String url, Map<String, String> params, Class clazz) throws IOException, URISyntaxException {
URIBuilder builder = new URIBuilder(url);
if (params != null && params.size() > 0) {
params.forEach((k,v) -> {
builder.setParameter(k, v);
});
}
HttpPost post = new HttpPost(builder.build());
CloseableHttpResponse resp = null;
Object data;
try {
resp = hc.execute(post);
String buf = IOUtils.toString(resp.getEntity().getContent(), "utf-8");
data = StringUtil.isNotNull(buf) ? JSON.parseObject(buf, clazz) : null;
} finally {
if (resp != null) {
try {
resp.close();
} catch (IOException var12) {
logger.error(var12.getMessage());
}
}
}
return data;
}
}
package com.pica.cloud.account.account.server.util;
import java.security.MessageDigest;
public class MD5 {
// 全局数组
private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f","g","h","j","?","~" };
// 返回形式为数字跟字符串
private static String byteToArrayString(byte bByte) {
int iRet = bByte;
if (iRet < 0) {
iRet += 256;
}
int iD1 = iRet / 16;
int iD2 = iRet % 16;
return strDigits[iD1] + strDigits[iD2];
}
// 转换字节数组为16进制字串
private static String byteToString(byte[] bByte) {
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < bByte.length; i++) {
sBuffer.append(byteToArrayString(bByte[i]));
}
return sBuffer.toString();
}
public static String getMD5Code(String strObj) {
String resultString = null;
try {
resultString = new String(strObj);
MessageDigest md = MessageDigest.getInstance("MD5");
// md.digest() 该函数返回值为存放哈希值结果的byte数组
resultString = byteToString(md.digest(strObj.getBytes("UTF-8")));
} catch (Exception ex) {
ex.printStackTrace();
}
return resultString;
}
}
package com.pica.cloud.account.account.server.util;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
import java.util.Map;
/**
* Description:签名工具类
* User: liutao
* Date: 2019-09-11
* Time: 10:29
*/
public class SignUtils {
public static String getSign(Map<String, String> requestMap, String appKey) {
return hmacSHA256Encrypt(requestMap2Str(requestMap), appKey);
}
private static String hmacSHA256Encrypt(String encryptText, String encryptKey) {
byte[] result = null;
try {
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKeySpec signinKey = new SecretKeySpec(encryptKey.getBytes("UTF-8"), "HmacSHA256");
//生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance("HmacSHA256");
//用给定密钥初始化 Mac 对象
mac.init(signinKey);
//完成 Mac 操作
byte[] rawHmac = mac.doFinal(encryptText.getBytes("UTF-8"));
return ByteFormat.bytesToHexString(rawHmac);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String requestMap2Str(Map<String, String> requestMap) {
String[] keys = requestMap.keySet().toArray(new String[0]);
Arrays.sort(keys);
StringBuilder stringBuilder = new StringBuilder();
for (String str : keys) {
if (!str.equals("sign")) {
stringBuilder.append(str).append(requestMap.get(str));
}
}
return stringBuilder.toString();
}
}
package com.pica.cloud.account.account.server.vo;
import com.pica.cloud.account.account.server.entity.QueryMobileEntity;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 16:01
*/
public class OneClickLoginResultVo {
private QueryMobileEntity queryMobileEntity;
public QueryMobileEntity getQueryMobileEntity() {
return queryMobileEntity;
}
public void setQueryMobileEntity(QueryMobileEntity queryMobileEntity) {
this.queryMobileEntity = queryMobileEntity;
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册