利用uni-app开发支付宝和微信小程序的兼容处理

2,722 阅读3分钟

背景

我们有一个项目,刚开始只是做支付宝小程序,但是到了后期,需求方说,需要将这个项目,同步上线到微信小程序中。刚好我们项目是用uni-app开发,想着移植到微信小程序中,应该没有太大的问题,只需要将npm run build:mp-alipay修改npm run build:mp-weixin。可能存在些许样式问题,或者部分属性,方法不兼容。工作量应该不大,但是实际做下来,发现问题还是比我们预想的多了一些,所以想记录下来,分享给大家,也作为自己处理这些兼容性的记录,方便下次遇到同样的问题,能快速解决。

问题1:页面链接参数encodeURIComponent

当我们进入某个页面的时候,页面链接上的参数存在encodeURIComponent,支付宝小程序会在onLoad的获取参数的时候,会在获取参数之前自动帮我进行decodeURIComponent出来,而微信小程序则不会,是什么样子,就是什么样子。看个例子:

// 跳转某个页面逻辑
const searchWord = "test test"
const jumpUrl = `pages/test/index?keyword=${encodeURIComponent(this.searchWord)}`

// 我们对searchWord进行了encodeURIComponent处理。
// 当我们进行pages/test/index页面的时候,onLoad获取的参数,两者出现了不一致
// 以下为伪代码

onLoad (option) {
   console.log('微信小程序>>>>>>>>', option.keyword) 
   // 输出为 test%20test
   console.log('支付宝小程序>>>>>>>>', option.keyword)
   // 输出为 test test
}

如何解决这个问题呢,其实很简单,只需要在onLoad的获取option参数的时候,再次decodeURIComponent(option)。这个涉及的修改还是比较少的,只需要修改encodeURIComponent 参数的页面即可。

问题2:模板解析差异

看个下面这个例子:

const keyword = '关键字'
<text>"{{keyword}}"</text>
// 支付宝就正常展示为:"关键字"
// 微信展示为:“"关键字"”

这个问题应该是两边模板解析导致不一致导致的,处理方式就是渲染内容放到变量里面即可。

<text>{{ searchText }}</text>
 computed: {
     searchText() {
      return `"${this.keyword}"`
    }
 } 

问题3:发票接口

支付宝需要在小程序拿到dynamicCode调服务端接口,才会拿到发票抬头信息。 抬头应用 - 支付宝文档中心 (alipay.com)

my.chooseInvoiceTitle({
  success: (res) => {
    const { dynamicCode } = res
   // 这里可以拿到 dynamicCode
   // 将 dynamicCode 传给服务端,服务端再调用openapi 获取真实的发票抬头         
  },
});

微信的话,直接在小程序中,调chooseInvoiceTitle接口,就可以拿到发票抬头信息。比支付宝少了一步。 wx.chooseInvoiceTitle(Object object) | 微信开放文档 (qq.com)

两者返回的字段名有些许差异,大家可以统一做一下映射。在此就不再赘述。

问题4:请求参数问题

这个问题,可以戳我的另一篇文章,有详细的解释:你一定不会注意到的get请求参数问题

问题5:平台本身的差异性

  • 订阅消息

支付宝需要按照my.getAuthCode - 支付宝文档中心 (alipay.com),而微信需要按照需要按照uni.requestSubscribeMessage(Object object) | uni-app官网 (dcloud.net.cn)

  • CSS变量或者样式在不同平台解析的结果不一致时
 padding-bottom: calc(24rpx + var(--safe-area-inset-bottom)); // 微信
 padding-bottom: calc(24rpx + env(safe-area-inset-bottom)); // 支付宝
  • header能否自定义

微信可以自定义header, 支付宝的是不允许自定义header, 如果你的项目,针对不同的平台,有不同的表现形式的话,需要注意注意兼容处理。

类似这种平台本身的语法,api都不一致的,就直接使用条件编译即可。 跨端兼容

  • 支付

支付宝文档tradePay - 支付宝文档中心 (alipay.com)

my.tradePay({
  tradeNO, // 支付宝交易号。
  success() {
    resolve({ error: false })
  },
  fail(error) {
    console.log('tradePay error: ', error)
    resolve({ error: true })
  }
})

微信的话,直接采用wx.requestPayment(Object object) | 微信开放文档 (qq.com)方法即可。

结尾

由于这个项目时间也比较久了,能记起来的就只有这么多了,后面想到了,再补充上去。希望上述的分享能对大家开发过程中有所帮助。如果大家也有这方面的经验,也可以分享在评论区,以便相互交流学习。

如有错误,恳请指正。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情