天天看點

微信支付寶個人收款解決方案之免簽約支付解決方案之APP監控通知方案背景方案總結

關鍵詞:免簽約支付,免簽約收款,支付寶收款,微信收款,個人免簽約收款

背景

​ 有做網賺或者在網上售賣個人小産品小服務的,需要進行收款,如果零星個别的收款可能直接走個人轉賬然後手動發貨即可,但是一旦流程标準下來,量走起來之後,付款發貨就需要自動化了,以提高人效。例如在網站上挂一個購買連結,使用者點選後自動展示收款碼,使用者掃碼付款後網站自動完成發貨,是不是感覺很好?或者在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來發送對應的結果)。雖然販賣盜版資源、軟體注冊碼的行為不可取,但是他把這個流程設計得很巧妙,自己不需要全程參與就能收到錢,也沒有售後成本,自己所要做的就是繼續複制這種模式,真正實作躺賺。