如何把微信小程序转换成支付宝小程序

206 阅读6分钟

微信小程序转支付宝小程序迁移指南

配置文件差异

全局配置(app.json)

配置项微信小程序支付宝小程序说明
页面路径pagespages✅ 相同
窗口配置windowwindow✅ 相同,但部分属性名不同
底部导航tabBartabBar⚠️ 属性名有差异
网络超时networkTimeouthttpRequest.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 生命周期

微信小程序支付宝小程序说明
onLaunchonLaunch✅ 相同
onShowonShow✅ 相同
onHideonHide✅ 相同
onErroronError✅ 相同

Page 生命周期

微信小程序支付宝小程序说明
onLoadonLoad✅ 相同
onShowonShow✅ 相同
onReadyonReady✅ 相同
onHideonHide✅ 相同
onUnloadonUnload✅ 相同
onPullDownRefreshonPullDownRefresh✅ 相同
onReachBottomonReachBottom✅ 相同
onShareAppMessageonShareAppMessage⚠️ 支付宝返回对象结构不同

Component 生命周期

微信小程序支付宝小程序说明
createdonInit⚠️ 名称不同
attachedderiveDataFromProps⚠️ 差异较大
readydidMount⚠️ 名称不同
detacheddidUnmount⚠️ 名称不同

核心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映射表

功能微信小程序支付宝小程序
全局对象wxmy
页面跳转wx.navigateTomy.navigateTo
重定向wx.redirectTomy.redirectTo
返回wx.navigateBackmy.navigateBack
提示框wx.showToastmy.showToast
加载提示wx.showLoadingmy.showLoading
模态对话框wx.showModalmy.confirm / my.alert
本地存储(同步)wx.setStorageSyncmy.setStorageSync
本地存储(异步)wx.setStoragemy.setStorage
获取系统信息wx.getSystemInfomy.getSystemInfo
扫码wx.scanCodemy.scan
支付wx.requestPaymentmy.tradePay
获取位置wx.getLocationmy.getLocation
选择图片wx.chooseImagemy.chooseImage
上传文件wx.uploadFilemy.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 属性差异

微信小程序支付宝小程序说明
scaleToFillscaleToFill✅ 相同
aspectFitaspectFit✅ 相同
aspectFillaspectFill✅ 相同
widthFixwidthFix✅ 相同
toptop✅ 相同
bottombottom✅ 相同
centercenter✅ 相同
leftleft✅ 相同
rightright✅ 相同

样式差异

单位

单位微信小程序支付宝小程序说明
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 中的 listitems
    • 调整 tabBar 属性名称
  • 修改页面配置文件

3. 代码迁移

  • 全局替换 wxmy
  • 修改生命周期函数(组件相关)
  • 更新 API 调用
    • wx.showModalmy.confirmmy.alert
    • wx.scanCodemy.scan
    • 其他差异较大的 API
  • 修改组件属性
    • button 组件的 open-type
    • 事件绑定名称(bindon

4. 文件重命名

  • .wxml 文件改为 .axml
  • .wxss 文件改为 .acss
  • 更新文件引用路径

5. 样式调整

  • 检查 rpx 单位使用,考虑启用或改为 px
  • 修改样式导入语句
  • 测试样式兼容性

6. 测试验证

  • 页面跳转功能测试
  • 网络请求测试
  • 本地存储测试
  • 用户授权流程测试
  • 支付功能测试(如有)
  • 扫码功能测试(如有)
  • 各页面 UI 显示测试
  • 交互功能测试

7. 优化调整

  • 根据测试结果修复问题
  • 性能优化
  • 代码规范检查

常见问题

1. 事件绑定名称差异

问题:微信小程序使用 bind 前缀,支付宝小程序使用 on 前缀。

<!-- 微信小程序 -->
<button bindtap="handleClick">点击</button>

<!-- 支付宝小程序 -->
<button onTap="handleClick">点击</button>

解决方案:使用查找替换功能批量修改:

  • bindtaponTap
  • bindinputonInput
  • bindchangeonChange
  • 等等...

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() {}
})

关键差异

  • propertiesprops
  • lifetimes.attacheddidMount
  • lifetimes.detacheddidUnmount

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:跨平台开发框架
  • 小程序转换工具:各平台提供的官方转换工具

参考资料


总结

微信小程序和支付宝小程序的整体架构相似,但在细节上存在诸多差异。迁移过程中需要注意:

  1. 全局对象wxmy
  2. 配置文件:特别注意 windowtabBar 的属性名差异
  3. 组件生命周期:组件的生命周期函数差异较大
  4. 事件绑定bindon
  5. 文件扩展名.wxml/.wxss.axml/.acss
  6. 部分 API:如支付、扫码、模态框等需要单独处理

建议采用渐进式迁移策略,先完成基础功能迁移,再逐步优化和完善。