搭建个人收款解决方案

Vmq,V免签

Views:  times Updated on May 5, 2023 Posted by elmagnifico on May 29, 2022

Foreword

个人小项目,收款可能经常会遇到问题,如果要专业一点可能需要自己注册公司,然后申请支付宝或者微信的支付服务,还会遇到税、费率等问题。虽然他们的稳定性非常高,但是对于只是很小的项目来所没必要。

还有一种解决办法,就是找第三方支付手段,但是这里面黑产、灰产,非常多。搞不好你遇到了一个就跑路了,而且有的是不能立即提现到账的,是要过一遍第三方账户的,这种就非常不合适了。还有一些则是费率远比支付宝、微信要高,那就不合适了。

很久远以前微信和支付宝都是有个人接口的,但是被玩坏了,加上国家监管,所以个人支付早早就下了。还有一种办法,则是通过监听web或者Android端的到账提醒来完成收款的,要么是安装一个安卓App来监听系统通知栏,要么是通过PC的Web请求来监听支付到账的信息。相比而言,App更简单一些,而且也不涉及登录和账号密码等问题,较为合适。

对于支付识别的问题,有通过时间戳识别的(不稳定、并发基本等于1),也有通过支付留言识别的(用户留言靠不住),也有通过支付金额识别(vmq方案)的。

image-20230419121605757

有人可能觉得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的环境

wget https://download.oracle.com/java/18/latest/jdk-18_linux-aarch64_bin.tar.gz
tar -xzvf jdk-18_linux-aarch64_bin.tar.gz 
mv jdk-18.0.1.1 jdk1.8

修改环境变量

vim /etc/profile

JAVA_HOME=/usr/local/java/jdk1.8
JRE_HOME=/usr/local/java/jdk1.8/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

刷新

source /etc/profile

测试java

java -version
java version "18.0.1.1" 2022-04-22
Java(TM) SE Runtime Environment (build 18.0.1.1+2-6)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.1.1+2-6, 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