云开发“分账功能”踩坑记
云开发的分账功能还在公测中,需要去申请开通。如果等了几天还没开通,可以在社区提问,会有官方人员来跟进。 我等了 5 天才开通。 开始之前,首先要搞清楚一个概念:云开发就是一个服务商,所以开发者不需要注册成为支付服务商,就可以使用服务商分账。 以下是我开发过程中遇到的一些坑。可能你会遇到其他坑,记得把调用接口的结果打印出来,看看报的是什么错。 1、文档不全,需要传 profit_sharing 或者 profitSharing 云开发统一下单接口的文档缺少 profit_sharing 参数,需要结合原支付接口文档来看,在分账对接步骤里也有说明。 如果没传这个参数,会报错:“非分账订单不支持分账”。 经过测试发现,这个参数是必需的,可以是 profit_sharing,也可以是 profitSharing,两者都兼容。由于其他参数都是驼峰写法,所以我用了 profitSharing . 2、不需要每次分账都“添加分账接收方” 添加分账接收方,只需要调一次接口即可,添加成功后,不需要每次分账都添加接收方。 有个小提醒,receiver 这个参数不是 JSON,而是JSON 序列化后的字符串,记得用 JSON.stringify 处理。序列化前是对象,不是数组,如果有多个接收方就调用多次接口。 (注意区分一下,在分账接口中,分账接收方的参数是 receivers,不是 receiver。不管单次分账还是多次分账,receivers 参数都是序列化后的字符串,序列化前是对象数组,不是对象) 这里还有个 bug,根据通知指引,我并没有找到这个入口:“商户平台 - 交易中心 - 管理分账接收方”。后面发了个提问帖,找到了这个暗门。登录商户平台,然后访问这个地址:https://pay.weixin.qq.com/index.php/xphp/ccmn_sharing/split_relation_manage 这可能也不是 bug,我猜估计是担心商户会有意或者无意的删除分账接收方。 3、sub_appid 是必填 文档有误,这个参数是必填。 4、PERSONAL_OPENID 和 PERSONAL_SUB_OPENID receivers 的 type 参数,PERSONAL_OPENID 和 PERSONAL_SUB_OPENID,刚开始会有点迷糊。我填的是 PERSONAL_SUB_OPENID,account 填小程序数据库里的用户 openid . 5、支付成功后,需要延时 1 分钟处理 支付成功后如果立即处理分账会报错:“订单处理中,暂时无法分账,请稍后再试”。 分账产品介绍的文档是这么写:“在交易完成后,准实时(建议1分钟后)或30天内调分账接口。” 我单独用了一个云函数来处理分账,setTimeout 设置 59 秒后调用分账接口。 在开发者工具里,进入该云函数的配置设置,把超时时间设置为 60 秒,否则会返回超时。 支付成功后调用该云函数。 2021-9-23 更新: 不能用 setTimeout 处理分账,这样云函数会一直占用内存,超成资源浪费(而且是巨大的浪费)。应改成定时触发,例如每小时触发一次,把已支付的并且支付时间已经过了一分钟的订单找出来,调用分账接口。