Commit 0f190781 by 霍志良

Merge remote-tracking branch 'origin/4.1.64' into 4.1.64

parents 297404a4 a1ed8f19
package com.yidianling.user.http;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
import com.ydl.burypointlib.MD5Util;
import com.ydl.ydlcommon.base.BaseApp;
import com.ydl.ydlcommon.base.config.HttpConfig;
import com.yidianling.common.tools.RxAppTool;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by Ykai on 2021/1/11.
*
* 获取加密参数类
*/
public class EncryptionParams {
@RequiresApi(api = Build.VERSION_CODES.N)
public static Map<String,String> getParams(String path){
String timestamp = String.valueOf(System.currentTimeMillis()); //值应该为毫秒数的字符串形式
Map<String,String> map = new HashMap<>();
map.put("timestamp",timestamp);
map.put("path",path);
map.put("version", "1.0.0");
List<String> storedKeys = Arrays.stream(map.keySet()
.toArray(new String[]{}))
.sorted(Comparator.naturalOrder())
.collect(Collectors.toList());
String sign = storedKeys.stream()
// .map(key -> String.join("", key, map.get(key)))
.map(key -> key+map.get(key))
.collect(Collectors.joining()).trim()
.concat("ABA88F2FF7E64A688D2213B20A9B3A3E");
Log.e("sign",sign);
sign = MD5Util.md5(sign).toUpperCase();
// sign = MD5.md5(sign).toUpperCase();
Log.e("sign",sign);
Map<String,String> headersMap = new HashMap<>();
headersMap.put("appKey","20BB42485BD448DE888DD745899C457D");
headersMap.put("sign",sign);
// headersMap.put("sign","2410C6CDC7235DC6318F5CF0FFFAA0B7");
headersMap.put("timestamp",timestamp);
// headersMap.put("timestamp","1610352010360");
return headersMap;
}
}
......@@ -34,8 +34,8 @@ class LoginApiRequestUtil {
/**
* 校验手机号:是否是用户版号码、是否有设置密码、是否被绑定
*/
fun checkPhoneStatus(map :Map<String,String>,phone: String, countryCode: String?): Observable<BaseResponse<ChcekPhoneResponeBean>> {
return getUserApi().checkPhoneStatus(map,phone, countryCode!!)
fun checkPhoneStatus(phone: String, countryCode: String?): Observable<BaseResponse<ChcekPhoneResponeBean>> {
return getUserApi().checkPhoneStatus(phone, countryCode!!)
}
/**
......
package com.yidianling.user.http;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
public static final char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static String toHexString(byte[] b) {
StringBuffer sb = new StringBuffer(b.length * 2);
for (int i = 0; i < b.length; i++) {
sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
sb.append(HEX_DIGITS[b[i] & 0x0f]);
}
return sb.toString();
}
/**
* md5加密字符串
*
* @param s
* @return
*/
public static String md5(String s) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
return toHexString(messageDigest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
}
......@@ -194,7 +194,7 @@ interface UserApi {
*/
@GET("login/v2/phone_detection")
@Headers(YDL_DOMAIN+ YDL_DOMAIN_LOGIN_BASE_URL,LOGIN_USER_PORT)
fun checkPhoneStatus(@HeaderMap headMap:Map<String,String>,@Query("phone") phone: String, @Query("countryCode") countryCode: String): Observable<BaseResponse<ChcekPhoneResponeBean>>
fun checkPhoneStatus(@Query("phone") phone: String, @Query("countryCode") countryCode: String): Observable<BaseResponse<ChcekPhoneResponeBean>>
/**
* 验证重置密码的短信验证码
......
......@@ -31,7 +31,6 @@ import com.yidianling.user.UserConstants;
import com.yidianling.user.UserHelper;
import com.yidianling.user.api.event.RefreshRecentContactListEvent;
import com.yidianling.user.event.UpdateBindStatusEvent;
import com.yidianling.user.http.EncryptionParams;
import com.yidianling.user.http.LoginApiRequestUtil;
import com.yidianling.user.http.UserHttp;
import com.yidianling.user.http.UserHttpImpl;
......@@ -118,8 +117,7 @@ public class AccountSettingActivity extends BaseActivity implements View.OnClick
return;
}
showProgressDialog();
Map<String,String> map = EncryptionParams.getParams("/api/api/login/v2/phone_detection");
LoginApiRequestUtil.Companion.checkPhoneStatus(map,UserHelper.INSTANCE.getUserInfo().getUserInfo().getPhone(), UserHelper.INSTANCE.getUserInfo().getUserInfo().getCountry_code())
LoginApiRequestUtil.Companion.checkPhoneStatus(UserHelper.INSTANCE.getUserInfo().getUserInfo().getPhone(), UserHelper.INSTANCE.getUserInfo().getUserInfo().getCountry_code())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {
......
......@@ -44,7 +44,6 @@ import com.yidianling.user.UserHelper
import com.yidianling.user.api.bean.UserResponseBean
import com.yidianling.user.bean.AliAuthBean
import com.yidianling.user.constants.UserBIConstants
import com.yidianling.user.http.EncryptionParams
import com.yidianling.user.http.request.BindPhoneJavaParam
import com.yidianling.user.http.request.PhoneLoginAutoParam
import com.yidianling.user.http.response.ChcekPhoneResponeBean
......@@ -396,8 +395,7 @@ class RegisterAndLoginActivity : BaseMvpActivity<ILoginContract.View, ILoginCont
return@setOnClickListener
}
if (checkPhone()) {
val map = EncryptionParams.getParams("/api/api/login/v2/phone_detection")
mPresenter.checkPhoneStatus(map,userPhoneNumber!!, countryCode!!, isUmengLoginState)
mPresenter.checkPhoneStatus(userPhoneNumber!!, countryCode!!, isUmengLoginState)
}
}
......
......@@ -97,7 +97,7 @@ interface ILoginContract {
/**
* 校验手机号:是否是用户版号码、是否有设置密码、是否被绑定
*/
fun checkPhoneStatus(map: Map<String,String>,phone: String, countryCode: String, isBind: Boolean)
fun checkPhoneStatus(phone: String, countryCode: String, isBind: Boolean)
/**
* 通过一键认证服务登陆
......@@ -120,7 +120,7 @@ interface ILoginContract {
/**
* 校验手机号:是否是用户版号码、是否有设置密码、是否被绑定
*/
fun checkPhoneStatus(map: Map<String,String>,phone: String, countryCode: String): Observable<BaseResponse<ChcekPhoneResponeBean>>
fun checkPhoneStatus(phone: String, countryCode: String): Observable<BaseResponse<ChcekPhoneResponeBean>>
/**
......
......@@ -48,8 +48,8 @@ class LoginModelImpl : ILoginContract.Model {
/**
* 校验手机号:是否是用户版号码、是否有设置密码、是否被绑定
*/
override fun checkPhoneStatus(map:Map<String,String>,phone: String, countryCode: String): Observable<BaseResponse<ChcekPhoneResponeBean>> {
return LoginApiRequestUtil.checkPhoneStatus(map,phone, countryCode)
override fun checkPhoneStatus(phone: String, countryCode: String): Observable<BaseResponse<ChcekPhoneResponeBean>> {
return LoginApiRequestUtil.checkPhoneStatus(phone, countryCode)
}
/**
......
......@@ -131,9 +131,9 @@ class LoginPresenterImpl(view: ILoginContract.View) : BasePresenter<ILoginContra
*@param isBind 是否是第三方登录成功后的绑定操作
*/
@SuppressLint("CheckResult")
override fun checkPhoneStatus(map: Map<String,String>,phone: String, countryCode: String, isBind: Boolean) {
override fun checkPhoneStatus(phone: String, countryCode: String, isBind: Boolean) {
mView.showLoading(true)
mModel.checkPhoneStatus(map,phone, countryCode)
mModel.checkPhoneStatus(phone, countryCode)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
......
......@@ -2,11 +2,9 @@ package com.ydl.ydlcommon.base.config;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
import com.ydl.burypointlib.MD5Util;
import com.ydl.ydlcommon.base.BaseApp;
import com.yidianling.common.tools.RxAppTool;
import com.ydl.ydlcommon.utils.LogUtil;
import java.util.Arrays;
import java.util.Comparator;
......@@ -22,29 +20,23 @@ import java.util.stream.Collectors;
*/
public class EncryptionParams {
@RequiresApi(api = Build.VERSION_CODES.N)
public static Map<String,String> getParams(String path){
String timestamp = String.valueOf(System.currentTimeMillis()); //值应该为毫秒数的字符串形式
Map<String,String> map = new HashMap<>();
map.put("timestamp",timestamp);
map.put("path",path);
map.put("version", RxAppTool.getAppVersionName(BaseApp.Companion.getApp()));
List<String> storedKeys = Arrays.stream(map.keySet()
.toArray(new String[]{}))
.sorted(Comparator.naturalOrder())
.collect(Collectors.toList());
String sign = storedKeys.stream()
.map(key -> String.join("", key, map.get(key)))
.collect(Collectors.joining()).trim()
.concat(HttpConfig.Companion.getENCRYPTION_APP_SECRET());
public static String getSign(String path,String timestamp){
// Map<String,String> map = new HashMap<>();
// map.put("timestamp",timestamp);
// map.put("path",path);
// map.put("version", "1.0.0");
//
// List<String> storedKeys = Arrays.stream(map.keySet()
// .toArray(new String[]{}))
// .sorted(Comparator.naturalOrder())
// .collect(Collectors.toList());
// String sign = storedKeys.stream()
// .map(key -> key+map.get(key))
// .collect(Collectors.joining()).trim()
// .concat();
String sign = ("path"+path+"timestamp"+timestamp+"version1.0.0").concat(HttpConfig.Companion.getENCRYPTION_APP_SECRET());
LogUtil.e("sign",sign);
sign = MD5Util.md5(sign).toUpperCase();
Log.e("sign",sign);
Map<String,String> headersMap = new HashMap<>();
headersMap.put("appKey",HttpConfig.Companion.getENCRYPTION_APP_KEY());
headersMap.put("sign",sign);
headersMap.put("timestamp",timestamp);
return headersMap;
return sign;
}
}
......@@ -45,7 +45,7 @@ class HttpConfig {
private const val AUTHORIZATION_NAME = "Authorization"
private const val AUTHORIZATION_JAVA_NAME = "AuthorizationJava"
private const val SESSION_KEY = "dc59cf294f37d237c1f06240568ffe21"
private var DYNAMIC_SESSION_KEY :String= "dc59cf294f37d237c1f06240568ffe21"
private var DYNAMIC_SESSION_KEY: String = "dc59cf294f37d237c1f06240568ffe21"
private const val YDL = "Ydl"
private const val UID = "uid"
......@@ -56,7 +56,9 @@ class HttpConfig {
private const val VERSION = "version"
private const val TOKEN = "accessToken"
private val OS_TYPE = "osType"// 1.ios 2.android
private val APP_NAME = "appName"//用于标识 是哪个应用 yidianling:用户版 xinlizixun:心理咨询 haoshi:情感壹点灵 zhuanjia:专家版
private val APP_NAME =
"appName"//用于标识 是哪个应用 yidianling:用户版 xinlizixun:心理咨询 haoshi:情感壹点灵 zhuanjia:专家版
//验证签名失败
private val AUTH_INEFFECTIVE_CODE = "-201"
......@@ -65,38 +67,47 @@ class HttpConfig {
* PHP API 地址
*/
var PHP_BASE_URL = ""
/**
* Java API 地址
*/
var JAVA_BASE_URL = ""
/**
* YDL H5 地址
*/
var YDL_H5 = ""
/**
* H5 地址
*/
var H5_URL = ""
/**
* M站 地址
*/
var MH5_URL = ""
/**
* 新 H5 地址
*/
var WEB_URL = ""
/**
* Java API 域名
*/
var JAVA_URL = ""
/**
* h5耗时统计 java服务器api地址
*/
var SERVER_TEMP_JAVA_URL = ""
/**
* Java 投放系统 地址
*/
var JAVA_CAST_URL = ""
/**
* 行为数据 地址
*/
......@@ -124,13 +135,17 @@ class HttpConfig {
val builder = OkHttpConfig.Builder(context);
if (appDebug) {
builder.setNetInterceptor(StethoInterceptor())
}else{
} else {
//使用预埋证书,校验服务端证书
builder.setSslSocketFactory(cerInputStream)
}
return builder
.setInterceptor(commonParams(),requestHead(appName))
.setInterceptor(
commonParams(),
requestHead(appName),
addEncryptionHeaderParamsInterceptor()
)
.setRequestHandler(getRequestHandler())
.setReadTimeout(15)
.setWriteTimeout(15)
......@@ -142,44 +157,70 @@ class HttpConfig {
/**
* 开启动态网关,请求头某些参数加密
*/
// private fun addEncryptionHeaderParams():Interceptor{
// return Interceptor {
// var request = it.request()
// }
// }
private fun getRequestHandler():RequestHandler{
return object :RequestHandler{
override fun onHttpResultResponse(
httpResult: String,
chain: Interceptor.Chain,
response: Response
): Response {
try {
val gson = GsonProvider.getGson()
val resultData= gson.fromJson(httpResult, BaseAPIResponse::class.java)
when (resultData.code) {
AUTH_INEFFECTIVE_CODE -> {
private fun addEncryptionHeaderParamsInterceptor(): Interceptor {
return Interceptor {
if (isEncryption) {
val timestamp = System.currentTimeMillis().toString() //值应该为毫秒数的字符串形式
var path = HttpUrl.parse(JAVA_LOGIN_BASE_URL)?.encodedPath()
when {
it.request().url().encodedPath().startsWith("/v3") -> {
path += it.request().url().encodedPath().substring(4)
}
it.request().url().encodedPath().startsWith("/api") -> {
path += it.request().url().encodedPath().substring(5)
}
else -> {
path+it.request().url().encodedPath()
}
}
val sign = EncryptionParams.getSign(path, timestamp)
val request = it.request().newBuilder()
.addHeader("appKey", ENCRYPTION_APP_KEY)
.addHeader("sign", sign)
.addHeader("timestamp", timestamp)
.build()
it.proceed(request)
}else{
it.proceed(it.request())
}
}
}
private fun getRequestHandler(): RequestHandler {
return object : RequestHandler {
override fun onHttpResultResponse(
httpResult: String,
chain: Interceptor.Chain,
response: Response
): Response {
try {
val gson = GsonProvider.getGson()
val resultData = gson.fromJson(httpResult, BaseAPIResponse::class.java)
when (resultData.code) {
AUTH_INEFFECTIVE_CODE -> {
//签证签名失败
ToastUtil.toastShort(resultData.msg)
//更新动态密钥
if (resultData.data!=null){
var authBean = gson.fromJson<AuthBean>(gson.toJson(resultData.data),AuthBean::class.java)
DYNAMIC_SESSION_KEY = authBean?.appKey.toString()
}
}
}
} catch (e: Exception) {
LogUtil.e("getRequestHandler:$e")
}
return response
}
override fun onHttpRequestBefore(chain: Interceptor.Chain?, request: Request): Request {
return request
}
}
//更新动态密钥
if (resultData.data != null) {
var authBean = gson.fromJson<AuthBean>(
gson.toJson(resultData.data),
AuthBean::class.java
)
DYNAMIC_SESSION_KEY = authBean?.appKey.toString()
}
}
}
} catch (e: Exception) {
LogUtil.e("getRequestHandler:$e")
}
return response
}
override fun onHttpRequestBefore(chain: Interceptor.Chain?, request: Request): Request {
return request
}
}
}
// 添加公共参数
......@@ -187,7 +228,7 @@ class HttpConfig {
return Interceptor {
var request = it.request()
//如果是POST请求,则再在Body中增加公共参数
if ("POST"==request.method()){
if ("POST" == request.method()) {
var body = request.body()
if (body is FormBody) {
......@@ -206,22 +247,21 @@ class HttpConfig {
val paramsValue = getCommonParams(paramsName)
paramsValue.forEach { entry->
bodyBuild.addEncoded(entry.key,entry.value)
paramsValue.forEach { entry ->
bodyBuild.addEncoded(entry.key, entry.value)
}
body = bodyBuild.build()
}
it.proceed(request.newBuilder().post(body!!).build())
} else if ("GET"==request.method()){
} else if ("GET" == request.method()) {
val url = request.url()
val newBuilder = url.newBuilder()
val paramsName = url.queryParameterNames()
val paramsValue = getCommonParams(paramsName)
paramsValue.forEach { entry->
newBuilder.
addQueryParameter(entry.key,entry.value)
paramsValue.forEach { entry ->
newBuilder.addQueryParameter(entry.key, entry.value)
}
it.proceed(request.newBuilder().url(newBuilder.build()).build())
......@@ -279,7 +319,7 @@ class HttpConfig {
val request = it.request()
val paramsString = StringBuilder()
val params = ArrayList<Param>()
if ("POST"==request.method()){
if ("POST" == request.method()) {
val body = request.body()
if (body is FormBody) {
(0 until body.size()).mapTo(destination = params) {
......@@ -294,7 +334,9 @@ class HttpConfig {
if ("text/plain; charset=utf-8" == part.body().contentType()!!.toString()) {
val headerStr = part.headers()!!.toString()
val name =
headerStr.split("\"\\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[0].split("=\"".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1]
headerStr.split("\"\\n".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()[0].split("=\"".toRegex())
.dropLastWhile { it.isEmpty() }.toTypedArray()[1]
val buffer = Buffer()
part.body().writeTo(buffer as BufferedSink)
val value = buffer.readUtf8()
......@@ -302,11 +344,11 @@ class HttpConfig {
}
}
}
} else if ("GET"==request.method()){
} else if ("GET" == request.method()) {
val url = request.url()
val queryParameterNames = url.queryParameterNames()
queryParameterNames.forEach { string ->
params.add(Param(string, url.queryParameter(string)?:""))
params.add(Param(string, url.queryParameter(string) ?: ""))
}
}
......@@ -329,7 +371,7 @@ class HttpConfig {
val builder = it.request()
.newBuilder()
.header(AUTHORIZATION_NAME, oldAuth)
.header(AUTHORIZATION_JAVA_NAME, newAuth )
.header(AUTHORIZATION_JAVA_NAME, newAuth)
.addHeader("Connection", "close")
.addHeader(FFROM, PlatformDataManager.getRam().getChannelName())
.addHeader(IS_FROM_APP, "1")
......@@ -342,7 +384,7 @@ class HttpConfig {
)
.addHeader(OS_TYPE, "2")
.addHeader(APP_NAME, appName)
val loginBean = ModularServiceManager.getPlatformUserService()?.getUser()
val loginBean = ModularServiceManager.getPlatformUserService()?.getUser()
if (loginBean != null) {
builder.addHeader(TOKEN, loginBean.token)
.addHeader(UID, loginBean.userId)
......@@ -353,13 +395,17 @@ class HttpConfig {
private fun getOldAuth(paramsString: StringBuilder): String {
return "$YDL ${EncryptUtils.encryptMD5ToString(
paramsString.toString()+ SESSION_KEY
paramsString.toString() + SESSION_KEY
)}"
}
private fun getNewAuth(paramsString: StringBuilder): String {
//md5({静态秘钥} + {参数} + md5{动态秘钥(明文)}
return "$YDL ${EncryptUtils.encryptMD5ToString(SESSION_KEY+ paramsString.toString()+EncryptUtils.encryptMD5ToString(DYNAMIC_SESSION_KEY))}"
return "$YDL ${EncryptUtils.encryptMD5ToString(
SESSION_KEY + paramsString.toString() + EncryptUtils.encryptMD5ToString(
DYNAMIC_SESSION_KEY
)
)}"
}
//初始化网络环境
......@@ -394,12 +440,12 @@ class HttpConfig {
}
@SuppressLint("CheckResult")
fun initAuth(){
fun initAuth() {
ApiRequestUtil.getDynamicToken()
.compose(RxUtils.applySchedulers())
.compose(RxUtils.resultJavaData())
.subscribe({
if (!TextUtils.isEmpty(it.appKey)){
if (!TextUtils.isEmpty(it.appKey)) {
DYNAMIC_SESSION_KEY = it?.appKey.toString()
}
}) {
......@@ -408,14 +454,14 @@ class HttpConfig {
}
@SuppressLint("CheckResult")
fun initSocketConfig(finallyAction:Action) {
fun initSocketConfig(finallyAction: Action) {
ApiRequestUtil.getJavaGlobalInfo()
.compose(RxUtils.applySchedulers())
.compose(RxUtils.resultJavaData())
.doFinally(finallyAction)
.subscribe({
if (it!=null&&!TextUtils.isEmpty(it.ip)){
YdlPushAgent.setDebugAdree(it.ip,it.port.toInt())
if (it != null && !TextUtils.isEmpty(it.ip)) {
YdlPushAgent.setDebugAdree(it.ip, it.port.toInt())
}
}) {
LogUtil.i("HttpConfig", it.toString())
......@@ -427,8 +473,8 @@ class HttpConfig {
*
*/
@SuppressLint("CheckResult")
fun initLoginBaseUrlConfig(urlMap :HashMap<String,String>){
val map = HashMap<String,Any>()
fun initLoginBaseUrlConfig(urlMap: HashMap<String, String>) {
val map = HashMap<String, Any>()
val list = ArrayList<GatewayRequestDTO>()
val gatewayRequestDTO = GatewayRequestDTO("login")
list.add(gatewayRequestDTO)
......@@ -437,14 +483,14 @@ class HttpConfig {
.compose(RxUtils.applySchedulers())
.compose(RxUtils.resultJavaData())
.subscribe({
if (it.baseUrlGatewayDTOList.isNotEmpty()){
isEncryption = it.baseUrlGatewayDTOList[0].goGateway
if (isEncryption){
JAVA_LOGIN_BASE_URL = it.baseUrlGatewayDTOList[0].baseUrl+"/"
urlMap[YDL_DOMAIN_LOGIN_BASE_URL] = JAVA_LOGIN_BASE_URL
ApiFactory.getInstance().setMultipleUrlMap(urlMap)
}
if (it.baseUrlGatewayDTOList.isNotEmpty()) {
isEncryption = it.baseUrlGatewayDTOList[0].goGateway
if (isEncryption) {
JAVA_LOGIN_BASE_URL = it.baseUrlGatewayDTOList[0].baseUrl + "/"
urlMap[YDL_DOMAIN_LOGIN_BASE_URL] = JAVA_LOGIN_BASE_URL
ApiFactory.getInstance().setMultipleUrlMap(urlMap)
}
}
}) {
LogUtil.i("HttpConfig", it.toString())
}
......@@ -453,4 +499,4 @@ class HttpConfig {
private object Holder {
val INSTANCE = HttpConfig()
}
}
\ No newline at end of file
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment