微信小程序转支付宝小程序迁移指南
配置文件差异
全局配置(app.json)
配置项 | 微信小程序 | 支付宝小程序 | 说明 |
---|---|---|---|
页面路径 | pages |
pages |
✅ 相同 |
窗口配置 | window |
window |
✅ 相同,但部分属性名不同 |
底部导航 | tabBar |
tabBar |
⚠️ 属性名有差异 |
网络超时 | networkTimeout |
httpRequest.timeout |
⚠️ 结构不同 |
window 配置差异
json
// 微信小程序
{
"navigationBarTitleText": "标题",
"navigationBarBackgroundColor": "#000000",
"navigationBarTextStyle": "white"
}
// 支付宝小程序
{
"defaultTitle": "标题",
"titleBarColor": "#000000",
"transparentTitle": "none"
}
tabBar 配置差异
json
// 微信小程序
{
"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对比
网络请求
javascript
// 微信小程序
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
模态对话框
javascript
// 微信小程序
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: () => {}
})
扫码功能
javascript
// 微信小程序
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 组件差异
html
<!-- 微信小程序 -->
<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
中配置:
json
{
"window": {
"enableRpx": true
}
}
样式导入
css
/* 微信小程序 */
@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
前缀。
html
<!-- 微信小程序 -->
<button bindtap="handleClick">点击</button>
<!-- 支付宝小程序 -->
<button onTap="handleClick">点击</button>
解决方案:使用查找替换功能批量修改:
bindtap
→onTap
bindinput
→onInput
bindchange
→onChange
- 等等...
2. 分包加载配置差异
json
// 微信小程序
{
"subPackages": [
{
"root": "packageA",
"pages": ["pages/index/index"]
}
]
}
// 支付宝小程序
{
"subPackages": [
{
"root": "packageA",
"pages": ["pages/index/index"]
}
]
}
✅ 分包加载配置基本相同
3. 自定义组件差异
微信小程序:
javascript
Component({
properties: {
title: String
},
data: {},
methods: {
handleClick() {}
},
lifetimes: {
attached() {},
detached() {}
}
})
支付宝小程序:
javascript
Component({
props: {
title: ''
},
data: {},
methods: {
handleClick() {}
},
didMount() {},
didUnmount() {}
})
关键差异:
properties
→props
lifetimes.attached
→didMount
lifetimes.detached
→didUnmount
4. 获取用户信息方式不同
微信小程序:
javascript
wx.getUserInfo({
success: (res) => {
console.log(res.userInfo)
}
})
支付宝小程序:
javascript
my.getAuthCode({
scopes: ['auth_user'],
success: (res) => {
// 需要将 authCode 发送到服务端换取用户信息
console.log(res.authCode)
}
})
5. Canvas API 差异较大
微信和支付宝的 Canvas API 有较大差异,需要针对性改造。建议:
- 使用条件编译或适配层
- 创建统一的 Canvas 工具类
- 分别实现两个平台的具体逻辑
6. 支付功能差异
javascript
// 微信小程序
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success: (res) => {},
fail: (err) => {}
})
// 支付宝小程序
my.tradePay({
tradeNO: '', // 支付宝交易号
success: (res) => {},
fail: (err) => {}
})
自动化工具推荐
1. 文件批量重命名脚本
bash
# 将 .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:如支付、扫码、模态框等需要单独处理
建议采用渐进式迁移策略,先完成基础功能迁移,再逐步优化和完善。