|
|
@@ -1,30 +1,45 @@
|
|
|
package com.adealink.frame.network.http.interceptor
|
|
|
|
|
|
-import com.adealink.frame.base.AppBase
|
|
|
import com.adealink.frame.network.NetworkService
|
|
|
import com.adealink.frame.network.ext.safeAdd
|
|
|
+import com.adealink.frame.util.getDeviceName
|
|
|
+import com.adealink.frame.util.md5
|
|
|
import okhttp3.Headers
|
|
|
import okhttp3.Interceptor
|
|
|
import okhttp3.Request
|
|
|
+import okhttp3.RequestBody
|
|
|
import okhttp3.Response
|
|
|
-import java.util.UUID
|
|
|
+import okio.Buffer
|
|
|
+import java.nio.charset.StandardCharsets
|
|
|
+import kotlin.random.Random
|
|
|
|
|
|
const val KEY_TOKEN = "token"
|
|
|
const val KEY_LANGUAGE_CODE = "language_code"
|
|
|
const val KEY_LANG_COUNTRY_CODE = "lang_country_code"
|
|
|
-const val KEY_PACKAGE_NAME = "package_name"
|
|
|
-const val KEY_VERSION_CODE = "version_code"
|
|
|
+const val KEY_PACKAGE_NAME = "app"
|
|
|
+const val KEY_VERSION_CODE = "version"
|
|
|
const val KEY_COUNTRY_CODE = "country_code"
|
|
|
const val KEY_REGION = "region"
|
|
|
const val KEY_DEVICE_ID = "device_id"
|
|
|
const val KEY_NEW_DEVICE_ID = "new_device_id"
|
|
|
const val KEY_X_PROTOCOL_ENCODE = "x-protocol-encode"
|
|
|
-const val KEY_DEVICE = "device" //设备类型: Android, iOS
|
|
|
-const val KEY_PLATFORM = "platform"
|
|
|
+const val KEY_DEVICE = "device" ////设备型号 string(256) ,示例值(xiaomi)
|
|
|
+const val KEY_PLATFORM = "platform" //平台(1=Android,2=Apple,3=H5,4=pc浏览器)
|
|
|
const val KEY_FROM_PAGE = "from_page" //请求来自于哪一个页面
|
|
|
const val KEY_CHANNEL = "channel"
|
|
|
-const val KEY_REQ_ID = "req_id"
|
|
|
+const val KEY_REQ_ID = "id"
|
|
|
const val KEY_APP_NAME = "app_name"
|
|
|
+const val KEY_UDID = "udid"
|
|
|
+const val KEY_API = "api"
|
|
|
+
|
|
|
+const val KEY_NETWORK = "network" //网络类型.eg: 4g,5g,wifi,示例值(wifi)
|
|
|
+
|
|
|
+const val KEY_TIME = "time"
|
|
|
+
|
|
|
+const val KEY_CONTENT_TYPE = "Content-Type"
|
|
|
+const val ACCEPT_LANGUAGE = "Accept-Language"
|
|
|
+const val KEY_SIGN = "sign"
|
|
|
+
|
|
|
|
|
|
class HttpCommonHeaderInterceptor : Interceptor {
|
|
|
override fun intercept(chain: Interceptor.Chain): Response {
|
|
|
@@ -32,31 +47,71 @@ class HttpCommonHeaderInterceptor : Interceptor {
|
|
|
val requestBuilder: Request.Builder = request.newBuilder()
|
|
|
val headerBuilder: Headers.Builder = request.headers.newBuilder()
|
|
|
val config = NetworkService.innerService.config
|
|
|
+
|
|
|
+ val currentTs = System.currentTimeMillis()
|
|
|
+ val deviceName = getDeviceName()
|
|
|
+ val headers = mutableMapOf<String, String>()
|
|
|
+
|
|
|
if (config.loggedIn) {
|
|
|
- headerBuilder
|
|
|
- .safeAdd(KEY_TOKEN, config.token)
|
|
|
- .safeAdd(KEY_DEVICE_ID, config.deviceId)
|
|
|
- .safeAdd(KEY_NEW_DEVICE_ID, config.newDeviceId)
|
|
|
+ headers[KEY_TOKEN] = config.token
|
|
|
}
|
|
|
- headerBuilder
|
|
|
- .safeAdd(KEY_PACKAGE_NAME, config.packageName)
|
|
|
- .safeAdd(KEY_VERSION_CODE, config.versionCode)
|
|
|
- .safeAdd(KEY_LANGUAGE_CODE, config.languageCode)
|
|
|
- .safeAdd(KEY_LANG_COUNTRY_CODE, config.langCountryCode)
|
|
|
- .safeAdd(KEY_COUNTRY_CODE, config.countryCode)
|
|
|
- .safeAdd(KEY_REGION, config.userRegion)
|
|
|
- .safeAdd(KEY_DEVICE, "Android")
|
|
|
- .safeAdd(KEY_PLATFORM, "android")
|
|
|
- .safeAdd(KEY_CHANNEL, config.channel)
|
|
|
- .safeAdd(KEY_FROM_PAGE, config.currActivityName)
|
|
|
- .safeAdd(KEY_REQ_ID, UUID.randomUUID().toString())
|
|
|
- .safeAdd(KEY_APP_NAME, AppBase.appName)
|
|
|
-
|
|
|
- config.getExtraHeaders()?.onEach {
|
|
|
- headerBuilder.safeAdd(it.key, it.value)
|
|
|
+
|
|
|
+ headers[KEY_REQ_ID] = "$currentTs/${Random(100).nextInt()}/${deviceName}".md5()
|
|
|
+ headers[KEY_UDID] = config.deviceId
|
|
|
+ headers[KEY_PACKAGE_NAME] = config.packageName
|
|
|
+ headers[KEY_DEVICE] = deviceName
|
|
|
+ headers[KEY_PLATFORM] = "1"
|
|
|
+ headers[KEY_CHANNEL] = "official"
|
|
|
+ headers[KEY_API] = "1"
|
|
|
+ headers[KEY_VERSION_CODE] = config.versionCode
|
|
|
+ headers[KEY_NETWORK] = "5g"
|
|
|
+ headers[KEY_TIME] = currentTs.toString()
|
|
|
+ headers[KEY_CONTENT_TYPE] = "application/json"
|
|
|
+ headers[ACCEPT_LANGUAGE] = config.languageCode
|
|
|
+ headers.putAll(config.getExtraHeaders() ?: emptyMap())
|
|
|
+
|
|
|
+ val bodyString = getBodyString(request.body)
|
|
|
+ headers[KEY_SIGN] = getHeaderSign(headers, bodyString)
|
|
|
+ for ((key, value) in headers) {
|
|
|
+ headerBuilder.safeAdd(key, value)
|
|
|
}
|
|
|
requestBuilder.headers(headerBuilder.build())
|
|
|
request = requestBuilder.build()
|
|
|
return chain.proceed(request)
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 签名,签名算法:
|
|
|
+ * MD5(id+udid+app+device+platform+channel+api+version+network+time+token+secret[后端约定的密钥], body[请求体数据]) ,示例值(md5)
|
|
|
+ */
|
|
|
+ private fun getHeaderSign(headers: Map<String, String>, requestBody: String): String {
|
|
|
+ val mBuilder = StringBuilder()
|
|
|
+ mBuilder.append(headers[KEY_REQ_ID] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_UDID] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_PACKAGE_NAME] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_DEVICE] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_PLATFORM] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_CHANNEL] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_API] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_VERSION_CODE] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_NETWORK] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_TIME] ?: "")
|
|
|
+ mBuilder.append(headers[KEY_TOKEN] ?: "")
|
|
|
+ mBuilder.append(NetworkService.innerService.config.signKey)
|
|
|
+ mBuilder.append(requestBody)
|
|
|
+ return mBuilder.toString().md5()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun getBodyString(requestBody: RequestBody?): String {
|
|
|
+ return requestBody?.let {
|
|
|
+ val buffer = Buffer()
|
|
|
+ it.writeTo(buffer)
|
|
|
+ var charset = StandardCharsets.UTF_8
|
|
|
+ val contentType = it.contentType()
|
|
|
+ if (contentType != null) {
|
|
|
+ charset = contentType.charset(charset)
|
|
|
+ }
|
|
|
+ buffer.readString(charset)
|
|
|
+ } ?: ""
|
|
|
+ }
|
|
|
}
|