z***@126.com
z***@126.com
  • 发布:2022-08-01 13:05
  • 更新:2022-08-01 16:54
  • 阅读:711

在开发unicloud+微信支付分账时遇到的奇葩问题和解决方案,原因未知渴望解答

分类:uniCloud

背景与需求

我负责开发运维的一款家政服务类小程序,支持微信在线支付,并在支付完成后,通过微信分账功能,将渠道环节的费用直接分账到渠道个人微信,例如,推荐人的分成直接到账。

理想与现实

理想

通过微信支付回调接口,触发分账,计算各个渠道的分账比例和金额,提交给微信,由微信完成分账。分账结果返回后,在平台做财务记录,完成分账。

现实

实际遇到的问题比想象的多出了很多,例如:
1,用户支付完成后立即发起分账申请,会失败,报错是验签失败(这根本和验签无关,是支付流程结束后等一段才能申请分账)
2,直接通过unicloud云函数A调用分账,不返回任何数据,云函数直接结束。(而如果通过另一个云函数B调用云函数A,则能正常返回数据)
3,如果在本地直接运行云函数B,调用云函数A,在支付完成后的大约1分钟后,可正常返回。但如果直接运行云函数A,则分账被执行,但不返回任何结果。
4,如果在云函数B中稍微代码多一点的位置调用云函数A,则会返回验签失败错误。如果在云函数B的靠前位置调用,则返回成功。
5,如果将云函数部署到云端,并通过设置外链方式触发云函数,则返回验签失败错误。但如果在本地hbuilderx里右键,本地运行,则正常。
6,如果在本地hbuilderx里右键云函数B,选择上传并运行,则返回验签失败错误。
7,在分账成功后,有时候不会立即返回分账成功的消息,分账状态是PROCESSING,因此需要过大约几分钟,调用查询分账的接口获取状态。但是,该接口必须在云函数A中直接执行,如果用其他函数调用,则返回验签失败错误。
8,如果设置云函数B为定时触发,在B中调用A,则正常。但如果选择访问链接方式触发云函数B,则大部分情况下是失败,偶尔成功。
9,发现对同一笔订单进行重复的分账,反而比get分账状态接口更好用。如果对同一笔订单再次申请分账,则会准确返回分账状态。
10,发现云函数B触发时的context不太一样,我将context强制定义成本地右键云函数本地运行方式才可正常返回分账结果。抓取方式是,云函数B中,event后面加,context,然后打印,再讲打印的结果,强行赋值给context,这样从任何地方访问,都会被认为是本地执行。

解决方案

1,建立云函数A,里面是分账代码。
2,建立云函数B,调用和执行云函数A,触发分账。
3,再次调用云函数B,再次对同一笔订单执行相同操作分账,可返回分账状态。
4,云函数B的触发方式很多,但只有两种(本地hbuilderx云函数右键本地运行和自动定时触发)不会报验签错误,而其中只有一种可部署到生产环境下,即定时触发。
5,阿里云限制云函数触发周期最短1小时,因此我建立了共6个云函数B,实现到了10分钟触发一次,云函数名额有限,只能临时采取这种方式了。

思考

我认为这种腾讯支付API不稳定的状态可能与发起提交的数据中的headers之类数据相关,要不然为什么相同的代码,本地运行可以,传到云函数运行就不行,或者定时触发可以,外链方式触发就不行,这些地方太诡异了。

打个广告

个人团队可承接微信小程序开发任务,定制各种疑难技术问题解决方案,V361757或私信即可。

0 关注 分享

要回复文章请先登录注册

DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

每太了解你业务代码的具体写法,但是以下文档推荐可以看看是不是对你有帮助。 [https://uniapp.dcloud.net.cn/uniCloud/cf-functions.html#keep-running](https://uniapp.dcloud.net.cn/uniCloud/cf-functions.html#keep-running)
2022-08-01 16:54