Foreword
个人小项目,收款可能经常会遇到问题,如果要专业一点可能需要自己注册公司,然后申请支付宝或者微信的支付服务,还会遇到税、费率等问题。虽然他们的稳定性非常高,但是对于只是很小的项目来所没必要。
还有一种解决办法,就是找第三方支付手段,但是这里面黑产、灰产,非常多。搞不好你遇到了一个就跑路了,而且有的是不能立即提现到账的,是要过一遍第三方账户的,这种就非常不合适了。还有一些则是费率远比支付宝、微信要高,那就不合适了。
很久远以前微信和支付宝都是有个人接口的,但是被玩坏了,加上国家监管,所以个人支付早早就下了。还有一种办法,则是通过监听web或者Android端的到账提醒来完成收款的,要么是安装一个安卓App来监听系统通知栏,要么是通过PC的Web请求来监听支付到账的信息。相比而言,App更简单一些,而且也不涉及登录和账号密码等问题,较为合适。
对于支付识别的问题,有通过时间戳识别的(不稳定、并发基本等于1),也有通过支付留言识别的(用户留言靠不住),也有通过支付金额识别(vmq方案)的。
有人可能觉得paypal可以做支付,其实paypal主要是手续费特别贵,任何支付,最低都需要0.3刀,还需要加上一个百分比的抽成。而国内微信支付宝这种二维码收款还没有手续费的,基本上是不可能的
Vmq
https://github.com/szvone/Vmq
V免签 —— 个人开发者收款解决方案
他是通过支付金额识别的,同时开源了代码,有php的,也有java的,需要配合安卓端使用
https://github.com/szvone/VmqApk
server这端基本没啥问题,主要是安卓端变动比较频繁,作者最初的安卓版本已经有点不好用了,我修改了一下
https://github.com/elmagnificogi/Vmq/releases
简单说一下原理,提前在Vmq服务端设置好n个二维码,n个二维码都是不通金额的,比如你想收5元,实际需要设置(5.0,5.01,5.02,5.03….)看你的并发量有多大了,这个还与订单超时时间有关系,超时以内全算做并发。一般设5个就够了。
客户端请求支付时创建订单,并返回一个收款二维码,这个二维码金额和此时其他人创建的订单不同,客户支付以后,安卓端检测到收款通知信息,将金额告知服务端,服务端根据金额找到对应订单并触发回调(将用户支付完成信息回发…)
当然,如果被人恶意请求n个订单,是可以直接把整个卡死的,其他人请求不到支付二维码了,这个需要实际业务上做限制
优点
- 直接到账 ,没有中间商,和你自己给别人扫码是一样的
- 前后端全都开源,有问题可以自己修改
缺点
- 需要安卓端长期挂着监听
- 微信和支付宝某些非订单也会被识别为订单,特别是支付宝容易出错、但是不会引起问题(无法触发回调)
- 并发和你预设的支付图片数量有关系
未知风险,由于我目前收款不是特别多,每月几千左右,如果额度特别高是否会被税或者风控等等,这是不知道的。
环境
- Arm64的CentOS的机器
- x64的机器也正常可以使用
安装
安装java1.8的环境
sudo apt install openjdk-18-jre-headless
测试java
java -version
openjdk version "18.0.2-ea" 2022-07-19
OpenJDK Runtime Environment (build 18.0.2-ea+9-Ubuntu-222.04)
OpenJDK 64-Bit Server VM (build 18.0.2-ea+9-Ubuntu-222.04, mixed mode, sharing)
启动
java -jar vmq.war
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.1.RELEASE)
2022-05-29 13:05:51.548 INFO 3772 --- [ main] com.vone.mq.MqApplication : Starting MqApplication v0.0.1-SNAPSHOT on instance-20210526-1620 with PID 3772 (/home/opc/vmq.war started by root in /home/opc)
2022-05-29 13:05:51.550 INFO 3772 --- [ main] com.vone.mq.MqApplication : No active profile set, falling back to default profiles: default
2022-05-29 13:05:52.261 INFO 3772 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
默认8080端口启动,随意切换一下
java -jar vmq.war --server.port=9514
启动以后就能看到这个界面了,然后登录就能进入后台了
默认账号密码都是admin
设置
Web
- 订单有效期单位是分钟
- 回调相当于是用户支付完成以后,自动访问你设置的url,发送一个请求,同步回调是返回页面用的
- 下面的二维码则是你的收款码
- 左侧的额外添加收款码,则是固定金额的收款码
并发识别
由于他是靠订单金额区分是哪个用户支付的,所以要处理并发的时候,就看你有多少个不同金额的支付码了
如果有3个并发,那么就需要你添加3个不同金额的二维码,这样创建订单的时候会自动返回对应的二维码
同时还需要在客户端判断是否订单到期了,然后对应处理。
就是添加二维码有点麻烦了,小批量支付还是没问题的
安卓
安卓端的使用也非常简单,下载App以后,扫码添加配置即可。
可以通过检测心跳和监听来,看是否已经连接到了服务器
微信和支付宝
由于要监听微信和支付宝的通知,所以手机里关于二者的收款通知是一定要打开的,最好再重启一下对应的APP,否则通知可能不能正常显示。
只要微信和支付宝有类似的通知,那么监听就ok了。
为了保证监听的APP、微信、支付宝存活,可能还需要让他常驻后台,防止被各种WiFi优化、省电优化、内存优化给优化没了。
手机设置步骤(教程为MIUI系统,非MIUI系统请参考教程进行设置)
关闭系统神隐模式
(旧版MIUI系统)在系统【设置】 - 【其他高级设置】 - 【电量与性能】 - 【神隐模式】 - 【V免签监控端】设置为关闭
(新版MIUI系统)在系统【设置】 - 【其他高级设置】 - 【电量与性能】 - 【省电优化】 - 【应用智能省电】,将V免签监控端、微信、支付宝的3个APP全都改为无限制
添加内存清理白名单
关闭WIFI优化
(旧版MIUI系统)在系统【设置】 - 【WLAN】 -【高级设置】 -【WLAN优化】,关闭它。
(新版MIUI系统)在系统【设置】 - 【WLAN】 -【高级设置】 - 【在休眠状态下保持WLAN网络连接】改为“始终”
开启推送通知
系统【设置】 - 【通知和状态栏】 - 【通知管理】中,找到这3个App,把里面的开关全部打开
在微信的【设置】 - 【勿扰模式】中,关闭勿扰模式
在微信的公众号,关注 【微信收款助手】 这个公众号
在支付宝的主页,上方搜索框 搜索 【支付助手】 ,进入支付助手,右上角小齿轮,打开【接收付款消息提醒】
如果有一个闲置手机,专门去干这个,当然最好了,不会被日常使用干扰到。
订单
订单中可以看到每一笔扫码支付的订单
API
API部分也比较简单,创建、查询、关闭、回调等,写的都算比较详细。有问题也可以看源码解决。
唯一可能不是很清楚的就是这个回调。回调是会发送一个Get请求,这个请求需要你的服务器响应,并且响应成功需要发送success
,不是200,不是php的可能看不明白下面的PHP回调示例。
当然就算不发送也没关系,只是订单里会显示通知失败而已,实际业务已经正常走完了。
迁移
vmq迁移的时候也比较简单,先关闭vmq服务,切记是ctrl+c去关闭,而不是直接kill,kill会导致内存数据丢失,前面的所有订单会直接没了
默认数据库文件在下面的目录中,只需要复制到新服务器即可
window位于:C:\Users\用户名\mq.mv.db
linux应该位于:~/mq.mv.db
问题
安卓系统还是存在莫名其妙杀进程的问题,或者是这个程序有些时候起不来,导致错过订单。
用下来,长时间没有订单的情况下,比如睡了一觉起来,还是得手动开启一下,不然好像还是会错过后续的某些订单。
还有一个误识别的问题,经常会莫名其妙出现一个无订单收款,额度不高2元或者3元,但是实际上并没有这个对应的收款。这种应该是关键字误识别了,导致的。
经常需要重启之类的操作,并不能长时间有效,如果要高稳定性,还是得考虑其他方式,至少安卓APP不靠谱,可以试一试PC客户端的Hook类型,可能更稳一些
使用我修改后的App,总算是稳定多了,前面严重的每单都漏,重启都没用
https://github.com/elmagnificogi/Vmq/releases
版本问题
微信和支付宝貌似有改过消息通知的信息的关键字,所以如果使用超级老版本的微信和支付宝有可能不正常,所以最好使用最近的版本(2022.6这个时间左右的)
PC端同步登录,移动端通知已关闭
微信有一个特殊情况,如果你PC登录了微信,移动端微信会显示手机通知已关闭
如果出现了手机通知关闭
,那么就算支付了,手机里也能看到支付的信息,但是实际上通知栏是没有这条消息的,也就无法触发监控。
如果出现了手机通知关闭
,可以点击打开如下界面,关闭手机静音的选项,从而可以正常收到支付通知
正常显示应该是这样的
解了这个问题以后,再也没有奇怪的漏单的情况了
重启手机
还不行,重启APP也无法自动监控,可能是卡了什么bug,就必须重启手机,然后监控就正常了
Windows 监控
PC客户端的Hook类型,监控微信或者支付宝的到账信息,我还没用,但是应该比安卓稳一些
https://github.com/modcrafts/PayListener
https://github.com/MODcrafts/WeChatHook
Summary
个人支付基本就ok了,我的小业务就能跑通了
Quote
https://github.com/szvone/Vmqphp
https://github.com/zwc456baby/vmqApk