草庐IT

【小程序迁移】微信小程序迁移到支付宝记坑

sys_rst_n 2023-04-08 原文

【小程序迁移】微信小程序迁移到支付宝记坑

文档控制台网址汇总

不像微信的全部集中在一个控制台,一份文档,支付宝小程序更像是拼凑出来的东西,小程序一份文档一个控制台,云开发又一个,还不太好找,因此把链接汇集于此。

  1. 小程序开发文档:小程序本地API的文档。
  2. 小程序云开发文档:小程序云开发API的文档。
  3. 小程序开放平台:相当于微信公众平台,在这里你可以管理小程序的版本、信息、设置体验版、提交审核等。
  4. 小程序云:管理云开发资源,包括云函数、云文件、数据库等。
  5. 阿里云OpenAPI开发者门户:用于设置云函数超时时间,内存大小,数据库导入导出、云存储等的网站,不提交工单我都不知道有这东西。
  6. 提交工单:有问题直接提问,回复还是挺迅速的。
  7. EMAS平台:IDE云开发工具跳转,没什么用,可用作跳板打开小程序云。

前言

最近微信小程序云开发开始收费,从免费直接涨到了19.9元/月,论割韭菜还得是你腾讯,我的小程序尽管用的人不多,但那都是心血之作啊。为了学习微信小程序开发,把大部分的接口和API都调用过了,个人最多只能接受涨到5块/月,没办法,只能上微信的友商支付宝看看了。

微信云开发计费调整公告官方
微信团队07-04
各位微信云开发用户:
感谢大家一直以来对微信云开发的支持。由于云计算成本整体上升,为了继续为各位用户提供稳定可靠的服务,微信云开发将于 2022 年 08 月 18 日,对计费方式进行如下变更,部分指标价格将有所上浮。
新计费模式下,新用户免费使用 1 个月后,统一使用 “基础套餐+按量付费” 模式:购买带有一定配额的基础套餐后,超出套餐配额部分再按照实际使用量付费。

研究了一下,发现支付宝平台一样提供小程序云开发功能,并且免费!那就每天的空闲时间迁移一下吧。于是开始了我的微信小程序《通信人的工具箱》的迁移工作,有兴趣的朋友可以两边的都试一下看看区别,支付宝的可能还在审核。
然后就开始了迁移工作,并把需要手动修改的部分都记录了下来,方便后来的朋友参考。为了熟悉支付宝开发,我没有使用官方的antmove小工具进行迁移。小工具我试用了一下,发现里面使用了一大堆的JS代码做装饰器,把wx.装饰成my.,降低了程序的执行效率,提高了代码包的体积,也不利于学习,所以笔者手动迁移代码。
需要注意的是:下述的仅仅为我的小程序用到的接口需要修改的地方,并不是所有的区别。

本地区别

仅企业可用的功能

  1. 录音,详见:my.getRecorderManager
  2. 粘贴板,详见:my.setClipboard

第一点就很难受了,😟,相当于小程序的声音频谱分析功能无法迁移了。第二点是真的不能理解,我就是往用户的粘贴板写入处理结果,结果就不行。

限制功能

  1. 音乐播放器不支持播放本地的或者云存储的音乐,只能播放调用录音接口或者上传到优酷的音频文件,详见:音频播放 API 使用说明

直接使得小程序的“信号发生器”功能无法迁移,心凉了半截,不过为了学习,还是接着往下看吧。

插件区别

  1. 基础库2.0下不支持echarts数据绘图插件,官方建议用@AntV/F2代替。

云开发API区别

  1. 云文件的云端路径无法指定,不支持创建文件夹。
  2. 云文件只可以存储指定类型格式的文件。详见:uploadFile
  3. 云函数超时时间最大只能设置10s,在一些等待接口响应的业务很容易超时。

需要做的代码变更

xml部分

  1. 控件标签 bindtap -> onTap
  2. 控件标签 bindchange -> onChange
  3. 控件标签 bindinput -> onInput
  4. 渲染控制 wx: -> a:
  5. image控件: bindtouchend -> onTap
  6. canvas控件:canvas-id -> id
  7. input控件:要添加controlled='true’标签,否则可能不受setData控制
  8. textarea控件:可以慎重添加controlled='true’标签,但是有坑,用了可能会出现用户无法输入的情况。

CSS部分

  1. 不支持CSS样式暗夜模式的识别与匹配,具体为微信端的“@media (prefers-color-scheme: dark)”标签。
  2. page注意p要小写,否则样式不生效,微信无所谓。

JS部分

  1. my.showLoading不支持mask参数,实测默认是有遮罩的。
  2. my.showLoading的title参数名替换为content,详见:my.showLoading
  3. wx.showModal -> my.confirm ,且不支持showCancel参数。
  4. my.showToast没有icon参数,取而代之的是type,title参数名替换为content,详见:my.showToast
  5. 支付宝的弱社交功能,Page内没有onShareAppMessage和onShareTimeline,只有onShareAppMessage,详见:页面运行机制
  6. 表单元素查询不能使用this.selectComponent。
  7. wx.setNavigationBarTitle -> my.setNavigationBar,详见:my.setNavigationBar

