2021.2.1 明日方舟 bilibili 渠道服在大约 04:00 - 05:30 期间,购买组合包「每月寻访组合包」显示价格为正常价格(¥168.00)但点击后弹出的支付系统显示所需支付金额为 ¥0.01。同时,使用支付宝/微信支付均可支付成功、回到游戏并成功领取对应组合包所含物资。鉴于此类事件实在离谱,故在此尝试对漏洞诱因进行技术向猜测。

原贴于 NGA 发布,但猜测由于当时版内已经出现节奏倾向,故帖子连带其他讨论此次事件的帖子都被夹掉了。这篇博文的内容也是多亏了 Google 的网页快照,我没新开编辑器写(抹泪

提前声明:我没b服账号,以及我也不会利用这种bug(有点趁人之危的感觉)

「明日方舟」于 2021.2.1 09:58 的 App Store 界面截图

根据 App Store 的内购名称「每月寻访组合包 2021 年第一期」,合理做出以下几点推断与猜测:

  1. 为了防止每个月能买到两个大月卡,或者由于其他限制,方舟的大月卡这个内购项目每个月都需要创建一个新商品,然后每个账户对每个大月卡商品都只能购买一次。这样就做到了每个月只能买一次的限制,并且也不用对每次的购买记录都查询看是不是已经购买过这个月的月卡,数据库负载会小一些
  2. 昨天(2月1日)又是正常的需要换大月卡的一个晚上,官服那边已经加好了对应的新商品,即2月份的大月卡,并设置为到4点后允许购买;同时,官服有自己的支付系统,支付系统也已经同步这个信息,在收到客户端发来的“我要购买2月份的月卡”会返回正常的数值。
  3. 但是,bilibili 的工作人员在自己的支付系统上昨天没有加这条记录,原因和究竟是不是这样我也不清楚因为我不是b站工作人员(笑)。进而导致,在 bilibili 的支付系统收到客户端发来的「我要购买2月份的月卡,创建一个订单然后给我说多少钱」后,支付系统并没有找到这个商品,自然而然就没有价格;但是支付系统可能出于某种错误保护的策略,返回了0.01元(若向支付宝/微信的支付网关传参内,金额为0元的话,支付网关会报错),这条流程就能走通了:客户端拿到支付系统传来的支付宝/微信支付链接,跳转支付,成功后
  4. bilibili 那边支付系统收到了来自支付宝/微信的支付成功的确认,于是 bilibili 服务器给鹰角的游戏数据管理服务器说:「用户ID为xxx的用户成功买了大月卡你那边给他满上」,鹰角服务器说好,到账。
  5. 至于这里为什么支付金额0.01但是依然能购买成功的问题,那就得怪 bilibili 的支付系统写的太烂了。。。

那么修的那么快的原因也就出来了:只要 bilibili 在支付系统那边加上对应的商品,新的支付请求就会返回正确的数值了 :D

只是一个猜测而已,望轻喷x


原帖内有大佬说可能只是测试接口写错了,我觉得这也是有可能的,但是相比于把测试后端直接推到了生产上我觉得上面这个可能性更大一些,有这么几个原因:

  1. 事情刚刚好发生在大月卡轮换的时间点上(甚至不是12:00而是4:00)
  2. 据我所知,bilibili 运营的其他游戏的支付系统没有影响。

上面两个条件都符合撞到了这次0.01的事件上感觉概率还是挺小的。