feat: 新增拼团

This commit is contained in:
2026-09-23 10:29:41 +08:00
parent f7b9e66172
commit 67f8b3f352
33 changed files with 7491 additions and 858 deletions
@@ -0,0 +1,114 @@
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 ?: ""))
}
}
}
@@ -1,59 +1,23 @@
import { RequestMerchantTransfer, RequestMerchantTransferOptions, RequestMerchantTransferGeneralCallbackResult } from '../interface.uts';
import WXAPIFactory from 'com.tencent.mm.opensdk.openapi.WXAPIFactory'
import URLEncoder from 'java.net.URLEncoder'
import StandardCharsets from 'java.nio.charset.StandardCharsets'
import WXOpenBusinessView from 'com.tencent.mm.opensdk.modelbiz.WXOpenBusinessView'
import Build from 'com.tencent.mm.opensdk.constants.Build'
export const requestMerchantTransfer : RequestMerchantTransfer = function (options : RequestMerchantTransferOptions) {
var appId = options.appId
var api = WXAPIFactory.createWXAPI(UTSAndroid.getAppContext(), appId, false)
var wxSdkVersion = api.wxAppSupportAPI
if (wxSdkVersion >= Build.OPEN_BUSINESS_VIEW_SDK_INT) {
var req = WXOpenBusinessView.Req()
req.businessType = "requestMerchantTransfer"
// 通过 URL 编码处理参数,确保特殊字符不会影响请求
var query = ""
query += 'mchId=' + encodeParams(options.mchId) + '&'
query += 'package=' + encodeParams(options.package) + '&'
if (appId != null) {
query += 'appId=' + encodeParams(options.appId) + '&'
}
if (options.openId != null) {
query += 'openId=' + encodeParams(options.openId) + '&'
}
if (options.subAppId != null) {
query += 'subAppId=' + encodeParams(options.subAppId) + '&'
}
if (options.subMchId != null) {
query += 'subMchId=' + encodeParams(options.subMchId) + '&'
}
query = query.substring(0, query.length - 1)
req.query = query
// 发送请求并检查返回值
var ret = api.sendReq(req)
if (ret) {
var result : RequestMerchantTransferGeneralCallbackResult = {
errMsg: 'ok'
export const requestMerchantTransfer : RequestMerchantTransfer = function (options : RequestMerchantTransferOptions) {
RequestMerchantTransferNative.send(
options.appId,
options.mchId,
options.package,
options.openId,
options.subAppId,
options.subMchId,
(success : boolean, errMsg : string) => {
const result : RequestMerchantTransferGeneralCallbackResult = {
errMsg: errMsg
}
options.success?.(result)
options.complete?.(result)
}else{
var result : RequestMerchantTransferGeneralCallbackResult = {
errMsg: 'fail'
if (success) {
options.success?.(result)
} else {
options.fail?.(result)
}
options.fail?.(result)
options.complete?.(result)
}
} else {
var result : RequestMerchantTransferGeneralCallbackResult = {
errMsg: '当前微信版本过低,请升级微信以使用该功能'
}
options.fail?.(result)
options.complete?.(result)
}
}
function encodeParams(params : string | null) : string | null {
return URLEncoder.encode(params, StandardCharsets.UTF_8.toString())
}
)
}␍