Commit c37161ea authored by yinjiacheng's avatar yinjiacheng

update B&C端区分appId C端请求B端Server增加uid参数

parent 86f8c9c8
......@@ -10,14 +10,10 @@ class AppConfig {
companion object {
// 是否开启加密
const val IS_ENCRYPT = BuildConfig.IS_ENCRYPT
const val KUANGSHI_ALIVE_API_KEY = "32f9XIsReV4S15Ck_Sa3ky43XgAHUB9v"
const val KUANGSHI_SECRET = "usZbQYdI4PQeXhMftsRfHK2msj0DmSIl"
// file
const val FileProvider = BuildConfig.PROVIDER_NAME
// 渠道
const val appid = "merchant-b"
// 业务线
const val appIdMerchantB = "merchant-b"
const val appIdMerchantC = "merchant-c"
// 客户端版本号
const val cv = BuildConfig.VERSION_NAME
......
......@@ -2,43 +2,45 @@ package com.yidian.bcommon.http
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.yidian.bcommon.constant.AppConfig
import com.yidian.bcommon.app.YdBaseApplication
import com.yidian.bcommon.constant.AppConfig
import com.yidian.bcommon.sdk.BCommonManager
import com.yidian.bcommon.utils.NetWorkUtils
import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.utils.LogUtil
import com.yidian.utils.ToastUtil
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import timber.log.Timber
import java.lang.reflect.Type
class HttpParamsUtils {
companion object {
private val gson by lazy { Gson() }
fun getPublicParamsMap(timeStamp: Long): HashMap<String, String> {
val networkType = NetWorkUtils.getNetWorkType(YdBaseApplication.context)
val queryParamsMap = HashMap<String, String>()
queryParamsMap["appid"] = AppConfig.appid
queryParamsMap["cv"] = AppConfig.cv
queryParamsMap["version"] = AppConfig.version
queryParamsMap["distribution"] = AppConfig.distribution
queryParamsMap["net"] = networkType
queryParamsMap["platform"] = AppConfig.platform
queryParamsMap["device_finger"] = getDeviceFinger()
queryParamsMap["reqid"] = getRequestId(timeStamp)
return queryParamsMap
val paramsMap = hashMapOf(
"appid" to BCommonManager.getAppId(),
"cv" to AppConfig.cv,
"version" to AppConfig.version,
"distribution" to AppConfig.distribution,
"net" to NetWorkUtils.getNetWorkType(YdBaseApplication.context),
"platform" to AppConfig.platform,
"device_finger" to getDeviceFinger(),
"reqid" to getRequestId(timeStamp)
)
Timber.tag(BCommonManager.TAG_HTTP).d("request public params: ${gson.toJson(paramsMap)}")
return paramsMap
}
fun getPrivateParamsMap(paramsMap: HashMap<String, String?>, timeStamp: Long): HashMap<String, String?> {
return if (AppConfig.IS_ENCRYPT) {
val reqId = getRequestId(timeStamp)
paramsMap["secret"] = getSignString(reqId, timeStamp)
paramsMap["secret"] = getSignString(getRequestId(timeStamp), timeStamp)
paramsMap["ts"] = timeStamp.toString()
val paramsJson = Gson().toJson(paramsMap)
LogUtil.show("请求参数:$paramsJson")
val tok = SecretUtil.rsaEncrypt(paramsJson)
val queryParamsMap = HashMap<String, String?>()
queryParamsMap["tok"] = tok
queryParamsMap
// C端身份请求加uid
BCommonManager.getUid()?.let { paramsMap["user_id"] = it }
Timber.tag(BCommonManager.TAG_HTTP).d("request private params: ${gson.toJson(paramsMap)}")
hashMapOf("tok" to SecretUtil.rsaEncrypt(gson.toJson(paramsMap)))
} else {
Timber.tag(BCommonManager.TAG_HTTP).d("request private params: ${gson.toJson(paramsMap)}")
paramsMap
}
}
......@@ -50,21 +52,18 @@ class HttpParamsUtils {
decodeResult.reason = res.reason
decodeResult.status = res.status
if (rsaResult != null) {
val gson = Gson()
if (AppConfig.IS_ENCRYPT) {
val result = SecretUtil.rsaDecrypt(rsaResult as String)
LogUtil.show("返回参数:$result")
Timber.tag(BCommonManager.TAG_HTTP).d("response result: $result")
val decryptResult = gson.fromJson<HttpDecryptResult<T>>(result, object : TypeToken<HttpDecryptResult<T>>() {}.type)
val verifyParams = decryptResult.reqid + decryptResult.ts
val secretNet = decryptResult.secret
val verify = SecretUtil.verifySign(verifyParams, secretNet)
val verify = SecretUtil.verifySign(decryptResult.reqid + decryptResult.ts, decryptResult.secret)
return if (verify) {
LogUtil.show("===============验签成功==================")
Timber.tag(BCommonManager.TAG_HTTP).d("verify success")
val resultJson = gson.toJson(decryptResult.data)
decodeResult.result = gson.fromJson<T>(resultJson, type)
decodeResult
} else {
ToastUtil.showToast(YdBaseApplication.context, "验签失败")
Timber.tag(BCommonManager.TAG_HTTP).d("verify failure")
decodeResult
}
} else {
......@@ -73,33 +72,20 @@ class HttpParamsUtils {
return decodeResult
}
}
LogUtil.show("===============rsaResult为空了==================")
return decodeResult
}
private fun getDeviceFinger(): String {
var deviceFinger = ""
val tempId = FtDeviceFingerManager.getDeviceFinger()
if (tempId != null) {
deviceFinger = tempId
}
return deviceFinger
return FtDeviceFingerManager.getDeviceFinger() ?: ""
}
private fun getRequestId(timeStamp: Long): String {
val sb = StringBuilder()
sb.append(AppConfig.appid)
sb.append('_')
sb.append(getDeviceFinger())
sb.append('_')
sb.append(timeStamp)
return sb.toString()
return StringBuilder().append(BCommonManager.getAppId()).append('_').append(getDeviceFinger()).append('_').append(timeStamp)
.toString()
}
private fun getSignString(reqId: String, timeStamp: Long): String? {
val sb = StringBuilder()
sb.append(reqId).append(timeStamp)
return SecretUtil.sign(sb.toString())
return SecretUtil.sign(StringBuilder().append(reqId).append(timeStamp).toString())
}
}
}
package com.yidian.bcommon.sdk
import com.yidian.bcommon.app.YdBaseApplication
import com.yidian.bcommon.constant.AppConfig
/**
* author: yinjiacheng
* date: 7/27/21 2:01 PM
* description: BCommon Manager
*/
object BCommonManager {
const val TAG_HTTP = "merchant-b-http"
val publicParams by lazy { HashMap<String, String>() }
val privateParams by lazy { HashMap<String, String>() }
/**
* C端 uid
*/
// TODO: 7/27/21 Test
// private var uid: String? = "510227073302"
private var uid: String? = null
/**
* 初始化公共参数
*/
fun initPublicParams(params: HashMap<String, String>) {
params.forEach {
publicParams[it.key] = it.value
}
}
/**
* 初始化私有参数
*/
fun initPrivateParams(params: HashMap<String, String>) {
params.forEach {
privateParams[it.key] = it.value
}
}
/**
* C端同步uid
*/
fun syncUid(uid: String) {
this.uid = uid
}
/**
* 获取AppId
*/
fun getAppId(): String {
return when (JudgeClientUtils.judgeClient(YdBaseApplication.context.packageName)) {
ClientType.MERCHANT_B -> AppConfig.appIdMerchantB
ClientType.MERCHANT_C -> AppConfig.appIdMerchantC
}
}
/**
* 获取TowerPro通用配置模块KeyTag
*/
fun getTowerProKeyTag(): String {
return when (JudgeClientUtils.judgeClient(YdBaseApplication.context.packageName)) {
ClientType.MERCHANT_B -> AppConfig.TowerApiKeyTagMerchantB
ClientType.MERCHANT_C -> AppConfig.TowerApiKeyTagMerchantC
}
}
/**
* 获取C端uid
*/
fun getUid(): String? {
return uid
}
}
package com.yidian.bcommon.utils
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Build
import android.util.DisplayMetrics
import android.util.Log
import android.util.TypedValue
import android.widget.Toast
import com.yidian.bcommon.constant.AppConfig
import com.yidian.bcommon.services.XEventService
import com.yidian.utils.MD5Util
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.yac.ftdevicefinger.core.FtDeviceFingerManager
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.util.*
object ToolsUtil {
//防止连续点击
private var lastClickTime: Long = 0
//自定义快速点击时间
private var currentLastClickTime: Long = 0
//备用自定义快速点击时间
private var tempLastClickTime: Long = 0
//快速点击检测
val isFastClick: Boolean
get() {
val time = System.currentTimeMillis()
val timeD = time - lastClickTime
if (timeD < 500) {
return false
}
lastClickTime = time
return true
}
//单位转换
fun dp2px(context: Context, dpVal: Float): Int {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dpVal,
context.resources.displayMetrics
).toInt()
}
fun dp2px(dpValue: Float): Int {
return TypedValue.applyDimension(1, dpValue, DisplayMetrics()).toInt()
}
//格式化展示
fun formatShowNum(count: Int): String {
var showCount = count.toString()
when {
count in 1000..9999 -> {
val floutCount = count / 1000
showCount = floutCount.toString().format("%.1f") + "K"
}
count in 10000..99999999 -> {
val floutCount = count / 10000
showCount = floutCount.toString().format("%.1f") + "W"
}
count >= 100000000 -> {
val floutCount = count / 100000000
showCount = floutCount.toString().format("%.1f") + "亿"
}
}
return showCount
}
//event事件
fun doAction(name: String, params: Any) {
Log.d("song_test", "event_bus.name = $name")
val xBaseEvent = XBaseEvent(name, params)
XEventService.postEvent(xBaseEvent)
}
//自定义时间检测
fun isCustomFastClick(timeNum: Long): Boolean {
val time = System.currentTimeMillis()
val timeD = time - currentLastClickTime
if (timeD < timeNum) {
return false
}
currentLastClickTime = time
return true
}
//备用自定义时间检测
fun isCustomFastStatus(timeNum: Long): Boolean {
val time = System.currentTimeMillis()
val timeD = time - tempLastClickTime
if (timeD < timeNum) {
return false
}
tempLastClickTime = time
return true
}
//机型判断
fun judgePhone(): Boolean {
val manufacturer: String = Build.MANUFACTURER
return if (manufacturer.isNotEmpty()) {
when (manufacturer.toLowerCase(Locale.ROOT)) {
"oppo" -> true
"xiaomi" -> true
else -> false
}
} else false
}
fun getYDEncryptionToken(): String {
val temp = StringBuilder()
//架构组提供的设备指纹
temp.append(AppConfig.appid)
Log.d("song_test", "appid = " + AppConfig.appid)
temp.append(FtDeviceFingerManager.getDeviceFinger())
Log.d("song_test", "getDeviceFinger = " + FtDeviceFingerManager.getDeviceFinger())
return "UMPPTYKO" + MD5Util.md5Encrypt32Upper(temp.toString())
}
fun getDeviceBrandMask(): Int {
val brand = Build.BRAND
var mask = 64 //0100 0000
if ("huawei".equals(brand, ignoreCase = true) || "honor".equals(brand, ignoreCase = true)) {
mask = 32 //0010 0000
} else if ("meizu".equals(brand, ignoreCase = true)) {
mask = 48 //0011 0000
} else if ("xiaomi".equals(brand, ignoreCase = true)) {
mask = 16 //0001 0000
} else if ("nubia".equals(brand, ignoreCase = true)) {
mask = 80 //0101 0000
} else if ("ZTE".equals(brand, ignoreCase = true)) {
mask = 96 //0110 0000
} else if ("oppo".equals(brand, ignoreCase = true)) {
mask = 112 //0111 0000
} else if ("vivo".equals(brand, ignoreCase = true)) {
mask = 128 //0001 0000 0000
} else if ("samsung".equals(brand, ignoreCase = true)) {
mask = 144 //0001 0001 0000
}
return mask
}
fun saveImage(bitmap: Bitmap, name: String, context: Context): Boolean {
try {
val sdcardPath = System.getenv("EXTERNAL_STORAGE")
val dir = "$sdcardPath/life_circle_business/"
val file = File(dir)
if (!file.exists()) {
file.mkdirs()
}
val mFile = File(dir + name)
if (mFile.exists()) {
Toast.makeText(context, "该图片已存在!", Toast.LENGTH_SHORT).show();
return false;
}
val outputStream = FileOutputStream(mFile)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
val uri: Uri = Uri.fromFile(mFile)
context.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri))
return true
} catch (e: FileNotFoundException) {
e.printStackTrace()
}
return false
}
fun randomName(): String {
val randomNum = (Math.random() * 1000).toInt()
return "lifeCircle$randomNum"
}
}
......@@ -15,8 +15,7 @@ import com.yidian.bcommon.constant.*
import com.yidian.bcommon.http.CommonDataSource
import com.yidian.bcommon.http.bean.GetCommonConfigBean
import com.yidian.bcommon.http.callback.IGetCommonConfigCallback
import com.yidian.bcommon.sdk.ClientType
import com.yidian.bcommon.sdk.JudgeClientUtils
import com.yidian.bcommon.sdk.BCommonManager
import com.yidian.bcommon.services.ZapServiceActionConstants
import com.yidian.bcommon.services.ZapServiceNameConstants
import com.yidian.bcommon.utils.StorageUtil
......@@ -559,16 +558,11 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(), Me
CommonDataSource.getCommonConfig(
this,
hashMapOf(
"appid" to AppConfig.appid,
"appid" to BCommonManager.getAppId(),
"env" to AppConfig.TowerApiEnv.toString(),
"version" to AppConfig.TowerApiVersion,
"os" to AppConfig.TowerApiOS,
"keytag" to when (JudgeClientUtils.judgeClient(packageName)) {
ClientType.MERCHANT_B -> AppConfig.TowerApiKeyTagMerchantB
ClientType.MERCHANT_C -> AppConfig.TowerApiKeyTagMerchantC
// 默认使用B端配置
else -> AppConfig.TowerApiKeyTagMerchantB
}
"keytag" to BCommonManager.getTowerProKeyTag()
)
)
}
......
......@@ -181,7 +181,7 @@ object BaseInitConfig {
}
}
XInsight.init(context, AppConfig.appid, BuildConfig.DEBUG, config, provide)
XInsight.init(context, AppConfig.appIdMerchantB, BuildConfig.DEBUG, config, provide)
}
/**
......
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