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 ?: "")) } } }