更新记录
1.0.6(2026-09-03) 下载此版本
- 修复 Android 正式包无法读取
static等代码包资源作为分享素材的问题。 - 三端兼容
static/...与/static/...写法;Android 正式包通过AssetManager读取/android_asset/资源。
平台兼容性
uni-app x(5.24)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | 5.0 | 12 | 12 | - |
dyl-weixin 使用文档
dyl-weixin 是面向 uni-app x 的微信 OpenSDK 源码插件,统一提供微信登录、分享、打开微信、拉起微信小程序,以及接收微信启动参数等能力。
插件支持 Android、iOS 和 HarmonyOS,源码未加密,也不写死 AppID、Android 包名/签名、iOS Universal Link 或鸿蒙应用身份。将整个 uni_modules/dyl-weixin 目录复制到其他 uni-app x 项目后,只需完成新宿主 App 的配置,即可继续使用相同 API。
插件目录名和插件 ID 请保持为
dyl-weixin。复制到其他项目没有问题,但不要只修改目录名来制作另一份插件。
1. 支持范围
1.1 基础环境
| 项目 | 最低要求 |
|---|---|
| HBuilderX | 5.24 |
| uni-app x | 5.24 |
| Android | API 21 / Android 5.0 |
| iOS | iOS 12.0 |
| HarmonyOS NEXT | API 12 |
1.2 功能兼容表
| 功能 | Android | iOS | HarmonyOS |
|---|---|---|---|
| 判断微信是否安装 | 支持 | 支持 | 支持 |
| 打开微信 | 支持 | 支持 | 支持 |
| 微信登录 | 支持 | 支持 | 支持 |
| 拉起微信小程序 | 支持 | 支持 | 支持 |
| 文本分享 | 支持 | 支持 | 支持 |
| 图片分享 | 支持 | 支持 | 支持 |
| 图文分享 | 支持 | 支持 | 支持 |
| 网页分享 | 支持 | 支持 | 支持 |
| 小程序卡片分享 | 支持 | 支持 | 支持 |
| 视频分享 | 支持 | 支持 | 支持 |
| 音乐分享 | 支持 | 支持 | 不支持 |
| 文件分享 | 支持 | 支持 | 支持 |
收藏场景 favorite |
支持 | 支持 | 不支持 |
| 接收微信启动参数 | 支持 | 支持 | 支持 |
| 企业微信客服会话 | 未实现 | 未实现 | 未实现 |
HarmonyOS 使用官方 @tencent/***_open_sdk 1.0.16。该版本没有提供音乐分享和收藏场景,调用时插件会进入 fail 回调,并返回 9010010。
2. 原生 SDK 依赖
插件已包含或声明以下原生依赖,业务项目无需手动复制 SDK 文件:
| 平台 | SDK | 版本 |
|---|---|---|
| Android | com.tencent.mm.opensdk:***-sdk-android |
6.8.0 |
| iOS | 官方 ***OpenSDK 静态库(插件内置) |
2.0.7 |
| HarmonyOS | @tencent/***_open_sdk |
1.0.16 |
因为包含原生依赖,Android/iOS 调试必须重新制作并选择自定义基座;HarmonyOS 需要安装依赖后重新编译应用。标准基座不包含本插件的微信 SDK。
3. 安装与目录迁移
3.1 当前项目
插件位于:
uni_modules/dyl-weixin/
├─ package.json
├─ readme.md
├─ changelog.md
├─ templates/
└─ utssdk/
├─ interface.uts
├─ unierror.uts
├─ app-android/
├─ app-ios/
└─ app-harmony/
3.2 复制到其他项目
- 把完整的
dyl-weixin目录复制到目标项目的uni_modules下。 - 保持最终路径为
目标项目/uni_modules/dyl-weixin。 - 在目标项目中配置微信 AppID、Universal Link,以及三个原生平台的宿主身份。
- 重新制作自定义基座或重新编译原生应用。
- 按本文的初始化示例调用 API。
3.3 复制后哪些会自动生效
| 内容 | 是否随插件复制 | 目标项目还要做什么 |
|---|---|---|
| 统一 UTS 类型和 API | 是 | 把导入路径改为 @/uni_modules/dyl-weixin |
| Android 微信 SDK、网络权限、包可见性、回调 Activity | 是 | 配置目标包名、签名和微信开放平台应用信息 |
| iOS 微信静态 SDK、系统库、微信查询白名单 | 是 | 配置 Bundle ID、URL Scheme、Universal Link、Associated Domains 和 AASA |
| HarmonyOS 微信 SDK、插件权限声明 | 是 | 合并项目级 module.json5 模板,并配置包名和签名 |
| AppID、Universal Link、小程序原始 ID | 否 | 放在目标项目自己的配置文件中 |
页面和 pages.json 路由 |
否 | 按需复制测试页或编写业务页,并自行注册路由 |
最短迁移流程是:复制完整目录 → 修改业务配置常量 → 完成对应平台宿主配置 → 重新制作自定义基座/原生包 → 真机验证。uni_modules 插件不能替目标项目自动修改 pages.json、业务 manifest.json 或项目级鸿蒙配置。
4. 微信开放平台准备
使用 App 原生微信能力前,需要先在微信开放平台创建或配置移动应用,并获得以 wx 开头的移动应用 AppID。
请注意区分:
| 标识 | 示例 | 用途 |
|---|---|---|
| 移动应用 AppID | wx1234567890abcdef |
初始化 SDK、微信登录和分享 |
| 小程序 AppID | wx... |
微信后台的小程序应用标识,当前 navigateToMiniProgram 不使用它 |
| 小程序原始 ID | gh_xxxxxxxxxxxx |
拉起小程序、分享小程序卡片 |
微信登录成功后插件只返回一次性 code。请把 code 发送到自己的服务端,由服务端换取 access token 和用户信息。不要把微信 AppSecret 写在 uvue 页面、UTS 插件或客户端配置中。
5. 统一业务配置
推荐把可变参数放在项目自己的配置文件,例如 config/app.uts:
/** 微信开放平台移动应用 AppID。 */
export const ***_APP_APPID : string = 'wx1234567890abcdef'
/** iOS Universal Link,结尾建议保留 /。Android 和 HarmonyOS 会忽略该值。 */
export const ***_APP_UNIVERSAL_LINK : string = 'https://example.com/applink/'
/** 微信小程序原始 ID,通常以 gh_ 开头。 */
export const ***_MP_APPID : string = 'gh_xxxxxxxxxxxx'
这种组织方式有两个好处:插件可以原样迁移,测试/正式环境也只需要替换业务配置。
6. Android 接入
6.1 微信开放平台配置
在微信开放平台填写目标 Android App 的:
- 应用包名,即最终
applicationId。 - 应用签名指纹。必须与实际安装包使用的签名一致。
- 移动应用 AppID。
调试包、自定义基座和正式包如果使用不同签名,需要以微信开放平台登记信息为准。包名或签名不一致时,常见表现是 sendReq 被拒绝、微信打开后没有回调,或登录/分享立即失败。
6.2 WXEntryActivity
插件已通过 Android Manifest 声明 Activity alias:
${applicationId}.wxapi.WXEntryActivity
它会自动跟随宿主 App 的 applicationId,无需在目标项目中复制 Java/Kotlin Activity,也无需修改插件源码。
插件也会自动声明 android.permission.INTERNET 和微信包可见性。如果目标项目已经通过其他微信插件声明 ${applicationId}.wxapi.WXEntryActivity,请只保留一套微信原生接入,避免 Manifest 合并冲突或回调被另一套插件截获。
6.3 构建
- 在 HBuilderX 中配置目标 App 的 Android 包名和签名。
- 重新制作包含
dyl-weixin的自定义基座。 - 在运行菜单中选择新制作的自定义基座。
- 卸载手机中的旧基座后重新安装,避免仍然运行旧原生壳。
7. iOS 接入
iOS 除了 AppID,还必须正确配置 URL Scheme、Universal Link 和 Associated Domains。
7.1 微信开放平台配置
在微信开放平台填写目标 iOS App 的:
- Bundle ID。
- Universal Link。
- 移动应用 AppID。
这些值必须与最终签名安装包一致。
7.2 URL Scheme
在 HBuilderX 的 manifest.json 可视化界面中,进入“App 模块配置 / iOS App 配置 / URL Schemes”,添加移动应用 AppID,例如:
wx1234567890abcdef
如果项目使用自定义 iOS 原生配置,也可以把以下内容合并到项目级 Info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wx1234567890abcdef</string>
</array>
</dict>
</array>
插件自己的 Info.plist 已声明查询微信所需的 schemes,但不会写死业务 AppID。
dyl-weixin 不依赖 DCloud 的 uni-share 微信模块。若宿主项目的 manifest.json 已启用 uni-share.weixin,它可能再集成一份微信 SDK;建议同一安装包只保留一套微信原生 SDK,避免重复符号、SDK 版本冲突或回调归属不明确。
7.3 Associated Domains
在项目 manifest.json 的 iOS capabilities 中配置关联域名,例如:
applinks:example.com
这里填写域名,不包含 https:// 和路径。调用 useWeiXin 时传入的 universalLink 则应是完整 HTTPS 地址,例如:
https://example.com/applink/
7.4 AASA 文件
Universal Link 域名必须按 Apple 和微信开放平台要求部署 apple-app-site-association 文件。请确认:
- 使用 HTTPS,证书有效。
- 请求过程中没有 301/302 跳转。
- AASA 中的 Team ID、Bundle ID 和路径与应用一致。
- Universal Link 能在真实 iOS 设备上直接唤起 App。
7.5 构建
插件在 utssdk/app-ios/Libs/***OpenSDK 中内置官方 ***OpenSDK 2.0.7 的 Objective-C 静态库和头文件,不依赖 CocoaPods。不要在宿主项目或其他插件中再次引入 ***OpenSDK,否则会产生重复符号。修改 URL Scheme、Associated Domains 或原生依赖后,应重新制作自定义基座。
***OpenSDK 2.0.7的 CocoaPods 包只包含.a和头文件,没有 Swift module。插件的 Swift 桥接代码不能写import ***OpenSDK;HBuilderX 会把app-ios/Libs下的 Objective-C 头文件加入生成工程的桥接头。若以后升级 iOS SDK,请同时替换该目录中的.a、三个.h文件和EmbedResources/PrivacyInfo.xcprivacy。
8. HarmonyOS 接入
8.1 微信开放平台配置
在微信开放平台登记目标鸿蒙应用的包名、签名信息和移动应用 AppID。实际签名证书必须与登记信息一致。
8.2 module.json5
把插件附带的模板合并到项目级 harmony-configs/entry/src/main/module.json5。模板位置:
uni_modules/dyl-weixin/templates/harmony-configs/entry/src/main/module.json5
关键配置如下:
{
"module": {
"abilities": [
{
"name": "EntryAbility",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home",
"wxentity.action.open"
]
}
]
}
],
"querySchemes": [
"weixin"
],
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
}
}
注意:
action.system.home必须保留,否则会破坏应用桌面入口。- 增加
wxentity.action.open,用于微信回跳。 querySchemes配置weixin。- 不要添加
wxopensdk。 - 合并模板,不要直接覆盖项目中已有的 abilities、permissions 或其他业务配置。
8.3 EntryAbility 回调
插件已通过 UTSHarmony.onAppAbilityCreate 和 UTSHarmony.onAppAbilityNewWant 接收微信回调。HBuilderX 5.24+ 不需要手动修改 EntryAbility.ets。
若要接收微信冷启动/热启动携带的 extInfo,应在应用初始化阶段尽早创建插件实例并调用 launch()。当前实现只把收到的启动参数交给已经注册的监听器,不保证为稍后创建的页面长期缓存。
8.4 构建
插件会引入 @tencent/***_open_sdk 1.0.16。首次接入或依赖版本变化后,需要安装鸿蒙三方依赖,并使用已配置 DevEco Studio 工具链的 HBuilderX 重新编译应用。
9. 导入与初始化
在需要调用微信能力的 uvue/uts 文件中导入:
import {
useWeiXin,
type WeiXinUtils,
type UseWeiXinOptions,
type LoginOptions,
type NavigateToMiniProgramOptions,
type ShareOptions,
type LaunchFromWeiXinOptions
} from '@/uni_modules/dyl-weixin'
import {
***_APP_APPID,
***_APP_UNIVERSAL_LINK,
***_MP_APPID
} from '@/config/app.uts'
初始化参数:
| 参数 | 类型 | 必填 | 平台行为 |
|---|---|---|---|
appId |
string |
是 | 三端都使用微信开放平台移动应用 AppID |
universalLink |
string |
是 | iOS 必须是完整 HTTPS Universal Link;Android、HarmonyOS 当前忽略,但因统一类型仍需传字符串 |
success |
function | 否 | SDK 对象创建/注册完成时调用 |
fail |
function | 否 | 参数无效或原生 SDK 初始化失败时调用 |
complete |
function | 否 | success 或 fail 后调用 |
初始化:
const weixinOptions : UseWeiXinOptions = {
appId: ***_APP_APPID,
universalLink: ***_APP_UNIVERSAL_LINK,
success: (res) : void => {
console.log('微信 SDK 初始化成功:' + res.errMsg)
},
fail: (err) : void => {
console.error('微信 SDK 初始化失败:' + err.errCode.toString() + ' ' + err.errMsg)
},
complete: (res) : void => {
console.log('微信 SDK 初始化结束')
}
}
const wxUtils : WeiXinUtils = useWeiXin(weixinOptions)
建议在页面或业务服务初始化阶段创建一次实例并复用,不要在每次点击按钮时反复初始化。同一时刻也不要并发发起多次登录或分享请求。
初始化 success 的含义是插件已创建/注册微信 SDK 对象并接受当前配置,不等于微信开放平台已经验证了包名、签名、Bundle ID 或 Universal Link。最终身份是否匹配,要以真机发起登录、分享并成功收到微信回调为准。HarmonyOS 当前在 SDK 对象创建成功后即返回初始化成功,尤其需要通过真实请求验证配置。
如果同一代码文件还要编译到 Web 或小程序,请用 uni-app x 条件编译把插件导入和 App 调用限制在 APP 平台范围内。
// #ifdef APP
import {
useWeiXin,
type WeiXinUtils,
type UseWeiXinOptions
} from '@/uni_modules/dyl-weixin'
// #endif
10. API 总览
interface WeiXinUtils {
isInstalled() : boolean
openApp() : void
navigateToMiniProgram(options : NavigateToMiniProgramOptions) : void
login(options : LoginOptions) : void
share(options : ShareOptions) : void
launch(options : LaunchFromWeiXinOptions) : void
}
11. isInstalled 判断微信是否安装
const installed : boolean = wxUtils.isInstalled()
if (installed == false) {
uni.showToast({
title: '请先安装微信',
icon: 'none'
})
}
返回 true 表示当前系统能够识别微信客户端。该结果不代表微信开放平台的包名、签名或 Universal Link 一定配置正确。
12. openApp 打开微信
if (wxUtils.isInstalled()) {
wxUtils.openApp()
}
openApp() 没有回调。需要提示未安装时,应先调用 isInstalled()。
13. login 微信登录
13.1 参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
scope |
'snsapi_userinfo' \| 'snsapi_login' |
否 | Android 为 snsapi_userinfo |
微信授权范围;为保证三端一致,建议显式传入 |
state |
string |
否 | 空字符串 | 建议传入由业务生成并可在服务端校验的随机值,防止请求伪造 |
success |
function | 否 | - | 微信授权成功回调 |
fail |
function | 否 | - | 失败或取消回调 |
complete |
function | 否 | - | 成功或失败后调用 |
13.2 示例
const loginOptions : LoginOptions = {
scope: 'snsapi_userinfo',
state: 'login_state_20260902',
success: (res) : void => {
console.log('微信授权 code:' + res.code)
console.log('微信返回 state:' + res.state)
// 把 res.code 发送到自己的服务端换取用户信息。
},
fail: (err) : void => {
console.error('微信登录失败:' + err.errCode.toString() + ' ' + err.errMsg)
},
complete: (res) : void => {
console.log('微信登录流程结束')
}
}
wxUtils.login(loginOptions)
success 的关键字段:
| 字段 | 类型 | 说明 |
|---|---|---|
code |
string |
微信授权临时票据,交给服务端使用 |
state |
string |
发起授权时传入并由微信返回的状态值 |
lang |
string |
微信客户端语言信息,平台未返回时为空字符串 |
country |
string |
微信客户端地区信息,平台未返回时为空字符串 |
errMsg |
string |
结果说明 |
14. navigateToMiniProgram 拉起小程序
14.1 参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
appId |
string |
是 | 小程序原始 ID,通常以 gh_ 开头 |
path |
string |
否 | 小程序页面路径,可以携带查询参数 |
envVersion |
'develop' \| 'trial' \| 'release' |
否 | 开发版、体验版或正式版 |
extraData |
UTSJSONObject |
否 | 传给小程序的扩展数据;实际支持程度以平台 SDK 为准 |
success |
function | 否 | OpenSDK 接受跳转请求时调用 |
fail |
function | 否 | 请求校验失败或 OpenSDK 拒绝时调用 |
complete |
function | 否 | 成功或失败后调用 |
14.2 示例
const miniProgramOptions : NavigateToMiniProgramOptions = {
appId: ***_MP_APPID,
path: '/pages/index/index?source=app',
envVersion: 'release',
extraData: {
source: 'dyl-weixin'
},
success: (res) : void => {
console.log(res.errMsg)
},
fail: (err) : void => {
console.error(err.errCode.toString() + ' ' + err.errMsg)
}
}
wxUtils.navigateToMiniProgram(miniProgramOptions)
此 API 的 success 表示微信 OpenSDK 已接受请求,不代表用户一定完成了小程序内的后续业务。
15. share 分享
15.1 公共参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
type |
ShareOptions 支持的字面量 |
是 | 分享类型 |
title |
string |
视类型 | 标题 |
summary |
string |
否 | 摘要/描述 |
thumb |
string |
视类型 | 缩略图网络地址或本地路径 |
scene |
'session' \| 'timeline' \| 'favorite' |
否 | 好友、朋友圈或收藏,默认 session |
success |
function | 否 | 微信返回分享成功时调用 |
fail |
function | 否 | 失败、取消或不支持时调用 |
complete |
function | 否 | 成功或失败后调用 |
ShareOptions 类型中还保留了 openCustomerServiceChat、corpid、customerUrl 三个兼容字段,但当前 Android、iOS、HarmonyOS 实现都没有把它们传给原生 SDK,不能据此打开企业微信客服会话。业务代码暂时不要依赖这三个字段。
类型专用参数:
| 参数 | 用于 | 说明 |
|---|---|---|
text |
text |
要分享的纯文本 |
imageUrl |
image、imageText |
网络图片地址或应用可读取的本地路径 |
webpageUrl |
webpage、miniProgram |
网页地址;小程序卡片中作为兼容页 |
miniProgramId |
miniProgram |
gh_ 开头的小程序原始 ID |
miniProgramPath |
miniProgram |
小程序页面路径,可携带查询参数 |
envVersion |
miniProgram |
develop、trial 或 release |
videoUrl |
video |
视频播放页或视频资源地址,具体展示由微信 SDK 决定 |
musicUrl |
music |
音乐落地页地址 |
musicDataUrl |
music |
音频数据地址,可选 |
filePath |
file |
应用有权读取的本地文件路径 |
fileExtension |
file |
文件扩展名,例如 pdf,不要带点号 |
分享场景:
scene |
说明 | Android | iOS | HarmonyOS |
|---|---|---|---|---|
session |
微信好友/会话 | 支持 | 支持 | 支持 |
timeline |
朋友圈 | 支持 | 支持 | 支持 |
favorite |
微信收藏 | 支持 | 支持 | 不支持 |
15.2 文本分享
const options : ShareOptions = {
type: 'text',
text: '来自 dyl-weixin 的文本分享',
scene: 'session',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
15.3 图片分享
const options : ShareOptions = {
type: 'image',
imageUrl: 'https://example.com/static/share.jpg',
thumb: 'https://example.com/static/share-thumb.jpg',
scene: 'session',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
imageUrl 和 thumb 可以使用 HTTPS 网络地址或 uni-app x 可访问的本地路径。网络素材下载失败会返回网络/素材错误;本地文件无法读取会返回文件错误。
15.4 图文分享
const options : ShareOptions = {
type: 'imageText',
title: '图文标题',
summary: '图文摘要',
imageUrl: 'https://example.com/static/share.jpg',
thumb: 'https://example.com/static/share-thumb.jpg',
scene: 'session',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
15.5 网页分享
const options : ShareOptions = {
type: 'webpage',
title: '网页标题',
summary: '网页摘要',
webpageUrl: 'https://example.com/article/1001',
thumb: 'https://example.com/static/share-thumb.jpg',
scene: 'timeline',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
15.6 小程序卡片分享
const options : ShareOptions = {
type: 'miniProgram',
title: '打开小程序',
summary: '从 App 分享的小程序卡片',
webpageUrl: 'https://example.com/fallback',
thumb: 'https://example.com/static/mini-program-thumb.jpg',
miniProgramId: ***_MP_APPID,
miniProgramPath: '/pages/index/index?source=share',
envVersion: 'release',
scene: 'session',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
小程序卡片建议同时提供 miniProgramId、webpageUrl、thumb 和 title。miniProgramId 同样是以 gh_ 开头的小程序原始 ID。
15.7 视频分享
const options : ShareOptions = {
type: 'video',
title: '视频标题',
summary: '视频摘要',
videoUrl: 'https://example.com/video/1001',
thumb: 'https://example.com/static/video-thumb.jpg',
scene: 'session',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
15.8 音乐分享
const options : ShareOptions = {
type: 'music',
title: '音乐标题',
summary: '音乐摘要',
musicUrl: 'https://example.com/music/detail/1001',
musicDataUrl: 'https://example.com/static/music.mp3',
thumb: 'https://example.com/static/music-thumb.jpg',
scene: 'session',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
音乐分享仅支持 Android 和 iOS。HarmonyOS 调用会返回 9010010。
15.9 文件分享
const options : ShareOptions = {
type: 'file',
title: '对账单',
summary: '2026 年 9 月对账单',
filePath: '/storage/emulated/0/Download/report.pdf',
fileExtension: 'pdf',
thumb: 'https://example.com/static/file-thumb.png',
scene: 'session',
success: (res) : void => console.log(res.errMsg),
fail: (err) : void => console.error(err.errMsg)
}
wxUtils.share(options)
本地文件路径必须是当前 App 有权读取的路径。Android 分区存储、iOS 沙盒和 HarmonyOS 沙盒规则不同,推荐先把文件下载或复制到应用可访问的临时/文档目录,再传给插件。
15.10 分享类型与必需字段
type |
主要字段 | 备注 |
|---|---|---|
text |
text |
纯文本 |
image |
imageUrl |
建议提供 thumb |
imageText |
imageUrl |
建议提供 title、summary、thumb |
webpage |
webpageUrl |
建议提供标题、摘要和缩略图 |
miniProgram |
miniProgramId、webpageUrl、thumb |
三端通用写法;miniProgramId 为 gh_ 开头的原始 ID |
video |
videoUrl |
建议提供标题、摘要和缩略图 |
music |
musicUrl |
musicDataUrl 可选;HarmonyOS 不支持 |
file |
filePath |
建议填写 fileExtension |
上表是建议业务统一遵循的跨平台契约。各原生 SDK 对空标题、空缩略图等边界的容忍度不同;不要因为某个平台偶尔能发送缺字段的对象,就省略通用必需字段。
15.11 素材路径、网络地址和大小限制
| 平台 | 主图片/文件处理 | 缩略图处理 | 业务侧建议 |
|---|---|---|---|
| Android | 网络地址会先下载,本地地址会读取,随后以完整 ByteArray 传给微信 SDK |
自动缩到最长边约 160px,并逐级降低 JPEG 质量,目标不超过 32KB | 图片尽量控制在 300KB 以内;不要通过本插件分享大文件 |
| iOS | 网络地址会下载为 Data,本地地址会读取为 Data |
超过 64KB 时逐级降低 JPEG 质量,但不缩放尺寸,极端图片仍可能失败 | 预先生成小尺寸缩略图,主素材也应控制体积 |
| HarmonyOS | 主图片和文件按 URI 交给微信 SDK | 插件会读取缩略图字节,但当前不自动压缩或做大小校验 | 业务侧预先生成满足微信限制的小缩略图 |
Android 是最需要注意的平台:即使 imageUrl 是 OSS/HTTPS 地址,当前实现仍会先下载整张图片,再把二进制放进发往微信的 Binder 请求。因此“把图片传到 OSS”只能解决本地路径和访问权限问题,不能规避 TransactionTooLargeException。海报分享建议在服务端或客户端先生成专用分享图,经验上先压到约 300KB 以内再调用;实际可用上限还会受标题、缩略图、系统和微信版本影响。
file 分享在 Android 也会把完整文件读成字节,虽然插件有基础上限校验,Binder 往往会在到达该上限之前失败,因此不适合分享大文件。iOS/HarmonyOS 的传递方式不同,也不应把“某一端能发”当作三端统一保障。
路径规则:HTTP/HTTPS 地址直接作为网络素材处理;file://、Android content:// 等原生 URI 会按平台处理;普通相对路径会转换为当前应用可访问的绝对路径。项目代码包资源支持 static/logo.png 与 /static/logo.png 两种写法,Android 正式包中的资源会从 APK assets 读取。跨项目迁移后不要复用另一个 App 的沙盒绝对路径。
16. launch 接收微信启动参数
launch 用于取得微信回跳或通过微信启动 App 时携带的扩展信息。
建议在应用启动阶段尽早注册:
const launchOptions : LaunchFromWeiXinOptions = {
success: (res) : void => {
console.log('微信启动参数:' + res.extInfo)
},
complete: (res) : void => {
console.log('启动参数处理结束')
}
}
wxUtils.launch(launchOptions)
如果本次启动不是来自微信,不会触发有效的 extInfo 回调。LaunchFromWeiXinOptions.fail 是为 API 兼容和后续扩展保留的字段,当前三端实现只在收到微信启动请求时触发 success 与 complete。不要把 launch 当作登录或分享结果回调;登录和分享结果仍由对应 API 的回调返回。
17. 回调结构
17.1 成功结果
type SuccessCallbackResult = {
errSubject : string
statusCode : number
state : string
code : string
lang : string
country : string
errMsg : string
}
不同 API 只会填充相关字段,其余字符串字段可能为空。
17.2 启动结果
type SuccessLaunchResult = {
errMsg : string
extInfo : string
}
17.3 失败结果
失败对象实现 IUniError,常用字段为:
| 字段 | 说明 |
|---|---|
errSubject |
固定为 dyl-weixin |
errCode |
插件错误码 |
errMsg |
可直接记录或展示的错误说明 |
cause |
底层异常信息,可能为空 |
complete 会在 success 或 fail 之后执行。业务逻辑应以 success/fail 为准,complete 适合关闭 loading 等收尾工作。
还要区分两类“成功”:navigateToMiniProgram 的 success 表示 OpenSDK 已接受拉起请求;登录/分享的 success 则来自微信回调。分享回调仍是客户端 SDK 对本次请求的结果,不应替代服务端业务确认、订单状态或奖励发放依据。
18. 错误码
以下是当前实现会重点返回的错误码:
| 错误码 | 含义 | 常见处理 |
|---|---|---|
9010001 |
微信 OpenSDK 初始化失败 | 检查 AppID、Android 包名/签名、iOS Universal Link、鸿蒙配置 |
9010002 |
未安装微信 | 提示用户安装或升级微信 |
9010003 |
请求未被微信接受、发送失败或已有同类请求处理中 | 避免并发请求,检查开放平台身份配置 |
9010004 |
已返回宿主 App,但没有收到微信结果 | 本次请求会执行 fail 和 complete,可以安全地重新发起请求 |
9010005 |
用户取消 | iOS/HarmonyOS 原生取消映射 |
9010006 |
用户拒绝授权 | 按业务需要提示重新授权 |
9010007 |
不支持的分享类型 | 检查 type |
9010008 |
必填参数缺失或参数无法解析 | 根据 errMsg 补全参数 |
9010009 |
图片读取、解析或下载失败 | 检查路径、HTTPS、权限和图片格式 |
9010010 |
当前 SDK/平台不支持该能力或媒体类型无效 | 调整分享类型;鸿蒙不要使用音乐/收藏 |
9010011 |
分享素材超过大小限制 | 压缩图片或减小文件 |
9010013 |
缩略图解析/压缩失败或仍然过大 | 使用更小的 JPG/PNG 缩略图 |
9010014 |
用户取消分享 | Android 原生取消映射 |
9010016 |
微信版本过低或 SDK 不支持 | 提示升级微信 |
9010030 |
下载分享素材时网络失败 | 检查网络、URL、证书和 HTTP 状态码 |
9010031 |
文件读取失败 | 检查文件是否存在及 App 是否有访问权限 |
9010099 |
未分类的原生异常 | 记录 errMsg 和设备环境后排查 |
接口中的其他错误码为后续能力和兼容迁移预留,业务代码不要只依赖某一个错误码判断所有失败场景。
统一错误处理示例:
fail: (err) : void => {
if (err.errCode == 9010002) {
uni.showToast({ title: '请先安装微信', icon: 'none' })
return
}
if (err.errCode == 9010005 || err.errCode == 9010014) {
return
}
uni.showToast({ title: err.errMsg, icon: 'none' })
}
19. 自定义基座说明
出现以下任一变化后,都应重新制作基座或重新打原生包:
- 第一次添加
dyl-weixin。 - 修改插件 Android/iOS/HarmonyOS 原生代码。
- 修改原生 SDK 版本。
- 修改 Android 包名或签名。
- 修改 iOS URL Scheme、Associated Domains、Bundle ID 或 Universal Link。
- 修改 HarmonyOS
module.json5、包名或签名。
仅修改页面 UTS/uvue 业务代码通常可以热更新;但标准基座和旧自定义基座不会自动获得新原生类。
20. 从 lime-weixin 迁移
原错误:
java.lang.NoClassDefFoundError:
Failed resolution of: Luts/sdk/modules/limeWeixin/UseWeiXinOptions;
表示运行时基座中没有旧插件生成的原生类型。迁移步骤:
- 将业务导入改为
@/uni_modules/dyl-weixin。 - 保持类型名
UseWeiXinOptions、ShareOptions等不变。 - 把 AppID、Universal Link、小程序原始 ID 放到业务配置文件。
- 完成 Android/iOS/HarmonyOS 宿主配置。
- 重新制作并选择包含新插件的自定义基座。
- 卸载旧 App 后重新安装测试。
新插件 Android 生成包名为:
uts.sdk.modules.dylWeixin
如果错误栈仍然出现 uts.sdk.modules.limeWeixin,说明仍有旧导入、缓存构建产物或设备上仍安装着旧基座。
21. 常见问题
21.1 初始化回调失败
- 确认传入的是移动应用 AppID,而不是小程序 AppID。
- Android 检查 applicationId 和签名。
- iOS 检查 Bundle ID、URL Scheme、Universal Link 和 AASA。
- HarmonyOS 检查包名、签名、
wxentity.action.open和querySchemes。
21.2 点击登录或分享没有任何回调
- 确认运行的是最新自定义基座,不是标准基座或旧基座。
- 不要并发调用多次
login或share。 - Android 检查
${applicationId}.wxapi.WXEntryActivity是否进入最终 Manifest。 - iOS 用真机验证 Universal Link,并检查 URL Scheme。
- HarmonyOS 检查项目级
module.json5是否已合并模板。
21.3 微信能打开,但请求失败
这通常是宿主 App 身份不匹配,而不是“微信未安装”。检查开放平台登记的包名、Bundle ID、应用签名、Universal Link 和当前安装包是否完全一致。
21.4 网络图片或文件分享失败
- 优先使用 HTTPS。
- 确认 URL 无登录态或防盗链限制。
- 确认响应是真实图片/文件,而不是 HTML 错误页。
- 控制素材大小,缩略图尽量使用体积较小的 JPG/PNG。
- 本地文件先确认路径存在且 App 有读取权限。
- Android 网络图片会被下载为完整字节后发送给微信,OSS 地址不能绕过 Binder 大小限制;出现
TransactionTooLargeException时必须压缩主图,而不只是更换 URL。
21.5 iOS 本地编译找不到微信 SDK
依次检查:
utssdk/app-ios/Libs/***OpenSDK下存在lib***OpenSDK.a、WXApi.h、WXApiObject.h和***AuthSDK.h。DYLWeixinIOSBridge.swift中没有import ***OpenSDK。官方 2.0.7 静态包不提供可直接导入的 Swift module。utssdk/app-ios/config.json中没有再次声明dependencies-pods/***OpenSDK。- 宿主项目和其他原生插件没有再次集成微信 iOS SDK;同一 App 只能保留一份,否则可能出现重复符号或版本冲突。
- 删除旧自定义基座并重新云打包。原生 SDK 或 Swift 桥接代码变更不会进入已经安装的旧基座。
21.6 HarmonyOS 无法编译
确认 HBuilderX 已配置可用的 DevEco Studio 工具链,并完成 ohpm 依赖安装。Windows 上仅做 UTS 语法生成不能替代完整的鸿蒙原生构建验证。
21.7 选择“留在微信”后,手动返回 App 无回调
Android 端从 1.0.1、iOS 和 HarmonyOS 端从 1.0.2 开始处理此场景:如果请求已离开宿主 App,但恢复到宿主 App 后仍未收到微信 OpenSDK 响应,插件会结束本次请求,并按顺序触发:
fail:errCode为9010004,表示“已返回宿主 App,但没有收到微信结果”。complete:保证业务侧可以关闭 loading、恢复按钮状态并再次发起请求。
9010004 只表示微信没有回传可判定的结果,不能当作分享成功。账号受限、微信端拒绝处理、选择留在微信后手动切回等情况,都可能导致没有标准回调;如果微信明确回传错误,插件仍优先返回微信的实际错误信息。
升级后必须重新制作并安装对应平台的自定义基座/原生应用,旧安装包仍包含旧版原生桥接代码。
22. 可移植性边界
dyl-weixin 是可复制、可二次修改、源码未加密的公共本地插件,但当前没有自动发布到 DCloud 插件市场。
可随插件复制的内容:
- 统一 UTS API 和类型。
- Android/iOS/HarmonyOS 原生桥接代码。
- Android、HarmonyOS SDK 依赖声明,以及插件内置的 iOS 官方静态 SDK。
- 鸿蒙宿主配置模板。
- 本使用文档。
每个宿主 App 必须单独配置的内容:
- 微信开放平台移动应用 AppID。
- Android 包名与签名。
- iOS Bundle ID、URL Scheme、Universal Link、Associated Domains 和 AASA。
- HarmonyOS 包名、签名和项目级
module.json5。 - 小程序原始 ID。
这些配置属于目标 App 的身份,不能安全地写死在通用插件中。
22.1 测试页不属于插件 API
当前项目的综合测试页位于 pages/debug/weixin-test.uvue,它是宿主项目页面,不在 uni_modules/dyl-weixin 内。复制插件到其他项目时,测试页不会自动跟随;如需使用,应一并复制页面、检查其中的业务常量/素材地址,并在目标项目 pages.json 中注册。正式业务只依赖插件目录和本文 API,不依赖该测试页。
目标项目的 pages.json 可增加:
{
"path": "pages/debug/weixin-test",
"style": {
"navigationBarTitleText": "微信 SDK 调试"
}
}
该页面用于真机逐项验证安装检测、打开微信、登录、拉起小程序、各类分享和启动参数回调。页面中的 AppID、Universal Link、小程序原始 ID 应继续从目标项目配置读取,不要重新写死在测试页中。
23. 发布前检查清单
- [ ]
uni_modules/dyl-weixin目录完整。 - [ ] 业务代码只从
@/uni_modules/dyl-weixin导入。 - [ ] 移动应用 AppID 正确。
- [ ] 小程序调用使用
gh_开头的原始 ID。 - [ ] Android 包名和正式签名已在微信开放平台登记。
- [ ] iOS Bundle ID、URL Scheme、Universal Link、Associated Domains、AASA 全部一致。
- [ ] HarmonyOS 已合并
wxentity.action.open、querySchemes: ["weixin"]和网络权限。 - [ ] 已重新制作并选择最新自定义基座。
- [ ] Android 真机完成登录、分享和微信回跳测试。
- [ ] iOS 真机完成登录、分享和 Universal Link 回跳测试。
- [ ] HarmonyOS 真机完成登录、分享和
onAppAbilityNewWant回跳测试。 - [ ] 服务端已实现用微信登录
code换取用户凭证,客户端没有 AppSecret。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 97
赞赏 0
下载 12559264
赞赏 1948
赞赏
京公网安备:11010802035340号