关键词:免签约支付,免签约收款,支付宝收款,微信收款,个人免签约收款
背景
有做网赚或者在网上售卖个人小产品小服务的,需要进行收款,如果零星个别的收款可能直接走个人转账然后手动发货即可,但是一旦流程标准下来,量走起来之后,付款发货就需要自动化了,以提高人效。例如在网站上挂一个购买链接,用户点击后自动展示收款码,用户扫码付款后网站自动完成发货,是不是感觉很好?或者在APP里提供了付费功能,用户需要购买的时候,能够直接弹出支付宝(或微信)付款,完成付款后自动提供付费功能,是不是感觉很好?
本方案场景是针对「个人开发者」或其他「个人商家」的,后面简称个人收款方案。对于已经拥有公司的,直接签约支付宝或微信的支付功能即可。
个人收款总结下来有两类:签约和免签约。
- 签约方案就是直接和支付宝或者微信签约,严格按照支付宝或微信的要求一步步来,完成签约后使用它们的官方接口即可。该方案比较稳定,但是如果售卖的商品属于灰色的话,很容易被「风控」禁用,毕竟使用的是人家的服务,很容易被管控。早期的时候可以直接个人签约,但是后来就不行了,个人必须用营业执照才行。这个方案前面一篇文章中介绍过了。
- 免签约方案就是避开使用支付宝或微信的签约流程,自己搭建一套支付收款体系。
网上有很多集成了收款方案做的聚合收款方案,大家可以了解,但是这些大多是属于不正规的个人或小团队搭建的,因为涉及到资金汇款,这个风险很高,不建议实际使用。截止到目前为止,以前做调研收集到的一些网站已经打不开了,收集了一些权当做了解、借鉴、参考,后面专门整理一篇文章介绍下。
今天主要介绍免签约方案,支付方式以支付宝为例介绍,微信方案同理。该方案不需要营业执照,也没有手续费零费率,完全可控,引用网友的一句话:「营业执照是不可能,这辈子都不可能有的」。
方案
使用一台闲置的安卓手机专门用来做收款,收到付款时手机会有通知提示,对该通知进行监控,监控到后发送数据到服务器,服务器根据订单情况支付情况判断是否成功完成一轮下单支付操作,如果成功则自动发货。
详细的流程:
- 网页前端展示商品,用户浏览,满意后准备下单,前端调用服务端接口创建订单信息并同时展示收款码。
- 服务端在创建订单信息时,可以设置个有效时间,例如3分钟之内有效。
- 用户扫码付款,付款成功后,专门用来做收款的手机会到账通知,监听APP监控到后把数据POST给服务端。
- 服务端根据收款金额、标题、时间等信息,结合订单信息,查询时间最接近的一项,进行判断。
- 如果是订单完成支付,则自动发货。
收款码又分静态模式和动态模式,流程分别如下。
静态收款码是提前创建一批收款码二维码图片,预先存储在服务端,根据需要进行选取。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uVbgdGgu-1626589077770)(…/…/images/payMethod/personalStaticQRcode.png)]
动态收款码的整体流程差不多,只不过二维码不用提前上传,自用动态创建。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r688xQnQ-1626589077773)(…/…/images/payMethod/personalDynamicQRcode.png)]
方案需要在客户端和服务端同时搭建。
客户端
客户端主要准备一台专门用来收款的安卓手机,用来监控收款通知的APP(后简称APP)。通常该APP有两种实现方式,一种是利用xposed插件进行监控,一种是利用无障碍服务进行监控,推荐使用后者,安全性及稳定性要高一些。
xposed插件监控
缺点是不安全,可能会有资金风险。
可以参考:Xposed—支付宝收款、转账监控<已附上成品>
package com.yymjr.android.xposedpay;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class MainHook implements IXposedHookLoadPackage {
private final static String TAG = "XposedPay-MainHook";
private Bundle PushNoticeDisplayBundle = null;
private Class<?> PushNoticeDisplayClazz;
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.eg.android.AlipayGphone")) return;
Log.d(TAG, "Hook alipay begin......");
XposedHelpers.findAndHookMethod("com.alipay.mobile.quinox.LauncherApplication",lpparam.classLoader, "attachBaseContext", Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d(TAG, "Hook attachBaseContext successful......" );
ClassLoader classLoader = ((Context) param.args[0]).getClassLoader();
try {
PushNoticeDisplayClazz = classLoader.loadClass("com.alipay.mobile.rome.pushservice.integration.d");
XposedHelpers.findAndHookConstructor(PushNoticeDisplayClazz, Context.class, Bundle.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d(TAG, "Hook PushNoticeDispaly.d successful......");
PushNoticeDisplayBundle = (Bundle) param.args[1];
if (PushNoticeDisplayBundle == null) return;
LogPushNoticeDisplay("push_show_title");
LogPushNoticeDisplay("push_show_text");
JSONObject jsonObject_data = new JSONObject(PushNoticeDisplayBundle.getString("push_msg_data"));
JSONObject paramsJsonObject = jsonObject_data.getJSONObject("params");
Log.d(TAG, "订单:"+paramsJsonObject.getString("tradeNO"));
JSONObject jsonObject_ext = new JSONObject(PushNoticeDisplayBundle.getString("push_show_ext"));
Log.d(TAG, "支付金额:"+jsonObject_ext.getString("soundValue"));
}
});
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
});
}
private void LogPushNoticeDisplay(String PushExtConstants){
Log.d(TAG, PushNoticeDisplayBundle.getString(PushExtConstants));
}
private void findAndHookMethod(Class clazz, String methodName, Object... parameterTypesAndCallback){
XposedHelpers.findAndHookMethod(clazz, methodName, parameterTypesAndCallback);
}
}
这个方案及代码我没有试过,即使失效也可以顺着这些关键词关键代码在网上继续搜索,一定能找到可用的插件模块的。
无障碍服务监控(推荐)
相比较xposed插件方案,安全性稳定性适配性更好一些,推荐这种做法。
可以参考:receiptnotice: Push notification bar use your android phone to the specified URL,因为是开源的,安全可靠一些,即使后期失效可以在这个基础上改进,或基于此继续搜索其他成熟的代码。
该方案也比较容易扩展到其他收款应用:
收款应用 | 包名 |
---|---|
支付宝 | com.eg.android.AlipayGphone |
工银商户之家 | com.icbc.biz.elife |
银联云闪付 | com.unionpay |
另外一个:微信支付 支付宝免签约支付实现方法 个人微信支付 个人支付宝接口,[监控APP](https://www.coolapk.com/apk/com.cozylife.smshelper,该方案的演示:
- 微信监听支付
- 支付宝监听支付
- 工行e支付监听支付
服务端
可以借鉴参考客户端方案receiptnotice: Push notification bar use your android phone to the specified URL对应的服务端:WeihuaGu/getreceipt-server at php
其他方案
yioMe/nodejs_wx_aipay_api: 微信支付宝个人免签收款Api系统,有了它对接再也不用担心我的业务不能支付了
这个方案目前还有效,客户端是需要付费购买的。没有客户端无回调通知,其他功能不影响,可以测试后台功能,客户端需要购买后使用。客户端购买地址: http://pay.yio.me/#/goods/74ct1zBzZBW8YGFBKe-Yf
如果监控软件未购买或未运行,用户依然会付款给你,钱依然会直接到你支付宝微信余额中,但是就不会有回调了。用户会来找你并提供付款截图,确认后可以在你的后台里进行补单处理。
支付演示页面:http://pay.yio.me/#/goods/DwnNGCW4VLk1CjemIiUqf,购买的时候需要输入邮箱,支付成功自动给邮箱发送确认。
总结
该方案不需要营业执照,也没有手续费零费率,完全可控。使用起来也比较便捷,见过一个卖盗版资源、注册码的,就把一个html的说明页面(内含该资源的ID)和资源一起打包四处传播,资源是加密的,用户下载后打不开,打开说明网页提示需要付款,点击付款后就跳转到个人收款,付款成功会自动展示解密的密码或注册码(通过提交的资源ID来发送对应的结果)。虽然贩卖盗版资源、软件注册码的行为不可取,但是他把这个流程设计得很巧妙,自己不需要全程参与就能收到钱,也没有售后成本,自己所要做的就是继续复制这种模式,真正实现躺赚。