个人网站支付宝收款

2023-05-29 ⏳5.6分钟(2.2千字)

个人微创业最大的问题就是收款。但如果不注册公司或者个体户,就很难接入支付宝或者微信的支付系统。也有一些第三方公司可以通过支付机构的服务商1接口为个人开通支付权限。但一方面需要向三方提供个人信息,有隐私风险;另一方面有额外的手续费。经过一番调研,我觉得目前最靠谱的还是支付宝的当面付,可以集成到个人PC/H5网站上。

支付宝当面付,顾名思义就是面对面支付,用的是手机扫码。这个产品最早面向小商贩。因为很多小商贩根本就没有营业执照,所以早期开通当面付只需要提供身份证和摊位照片就行了。

微信的相关服务就不要考虑了,风控非常严格。后半夜收款都可能被封号😂支付宝的风控相对宽松,但也不要以身试法!

我是2020年开通的,不需要营业执照,只能使用基础版。但还是得上传门店照片,我就到楼下商业街随便拍了一张,审核就通过了。

2020年03月15日您的当面付基础版收款已开通,基础版有每日最高收款额度,您可以上传同名营业执照提升额度。

基础版虽说有限额,但上限却是:单笔收款≤2000元,单日收款≤20000元,用于个人项目绰绰有余了。

但很可惜,2021年政策收紧,要求开通时必须提供营业执照。但是大家也不必灰心。因为支付宝允许提交别人的营业执照。如果你真有需求,完全可以找有营业执照亲朋好友,借他们的执照来开通。只要不做坏事,就不会有问题。如果你找不到这样的朋友,那就只能自己去注册了。但总得来说这个门槛还不高,有想法的朋友一定要抓紧行动。说不定过几天就只能上传同名营业执照。

非同名营业执照也只能合适基础版功能,限额跟前面的一样。

开通之后就到支付宝开放平台创建网页/移动应用。对,你没看错,可以创建网页或者移动应用。应用资料中的应用名称和应用图标要认真填写,用户扫码支付的时候会看到这些信息。创建后绑定当面付产品。然后就是生成并上传密钥证书,这部分网上资料很多,我就不赘述了。总之,这一步完成后就拿到了应用ID、个人私钥和个人公钥,用于对接 API。

当面付支付需要先创建订单,这得调用统一收单线下交易预创建接口2。入参跟支付宝其他类型的支付接口大同小异,最主要的就是指定支付金额、通知回调接口和订单信息。订单创建后会返回订单号以及支付二维码链接:

