把自己的热爱变成事业,这可能是成年人最美好的事情之一。作为一个程序员,我有个梦想,那就是通过自己创造的产品让世界更美好,在实现人生价值的同时收获财务自由。简而言之,我希望能做着喜欢的事情过上好生活。

开一家公司可能是很好的选择,但并不适合目前的我,因为所有的想法都还未经检验。而正式的商业运营成本太高,在探索阶段,还是个人身份更为合适。想清楚之后,一个重要的问题就出现了:个人产品该怎样解决支付问题?

现状

就体验来说,PC端最方便的自然是扫码,手机上则是拉起付款界面。后者要求App里接入微信和支付宝的SDK,但目前两者都不对个人开放。扫码倒是哪里都可以,但一来没有回调,无法判断到底是否支付成功;二来需要定时刷新,以防止二维码过期失效。就安全来说,直接从支付平台结清到自己银行卡的叫一清,这也是最安全的。其它的都有一定的资金风险。

现在网上的解决方案主要有以下几种:

  1. 通过监听支付宝和微信的收款通知,实现结果回调。本质上还是扫二维码转账,只是把流程自动化了。收到的款实时进入自己账号余额。
  2. 二清平台,提供其公司的SDK,完整的回调功能。资金会在其平台上停留一段时间,定时结清。
  3. 发卡网站,整个环节完全交给第三方。

大部分都是第一种,包括github上(甚至还有手动审核回调的。。。),这种作为每天几次的解决方案还行,但是稳定性是真的不敢恭维。并发一上来就会有各种问题,而且最重要的,也无法防御恶意攻击。毕竟不是官方认可的使用方法,持续异常很容易被风控。

方案

最后是找到了微信某个合作伙伴服务商开通的业务,允许个人申请的接口。资金由微信官方T+1结算自动下发银行卡。简单测试了一下,确实是微信官方。安全性没问题,也不需要担心风控。支持的场景有好几种,考虑到多平台和初期的问题,目前只选择了二维码。

这个接口提供了最原始的API,每次申请到一张二维码后,支付成功则会向设定好的地址发送异步回调。所有申请都会记录订单。只需要自己的服务器收到回调后做好处理就行了。

然而在写后端的时候,我忽然发现个问题:每次请求二维码时,访问带的参数都会暴露回调地址。这就导致上线之后,可能会有针对回调地址的攻击,比如试图欺骗验证等。可惜我后端也只是入门的水平,服务器上又零零散散的跑着其它服务,不能一刀切的做安全措施。

更进一步的,我发现可以把支付系统独立出来,数据自有,规定好接口。这样以后即使有新的产品,也可以很方便的接入。更新和维护起来也很方便。但同样,每次对于用户支付相关的查询都会访问这个独立的数据库。暴露将是不可避免的,一旦出现问题,可能会影响到所有的产品和用户。作为一个专精客户端的开发者,以及曾经的安全爱好者,这个问题让我着实有些顾虑。能跑起来和保证安全是完全不同的两码事。

改进

在想这个问题的几天里,我又对数据库进行了测试,果然表现不是很满意。术业有专攻啊,思来想去还是把数据库换成了一个用了很久的后端服务商,俗称云数据库。这下查询时还要带着相关的Key,绝对不能泄露了。其实只要有个隔离层,把这些后端和数据库的访问隔离起来,只对外开放几个必要的接口就好了。重要的是保证其稳定和安全性。

最后想到了云函数,阿里云叫做函数计算。恰好能满足需求,把那些带着key和回调地址的访问在上面完成,只回复结果。阿里云的安全做的肯定比我要好。只需要用云函数重新制定一批接口,把所有敏感的细节、字段和地址隐藏起来,对外只暴露云函数的地址即可。

最后实现的架构如图。

架构图