微信小程序转支付宝小程序迁移指南
配置文件差异
全局配置(app.json)
| 配置项 | 微信小程序 | 支付宝小程序 | 说明 |
|---|---|---|---|
| 页面路径 | pages | pages | ✅ 相同 |
| 窗口配置 | window | window | ✅ 相同,但部分属性名不同 |
| 底部导航 | tabBar | tabBar | ⚠️ 属性名有差异 |
| 网络超时 | networkTimeout | httpRequest.timeout | ⚠️ 结构不同 |
window 配置差异
// 微信小程序
{
"navigationBarTitleText": "标题",
"navigationBarBackgroundColor": "#000000",
"navigationBarTextStyle": "white"
}
// 支付宝小程序
{
"defaultTitle": "标题",
"titleBarColor": "#000000",
"transparentTitle": "none"
}
tabBar 配置差异
// 微信小程序
{
"color": "#999",
"selectedColor": "#1AAD19",
"list": [{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "icon.png",
"selectedIconPath": "icon-active.png"
}]
}
// 支付宝小程序
{
"textColor": "#999",
"selectedColor": "#1AAD19",
"items": [{
"pagePath": "pages/index/index",
"name": "首页",
"icon": "icon.png",
"activeIcon": "icon-active.png"
}]
}
生命周期函数映射
App 生命周期
| 微信小程序 | 支付宝小程序 | 说明 |
|---|---|---|
onLaunch | onLaunch | ✅ 相同 |
onShow | onShow | ✅ 相同 |
onHide | onHide | ✅ 相同 |
onError | onError | ✅ 相同 |
Page 生命周期
| 微信小程序 | 支付宝小程序 | 说明 |
|---|---|---|
onLoad | onLoad | ✅ 相同 |
onShow | onShow | ✅ 相同 |
onReady | onReady | ✅ 相同 |
onHide | onHide | ✅ 相同 |
onUnload | onUnload | ✅ 相同 |
onPullDownRefresh | onPullDownRefresh | ✅ 相同 |
onReachBottom | onReachBottom | ✅ 相同 |
onShareAppMessage | onShareAppMessage | ⚠️ 支付宝返回对象结构不同 |
Component 生命周期
| 微信小程序 | 支付宝小程序 | 说明 |
|---|---|---|
created | onInit | ⚠️ 名称不同 |
attached | deriveDataFromProps | ⚠️ 差异较大 |
ready | didMount | ⚠️ 名称不同 |
detached | didUnmount | ⚠️ 名称不同 |
核心API对比
网络请求
// 微信小程序
wx.request({
url: 'https://api.example.com/data',
method: 'GET',
success: (res) => {},
fail: (err) => {}
})
// 支付宝小程序
my.request({
url: 'https://api.example.com/data',
method: 'GET',
success: (res) => {},
fail: (err) => {}
})
常用API映射表
| 功能 | 微信小程序 | 支付宝小程序 |
|---|---|---|
| 全局对象 | wx | my |
| 页面跳转 | wx.navigateTo | my.navigateTo |
| 重定向 | wx.redirectTo | my.redirectTo |
| 返回 | wx.navigateBack | my.navigateBack |
| 提示框 | wx.showToast | my.showToast |
| 加载提示 | wx.showLoading | my.showLoading |
| 模态对话框 | wx.showModal | my.confirm / my.alert |
| 本地存储(同步) | wx.setStorageSync | my.setStorageSync |
| 本地存储(异步) | wx.setStorage | my.setStorage |
| 获取系统信息 | wx.getSystemInfo | my.getSystemInfo |
| 扫码 | wx.scanCode | my.scan |
| 支付 | wx.requestPayment | my.tradePay |
| 获取位置 | wx.getLocation | my.getLocation |
| 选择图片 | wx.chooseImage | my.chooseImage |
| 上传文件 | wx.uploadFile | my.uploadFile |
差异较大的API
模态对话框
// 微信小程序
wx.showModal({
title: '提示',
content: '确认删除?',
success: (res) => {
if (res.confirm) {
console.log('用户点击确定')
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
// 支付宝小程序(确认框)
my.confirm({
title: '提示',
content: '确认删除?',
success: (res) => {
if (res.confirm) {
console.log('用户点击确定')
}
}
})
// 支付宝小程序(警告框)
my.alert({
title: '提示',
content: '操作完成',
success: () => {}
})
扫码功能
// 微信小程序
wx.scanCode({
success: (res) => {
console.log(res.result)
}
})
// 支付宝小程序
my.scan({
type: 'qr',
success: (res) => {
console.log(res.code)
}
})
组件差异
基础组件对比
| 功能 | 微信小程序 | 支付宝小程序 | 差异说明 |
|---|---|---|---|
| 视图容器 | <view> | <view> | ✅ 相同 |
| 滚动容器 | <scroll-view> | <scroll-view> | ✅ 基本相同 |
| 滑块 | <swiper> | <swiper> | ⚠️ 部分属性不同 |
| 文本 | <text> | <text> | ✅ 相同 |
| 图标 | <icon> | <icon> | ⚠️ type值不同 |
| 图片 | <image> | <image> | ⚠️ mode值部分不同 |
| 输入框 | <input> | <input> | ⚠️ 部分事件名不同 |
| 多行输入 | <textarea> | <textarea> | ⚠️ 部分属性不同 |
| 按钮 | <button> | <button> | ⚠️ open-type值不同 |
| 表单 | <form> | <form> | ✅ 基本相同 |
| 导航 | <navigator> | <navigator> | ✅ 基本相同 |
button 组件差异
<!-- 微信小程序 -->
<button open-type="getUserInfo" bindgetuserinfo="getUserInfo">获取用户信息</button>
<button open-type="contact">联系客服</button>
<button open-type="share">分享</button>
<!-- 支付宝小程序 -->
<button open-type="getAuthorize" scope="userInfo" onGetAuthorize="getUserInfo">获取用户信息</button>
<button open-type="contact">联系客服</button>
<button open-type="share">分享</button>
image 组件 mode 属性差异
| 微信小程序 | 支付宝小程序 | 说明 |
|---|---|---|
scaleToFill | scaleToFill | ✅ 相同 |
aspectFit | aspectFit | ✅ 相同 |
aspectFill | aspectFill | ✅ 相同 |
widthFix | widthFix | ✅ 相同 |
top | top | ✅ 相同 |
bottom | bottom | ✅ 相同 |
center | center | ✅ 相同 |
left | left | ✅ 相同 |
right | right | ✅ 相同 |
样式差异
单位
| 单位 | 微信小程序 | 支付宝小程序 | 说明 |
|---|---|---|---|
rpx | ✅ 支持 | ⚠️ 不支持 | 支付宝使用 rpx 需配置 |
px | ✅ 支持 | ✅ 支持 | 都支持 |
解决方案:支付宝小程序建议使用 px 单位,或在 app.json 中配置:
{
"window": {
"enableRpx": true
}
}
样式导入
/* 微信小程序 */
@import "common.wxss";
/* 支付宝小程序 */
@import "common.acss";
文件扩展名
| 文件类型 | 微信小程序 | 支付宝小程序 |
|---|---|---|
| 页面结构 | .wxml | .axml |
| 页面样式 | .wxss | .acss |
| 页面逻辑 | .js | .js |
| 页面配置 | .json | .json |
迁移步骤清单
1. 准备阶段
- 备份微信小程序源代码
- 创建支付宝小程序项目
- 安装支付宝小程序开发工具
2. 配置文件迁移
- 修改
app.json配置- 更新
window配置项名称 - 修改
tabBar中的list为items - 调整
tabBar属性名称
- 更新
- 修改页面配置文件
3. 代码迁移
- 全局替换
wx为my - 修改生命周期函数(组件相关)
- 更新 API 调用
-
wx.showModal→my.confirm或my.alert -
wx.scanCode→my.scan - 其他差异较大的 API
-
- 修改组件属性
-
button组件的open-type - 事件绑定名称(
bind→on)
-
4. 文件重命名
-
.wxml文件改为.axml -
.wxss文件改为.acss - 更新文件引用路径
5. 样式调整
- 检查
rpx单位使用,考虑启用或改为px - 修改样式导入语句
- 测试样式兼容性
6. 测试验证
- 页面跳转功能测试
- 网络请求测试
- 本地存储测试
- 用户授权流程测试
- 支付功能测试(如有)
- 扫码功能测试(如有)
- 各页面 UI 显示测试
- 交互功能测试
7. 优化调整
- 根据测试结果修复问题
- 性能优化
- 代码规范检查
常见问题
1. 事件绑定名称差异
问题:微信小程序使用 bind 前缀,支付宝小程序使用 on 前缀。
<!-- 微信小程序 -->
<button bindtap="handleClick">点击</button>
<!-- 支付宝小程序 -->
<button onTap="handleClick">点击</button>
解决方案:使用查找替换功能批量修改:
bindtap→onTapbindinput→onInputbindchange→onChange- 等等...
2. 分包加载配置差异
// 微信小程序
{
"subPackages": [
{
"root": "packageA",
"pages": ["pages/index/index"]
}
]
}
// 支付宝小程序
{
"subPackages": [
{
"root": "packageA",
"pages": ["pages/index/index"]
}
]
}
✅ 分包加载配置基本相同
3. 自定义组件差异
微信小程序:
Component({
properties: {
title: String
},
data: {},
methods: {
handleClick() {}
},
lifetimes: {
attached() {},
detached() {}
}
})
支付宝小程序:
Component({
props: {
title: ''
},
data: {},
methods: {
handleClick() {}
},
didMount() {},
didUnmount() {}
})
关键差异:
properties→propslifetimes.attached→didMountlifetimes.detached→didUnmount
4. 获取用户信息方式不同
微信小程序:
wx.getUserInfo({
success: (res) => {
console.log(res.userInfo)
}
})
支付宝小程序:
my.getAuthCode({
scopes: ['auth_user'],
success: (res) => {
// 需要将 authCode 发送到服务端换取用户信息
console.log(res.authCode)
}
})
5. Canvas API 差异较大
微信和支付宝的 Canvas API 有较大差异,需要针对性改造。建议:
- 使用条件编译或适配层
- 创建统一的 Canvas 工具类
- 分别实现两个平台的具体逻辑
6. 支付功能差异
// 微信小程序
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success: (res) => {},
fail: (err) => {}
})
// 支付宝小程序
my.tradePay({
tradeNO: '', // 支付宝交易号
success: (res) => {},
fail: (err) => {}
})
自动化工具推荐
1. 文件批量重命名脚本
# 将 .wxml 改为 .axml
find . -name "*.wxml" -exec sh -c 'mv "$0" "${0%.wxml}.axml"' {} \;
# 将 .wxss 改为 .acss
find . -name "*.wxss" -exec sh -c 'mv "$0" "${0%.wxss}.acss"' {} \;
2. 批量替换 API
可以使用 VS Code 的全局查找替换功能:
- 查找:
wx\. - 替换:
my. - 注意检查替换结果,避免误替换
3. 第三方转换工具
- Taro:支持一次编写,多端运行(包括微信、支付宝)
- uni-app:跨平台开发框架
- 小程序转换工具:各平台提供的官方转换工具
参考资料
总结
微信小程序和支付宝小程序的整体架构相似,但在细节上存在诸多差异。迁移过程中需要注意:
- 全局对象:
wx→my - 配置文件:特别注意
window和tabBar的属性名差异 - 组件生命周期:组件的生命周期函数差异较大
- 事件绑定:
bind→on - 文件扩展名:
.wxml/.wxss→.axml/.acss - 部分 API:如支付、扫码、模态框等需要单独处理
建议采用渐进式迁移策略,先完成基础功能迁移,再逐步优化和完善。