自定义组件

  1. components不支持在调用它的页面中selectComponent或createSelectorQuery获取实例对象,需要在components的ref()中返回,在宿主的xml中使用ref标签定义监听函数,在JS的对应的监听函数中获取,详见:ref 获取组件实例
  2. 开发时遇到components的methods中的this指针没有setData方法,已经确定this指向没有改变,按照官方文档也不行。最后含有setData方法的this指针通过组件的didmount()生命周期的监听函数中的this获取。

比微信好的地方

  1. 云函数调用似乎没有限制参数和返回结果的数据长度,我用b64编码一张图片作为参数调用云函数,云函数返回一张图片,居然成功了。在微信端会提示参数过长,得先把图片上传云文件,云函数读取云文件图片读取后把结果保存到云文件,本地在下载处理结果。
  2. 保存图片到用户相册无需一长串的权限申请,直接调用my.saveImageToPhotosAlbum即可,就是不支持模拟器调试。
    my.saveImageToPhotosAlbum({
      filePath:that.data.output_image_src,
    }).then(e=>{
      my.showToast({
        content:'保存成功',
        type:'success',
      });
    }).catch(e=>{
      console.error(e);
      my.showToast({
        content:'保存失败,请用真机测试相册保存功能',
        type:'fail',
      })
    });
  1. 数据库更新支持"没有则创建"的选项,这个比微信要好,详见:updateOne
  2. 获取用户的唯一id不需要通过云函数,只需要调用授权函数即可。
  const res = await my.serverless.user.authorize({
    authProvider: "alipay_openapi"
  });
  if (res.success) {
  	//获取用户UUID
    my.serverless.user.getInfo().then(user => {
      console.log(user);
      //设为全局对象
      that.globalData.user = user.result.user;
  	}
  }

附录一些常用的代码段

云函数

//云端定义
module.exports = async (ctx) => {
  const {a, b} = ctx.args;
  return a + b;
}
//同步式调用
const { result } = await mpserverless.function.invoke('sum', { a: 1, b: 1 });
//异步式调用
mpserverless.function.invoke('sum', { 
	a: 1, b: 1 
}).then(console.log).catch(console.error);

数据库

//更新一条数据,不存在则创建
mpserverless.db.collection('users').updateOne({
    age: {$gt: 18}
}, {$set: {
    name: "Smith",
    age: 22,
    }
}, {
    upsert: true,
})
.then(res => {})
.catch(console.error);

云文件

//上传一个文件,无法指定云端路径
mpserverless.file.uploadFile({
      filePath: path,
    })
	.then(res => {})
	.catch(err => {});

后语

经过这次迁移,我知道微信涨价的底气在哪了,支付宝的小程序云开发感觉就是个半成品。支付宝的小程序大部分是一些点单的,交易的,其它类别用的人并不多,所以开发的除了商业需要,基本就像我一样是纯粹学习的。微信平台则用户众多,社交属性强大,这些更提供了它涨价的基础。现在19.9元/月还能勉强承受,后面变成39我估计就下线小程序云功能了。。。看到这了,不点个赞再走嘛?

后记

本部分用于记录小程序上线前的log,本以为小程序可以通过顺利审核,但可能支付宝比较谨慎,或者刚好赶上敏感时期,居然被驳回了,于是把该过程按时间线记录于此,以供参考。

  1. @2022/10/14 晚上:提交初次审核,小程序本体与信息会一同进行审核。
  2. @2022/10/19 11:53:被驳回,原因如下:

1、当前小程序具有违规情形,在可搜索,可编辑内容上没有对涉政敏感信息做特殊防控,涉及一些特殊人名或政治相关图片信息透出,希望商家自行排查。同时也可申请接入支付宝开放能力,详见:https://www.yuque.com/docs/share/88a1c6f2-1839-4028-ac5c-b1537c08f165?#|应用内容

打开链接发现是《内容风险识别接口服务·语雀》,意思就是要接入它家的内容审核平台呗,,该接口目前是邀约制,需要把小程序appid和名称发送到经理开通。
往下查看了接口的API,发现图片居然不能B64解码后发过去,而要上传图片的urls,还好查看文档后发现小程序云文件支持公开链接,或许可以试试。
3. @2022/10/21 11:09: 经过一番思想纠结后,其实是临近毕业,繁杂事务多了起来,等偷得半日闲时终于想起这事了,决定还是开通《内容风险识别接口服务》试试,发送了开通申请。
4. @2022/10/22 14:06: 文档太烂,经过一番调试与摸索,接入了《内容风险识别接口服务》并提交了第二次审核,接入过程已记录到我的文章《【小程序·开发】支付宝小程序接入<内容风险识别服务>流程指南》,欢迎参考。
5. @2022/10/22 17:19:支付宝小程序过审啦!!!

有关【小程序迁移】微信小程序迁移到支付宝记坑的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  10. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

随机推荐