# UniApp + H5混合开发微信小程序 技术实施方案(UniApp端)
你希望通过UniApp开发微信小程序,以web-view嵌套H5承载核心业务展示,同时由UniApp原生层负责登录、退出、支付等核心能力,以下是UniApp端的详细技术实施方案,明确需要开发的核心模块、功能和关键逻辑。
## 一、整体架构与职责边界
### 核心分工
| 模块/能力 | UniApp(小程序端)负责 | H5端负责 |
|----------------|---------------------------------------------|--------------------------------|
| 用户身份 | 微信登录、token管理、用户信息存储、退出登录逻辑 | 接收并使用用户信息,触发退出登录指令 |
| 支付 | 调起微信支付、支付结果处理、支付状态同步 | 发起支付请求、展示支付结果 |
| 页面容器 | 提供tabBar框架、web-view容器、页面跳转控制 | 承载table栏、业务内容展示、内部页面跳转 |
| 通信 | 接收H5消息、主动向H5推送数据、处理通信异常 | 向UniApp发送指令、接收UniApp数据、展示状态反馈 |
## 二、UniApp端核心开发内容
### 1. 项目基础配置
#### (1)全局配置(pages.json)
配置tabBar、页面路由、web-view权限等核心配置:
```json
{
"pages": [
// 登录页
"pages/login/login",
// tabBar主页面(嵌套web-view)
"pages/index/index",
// 其他tabBar页面(如需)
"pages/my/my"
],
"tabBar": {
"color": "#666666",
"selectedColor": "#007AFF",
"backgroundColor": "#ffffff",
"borderStyle": "black",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "static/tabbar/home.png",
"selectedIconPath": "static/tabbar/home-active.png"
},
{
"pagePath": "pages/my/my",
"text": "我的",
"iconPath": "static/tabbar/my.png",
"selectedIconPath": "static/tabbar/my-active.png"
}
]
},
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序定位"
}
},
"webview": {
"webviewParameter": {
"allowUniversalAccessFromFileURLs": true,
"allowFileAccess": true
}
}
}
```
#### (2)微信小程序配置(manifest.json)
开启微信小程序相关权限,配置AppID等:
```json
{
"mp-weixin": {
"appid": "你的微信小程序AppID",
"setting": {
"urlCheck": false, // 允许访问非域名白名单的H5(开发阶段,正式需配置白名单)
"es6": true,
"postcss": true
},
"usingComponents": true,
"permission": {
"scope.userInfo": {
"desc": "获取你的用户信息用于登录"
}
}
}
}
```
### 2. 核心页面开发
#### (1)登录页(pages/login/login.vue)
负责微信授权登录、获取用户信息、token存储:
```vue
```
#### (2)tabBar首页(pages/index/index.vue)
核心容器页,嵌套web-view、处理与H5的通信:
```vue
```
#### (3)“我的”页面(pages/my/my.vue)
可选,如需原生展示用户信息、退出按钮等:
```vue
{{ userInfo.nickName }}
```
### 3. 全局工具类(可选)
封装通信、登录校验等通用方法,便于复用:
```js
// common/utils.js
/**
* 向H5发送消息
* @param {String} webViewId web-view的ID
* @param {Object} msg 消息内容
*/
export const sendMsgToH5 = (webViewId, msg) => {
const webViewCtx = uni.createWebViewContext(webViewId);
webViewCtx.postMessage({ data: msg });
};
/**
* 校验登录态
* @returns {Boolean} 是否已登录
*/
export const checkLogin = () => {
const token = uni.getStorageSync('wx_token');
if (!token) {
uni.redirectTo({ url: '/pages/login/login' });
return false;
}
return true;
};
```
### 4. 关键注意事项
1. **域名白名单配置**:微信小程序后台需配置H5域名、后端接口域名的白名单,否则无法访问;
2. **通信格式统一**:UniApp与H5的通信消息需约定固定格式(如`{type: 'xxx', data: 'xxx'}`),避免解析异常;
3. **支付权限**:确保小程序已开通微信支付权限,后端支付接口需正确对接微信支付商户平台;
4. **登录态同步**:H5页面刷新时,需重新从UniApp获取登录态(可通过URL参数或postMessage);
5. **兼容性**:web-view组件在微信小程序中部分JS API有限制,需避免在H5中调用小程序专属API(如支付、登录)。
## 总结
UniApp端核心开发内容可归纳为3个关键点:
1. **基础层**:配置tabBar、页面路由、微信小程序权限,搭建整体框架;
2. **核心能力层**:开发登录页实现微信授权登录,在web-view容器页处理与H5的通信,封装支付、退出登录等核心逻辑;
3. **保障层**:统一通信格式、配置域名白名单、处理登录态同步,确保混合开发模式稳定运行。