{
    "alipay_trade_precreate_response": {
        "code": "10000",
        "msg": "Success",
        "out_trade_no": "6823789339978248",
        "qr_code": "https://qr.alipay.com/bavh4wjlxf12tper3a",
        "share_code": "chb4n8A94Qc"
    },
    "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}

如果是 PC 网站,我们直接为qr_code中的链接生成二维码,然后展示给用户就可以了。用户扫码就能完成支付。到账后支付宝会调用前面指定的通知回调接口,通知网站支付状态。这一部分跟普通的支付宝回调完全一样,同样不作赘述。

如果是移动 H5 网站就没这么简单了。用户不可能用手机扫自己屏幕上的二维码。所以一种可行的办法就是为qr_code中的链接生成<a>标签,看点击之后能否唤醒支付宝。

在苹果 iOS 平台没有问题。用户点击链接可以支持唤起支付宝。但支付完成后不能自动跳回原 H5 页面。不过这问题不大,因为 iOS 这时会在左上角展示刚才的 H5 网站域名,点击就能跳回原网站。

在安卓上就没这么流畅。点击后浏览器会切换到一个支付宝页面,然后提示要打开支付应用。同意之后唤起支付宝。完成支付后当然可以通过手势或者返回按钮回到原 H5 网站。但这时显示的是支付宝的页面。要想回到原 H5 页面,还得再按一次返回。这用起来就很难受了。

我尝试在<a>标签中添加target="_blank"属性,但意义不大。虽然这样可以在新标签页打开支付宝页面,但因为手机一次只能展示一个标签,支付返回时依然看不到原 H5 页面。

一计不成,再生一计。我试着用 iFrame 显示支付宝链接,然后把 iFrame 设为不可以,希望这样可以唤醒支付宝。然而支付宝早就料到了我这一手,人家在返回头信息中加了如下信息:

X-Frame-Options: SAMEORIGIN

只有 alipay.com 域名下的网页可以用 iFrame 展示支付宝的页面。这条路也走不通了。只能再想别的办法。

做过移动开发的同学都知道,应用程序可以注册自定义的链接协议。浏览器打开对应的链接时会自动唤醒对应的程序。在网上搜了一下,发现支付宝的自定义协议前缀是alipays://。我们前面说的支付宝网页肯定就生成了这么一个链接才唤醒支付宝的。现在不得想办法找到这个链接。

开始我寻思可能是网页上的 JavaScript 脚本调了支付宝的接口生成的链接。但抓包后没发现有可疑的接口调用。如果不是接口返回,那就 JavaScript 本地生成的。但本地生成一定需要传递参数,所以我把排查范围锁定到了 URL 查询字符串上。

直接访问qr_code里的链接得到 302 响应,是跳转到另一个网址:

https://mobilecodec.alipay.com/client_download.htm?qrcode=bavh4wjlxf12tper3a

这里的qrcode参数显然就是前面的qr_code。继续访问,又是 302 跳转:

https://render.alipay.com/p/s/i?scheme=%61%6C%69%70%61%79%73%3A%2F%2F%70%6C%61
%74%66%6F%72%6D%61%70%69%2F%73%74%61%72%74%61%70%70%3F%73%61%49%64%3D%31%30%30
%30%30%30%30%37%26%71%72%63%6F%64%65%3D%25%36%38%25%37%34%25%37%34%25%37%30%25
%37%33%25%33%41%25%32%46%25%32%46%25%37%31%25%37%32%25%32%45%25%36%31%25%36%43
%25%36%39%25%37%30%25%36%31%25%37%39%25%32%45%25%36%33%25%36%46%25%36%44%25%32
%46%25%36%32%25%36%31%25%37%38%25%33%30%25%33%39%25%33%39%25%33%31%25%33%30%25
%36%35%25%37%32%25%37%34%25%36%39%25%37%31%25%36%44%25%36%42%25%36%35%25%36%36
%25%33%33%25%37%37%25%36%31%25%33%30%25%33%30%25%33%31%25%33%37%25%33%46%25%35
%46%25%37%33%25%33%44%25%37%37%25%36%35%25%36%32%25%32%44%25%36%46%25%37%34%25
%36%38%25%36%35%25%37%32

这里的scheme参数反解后内容如下:

alipays://platformapi/startapp?saId=10000007&qrcode=%68%74%74%70%73%3A%2F%2F
%71%72%2E%61%6C%69%70%61%79%2E%63%6F%6D%2F%62%61%78%30%39%39%31%30%65%72%74
%69%71%6D%6B%65%66%33%77%61%30%30%31%37%3F%5F%73%3D%77%65%62%2D%6F%74%68%65%72

这正是我们想找的链接。赶紧在页面上构建一个<a>标签,填入上面的自定义链接。点击后立刻唤起支付宝✌️

仔细观察上面的链接,不难发现有两个参数。后面的qrcode就是订单接口返回的链接,前面的saId不知道是干什么的。但干什么不重要,重要的是它变不变。经过测试发现,这个saId不会变,而且网上有资料说10000007对应的就是扫码支付。

所以我们可以直接构造alipays://platformapi/startapp链接,填入saIdqrcode 参数。然后构造超链接供用户点击唤醒支付宝。这样就在安卓上实现了类似 iOS 的支付体验。

如果用户没有安装支付宝,则点击上面的链接不会有任何效果。

大家可以到 https://chatgtd.net 上体验充值流程。

以上就是本文的全部内容。我通过支付宝的当面付二维码,找到了一种可以给 PC/H5 网站实现程序化收款的方案。但要求大家必须开通当面付功能,有想法的朋友赶紧行动起来吧。但最后也提醒大家,一定不要做违法乱纪的事情!还有就是支付宝可能会发短信提醒已经达到限额。实测不会影响收款,忽略就行。


  1. 这类服务商为没有研发能力的小商户提供技术服务,也在客观上为支付平台做推广,所以平台也很欢迎。客户资金不会经过服务商,服务商只负责接口调用或者转发。↩︎

  2. https://opendocs.alipay.com/apis/api_1/alipay.trade.precreate↩︎