一、前言
在业务开发中,经常会把H5 页面 通过 web-view 组件嵌入到微信、支付宝、抖音小程序 中。普通浏览器 H5 的 <input type="file"> 在各小程序 WebView 中存在兼容差、权限限制、无法调起相机 / 相册、不支持视频等问题。
各平台均提供了专属 JS-SDK ,让 WebView 内 H5 可以调用小程序原生能力 (拍照、选相册、定位、授权、分享等)。本文以选择图片 / 拍照 为核心示例,统一讲解微信、支付宝、抖音三端的实现原理、接入方式、代码示例、差异对比。
二、核心通用原理
- H5 运行在小程序
web-view容器内; - 引入对应平台JS-SDK,建立 H5 ↔ 小程序 通信桥梁;
- 调用平台提供的原生 API,唤起相册选择 / 相机拍照;
- 回调
success获取本地临时文件; - 将临时文件上传至服务器 / OSS,生成永久网络地址。
重要前提:
- 小程序后台配置 业务域名 / WebView 合法域名;
- H5 域名需配置 HTTPS;
- 三端都不推荐原生 input-file,优先用平台 SDK。
三、微信小程序 WebView H5 调用选图
1. 注意
- 需要引入微信 JSSDK;
- 必须后端生成签名 ,前端
wx.config配置; - 仅支持图片,不支持直接选视频;
- 支持相册、拍照。
2. 接入方式
- 引入 SDK:CDN 或 npm
weixin-js-sdk - 后端生成
timestamp、nonceStr、signature - H5 配置
wx.config - 调用
wx.chooseImage
3. 完整示例代码
html
<!-- 引入微信JSSDK -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<button id="btn">微信选图/拍照</button>
<script>
// 1. 从后端获取配置参数
async function getWxConfig() {
const url = location.href.split('#')[0];
const res = await fetch(`/api/wx-jssdk-config?pageUrl=${encodeURIComponent(url)}`);
return await res.json();
}
// 2. 初始化wx.config
async function initWx() {
const config = await getWxConfig();
wx.config({
debug: false,
appId: config.appId,
timestamp: config.timestamp,
nonceStr: config.nonceStr,
signature: config.signature,
jsApiList: ['chooseImage', 'getLocalImgData']
});
}
// 3. 选图/拍照
document.getElementById('btn').addEventListener('click', () => {
wx.chooseImage({
count: 1,
sourceType: ['album', 'camera'], // 相册 + 拍照
success: (res) => {
// res.localIds 为图片本地ID数组
console.log('选择图片成功', res.localIds);
// 进一步获取base64预览/上传
wx.getLocalImgData({
localId: res.localIds[0],
success: (imgRes) => {
console.log('图片Base64', imgRes.localData);
// 可用于预览、表单提交、上传服务器
}
});
},
fail: (err) => {
console.error('选择图片失败', err);
}
});
});
// 初始化
initWx();
</script>
4. 关键说明
appId用微信公众号 AppID,不是小程序;timestamp/nonceStr/signature后端 SHA1 签名生成,前端不可硬编码;- 只能选图片,视频需通过 postMessage 转发给小程序原生处理。
四、支付宝小程序 WebView H5 调用选择图片
1. 注意
- 无需后端签名、无需复杂 config;
- 监听
AlipayJSBridgeReady就绪即可调用; - SDK 仅支持图片,不支持直接选视频;
2. 接入方式
- CDN 引入支付宝 JSAPI;
- 等待 JSBridge 就绪;
- 调用
ap.chooseImage。
3. 完整示例代码
html
<!-- 引入支付宝JS-SDK -->
<script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.min.js"></script>
<button id="aliBtn">支付宝选图/拍照</button>
<script>
// 等待支付宝JS桥就绪
function alipayReady(cb) {
if (window.AlipayJSBridge) {
cb();
return;
}
document.addEventListener('AlipayJSBridgeReady', cb, false);
}
document.getElementById('aliBtn').addEventListener('click', () => {
alipayReady(() => {
ap.chooseImage({
count: 1,
sourceType: ['album', 'camera'],
success: (res) => {
console.log('支付宝选图成功', res.localIds);
// res.localIds 可用于预览、上传
},
fail: (err) => {
console.error('支付宝选图失败', err);
}
});
});
});
</script>
4. 关键说明
- 无签名、无配置,开箱即用;
- 仅图片,视频需 H5 发消息给小程序原生
my.chooseVideo处理。
五、抖音小程序 WebView H5 调用选择图片
1. 注意
- 无需签名配置;
- 通过
tt.miniProgram调用小程序原生能力; - 仅支持图片,不支持 H5 直接选视频;
- 通过 UA 判断是否在抖音小程序环境。
2. 接入方式
- CDN 引入抖音 JS-SDK;
- 判断抖音环境;
- 调用
tt.miniProgram.chooseImage。
3. 完整示例代码
html
<!-- 引入抖音JS-SDK -->
<script src="https://lf3-cn-beijing.volces.com/obj/open-platform/ttjsapi/ttjsapi-1.0.0.min.js"></script>
<button id="ttBtn">抖音选图/拍照</button>
<script>
// 判断是否在抖音小程序WebView
function isDouyinMiniProgram() {
return navigator.userAgent.toLowerCase().includes('toutiaomicroapp');
}
document.getElementById('ttBtn').addEventListener('click', () => {
if (!isDouyinMiniProgram()) {
alert('请在抖音小程序内打开');
return;
}
tt.miniProgram.chooseImage({
count: 1,
sourceType: ['album', 'camera'],
success: (res) => {
console.log('抖音选图成功', res.tempFilePaths);
// 临时路径可预览、上传
},
fail: (err) => {
console.error('抖音选图失败', err);
}
});
});
</script>
六、三端核心差异对比表
表格
| 平台 | 是否需要后端签名 | SDK 引入方式 | 选图 API | 直接支持视频 | 额外要求 |
|---|---|---|---|---|---|
| 微信小程序 | 需要 | CDN/npm | wx.chooseImage | ❌ 不支持 | 公众号 AppID + JSSDK 签名 |
| 支付宝小程序 | 不需要 | CDN | ap.chooseImage | ❌ 不支持 | 监听 JSBridge 就绪 |
| 抖音小程序 | 不需要 | CDN | tt.miniProgram.chooseImage | ❌ 不支持 | UA 判断环境 |
七、扩展:视频选择统一方案(三端通用)
三端 H5 SDK均不支持直接选择视频,统一方案:
-
H5 通过
postMessage发送指令给小程序; -
小程序原生调用对应视频 API:
- 微信:
wx.chooseMedia - 支付宝:
my.chooseVideo - 抖音:
tt.chooseMedia
- 微信:
-
小程序拿到视频临时路径,上传之后,再通过
postMessage回传给 H5; -
H5 接收后预览。
八、总结
- H5 嵌入小程序 WebView,放弃 input-file,统一用平台官方 JS-SDK 调用原生能力;
- 微信最复杂,需后端签名配置;支付宝、抖音零配置直接调用;
- 三端 H5 都只能选图片,视频必须走「H5 ↔ 小程序通信」由原生 API 处理;
- 选图回调
success仅获取临时文件,业务场景必须上传才能永久使用。