115 lines
4.2 KiB
Kotlin
115 lines
4.2 KiB
Kotlin
package uts.sdk.modules.uniRequestMerchantTransfer
|
|||
|
|
|
||
|
|
import android.content.Context
|
||
|
|
import io.dcloud.uts.UTSAndroid
|
||
|
|
import java.net.URLEncoder
|
||
|
|
import java.nio.charset.StandardCharsets
|
||
|
|
|
||
|
|
object RequestMerchantTransferNative {
|
||
|
|
private const val OPEN_BUSINESS_VIEW_SDK_INT = 0x25020500
|
||
|
|
|
||
|
|
fun send(
|
||
|
|
appId: String?,
|
||
|
|
mchId: String,
|
||
|
|
packageValue: String,
|
||
|
|
openId: String?,
|
||
|
|
subAppId: String?,
|
||
|
|
subMchId: String?,
|
||
|
|
done: (Boolean, String) -> Unit
|
||
|
|
) {
|
||
|
|
val context = UTSAndroid.getAppContext()
|
||
|
|
if (context == null) {
|
||
|
|
done(false, "当前应用上下文不可用")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
val factoryClass = try {
|
||
|
|
Class.forName("com.tencent.mm.opensdk.openapi.WXAPIFactory")
|
||
|
|
} catch (_: Throwable) {
|
||
|
|
null
|
||
|
|
}
|
||
|
|
|
||
|
|
if (factoryClass == null) {
|
||
|
|
done(false, "未集成微信 OpenSDK,请使用自定义基座或打包运行")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
val createMethod = factoryClass.getMethod(
|
||
|
|
"createWXAPI",
|
||
|
|
Context::class.java,
|
||
|
|
String::class.java,
|
||
|
|
Boolean::class.javaPrimitiveType
|
||
|
|
)
|
||
|
|
val api = createMethod.invoke(null, context, appId, false)
|
||
|
|
if (api == null) {
|
||
|
|
done(false, "微信 API 初始化失败")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
val apiClass = api.javaClass
|
||
|
|
val getApiVersionMethod = apiClass.methods.firstOrNull {
|
||
|
|
it.name == "getWxAppSupportAPI" || it.name == "getWXAppSupportAPI"
|
||
|
|
}
|
||
|
|
val wxSdkVersion = (getApiVersionMethod?.invoke(api) as? Number)?.toInt() ?: 0
|
||
|
|
|
||
|
|
var requiredSdkVersion = OPEN_BUSINESS_VIEW_SDK_INT
|
||
|
|
try {
|
||
|
|
val buildClass = Class.forName("com.tencent.mm.opensdk.constants.Build")
|
||
|
|
val field = buildClass.getField("OPEN_BUSINESS_VIEW_SDK_INT")
|
||
|
|
requiredSdkVersion = field.getInt(null)
|
||
|
|
} catch (_: Throwable) {
|
||
|
|
}
|
||
|
|
|
||
|
|
if (wxSdkVersion < requiredSdkVersion) {
|
||
|
|
done(false, "当前微信版本过低,请升级微信以使用该功能")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
fun encode(v: String?): String {
|
||
|
|
return if (v != null) URLEncoder.encode(v, StandardCharsets.UTF_8.name()) else ""
|
||
|
|
}
|
||
|
|
|
||
|
|
val queryBuilder = StringBuilder()
|
||
|
|
queryBuilder.append("mchId=").append(encode(mchId)).append("&")
|
||
|
|
queryBuilder.append("package=").append(encode(packageValue)).append("&")
|
||
|
|
if (appId != null) {
|
||
|
|
queryBuilder.append("appId=").append(encode(appId)).append("&")
|
||
|
|
}
|
||
|
|
if (openId != null) {
|
||
|
|
queryBuilder.append("openId=").append(encode(openId)).append("&")
|
||
|
|
}
|
||
|
|
if (subAppId != null) {
|
||
|
|
queryBuilder.append("subAppId=").append(encode(subAppId)).append("&")
|
||
|
|
}
|
||
|
|
if (subMchId != null) {
|
||
|
|
queryBuilder.append("subMchId=").append(encode(subMchId)).append("&")
|
||
|
|
}
|
||
|
|
val queryString = if (queryBuilder.isNotEmpty() && queryBuilder.endsWith("&")) {
|
||
|
|
queryBuilder.substring(0, queryBuilder.length - 1)
|
||
|
|
} else {
|
||
|
|
queryBuilder.toString()
|
||
|
|
}
|
||
|
|
|
||
|
|
val reqClass = Class.forName("com.tencent.mm.opensdk.modelbiz.WXOpenBusinessView\$Req")
|
||
|
|
val reqInstance = reqClass.getDeclaredConstructor().newInstance()
|
||
|
|
|
||
|
|
reqClass.getField("businessType").set(reqInstance, "requestMerchantTransfer")
|
||
|
|
reqClass.getField("query").set(reqInstance, queryString)
|
||
|
|
|
||
|
|
val sendReqMethod = apiClass.methods.firstOrNull {
|
||
|
|
it.name == "sendReq" && it.parameterTypes.size == 1
|
||
|
|
}
|
||
|
|
|
||
|
|
val ret = (sendReqMethod?.invoke(api, reqInstance) as? Boolean) ?: false
|
||
|
|
if (ret) {
|
||
|
|
done(true, "ok")
|
||
|
|
} else {
|
||
|
|
done(false, "fail")
|
||
|
|
}
|
||
|
|
} catch (e: Throwable) {
|
||
|
|
done(false, "调用微信转账接口异常: " + (e.message ?: ""))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|