源碼介紹:
個人免簽支付是指使用自己的微信支付寶賬號作為個人網站的收款賬號,網站訂單支付成功后,網站能實時收到成功回調信息。
系統基於xposed逆向微信、支付寶、雲閃付來實現個人收款免簽支付。(tag:個人收款,免簽支付,微信免簽,支付寶免簽,雲閃付免簽)
源碼地址:https://github.com/wxs2/xposed-pay
目前支持如下免簽支付:
- 微信二維碼 、支付寶二維碼、支付寶紅包、支付寶主動收款、支付寶銀行卡、雲閃付
系統介紹:
- 使用個人支付寶或微信賬號收款,無須公司資質接入支付寶微信平台
- 基於xposed逆向支付寶微信App實現自動生成指定金額二維碼,支付成功后自動回調
- 系統包含PHP后台和Android監聽客戶端
- 支持多賬號,多客戶端運行
- 自動H5喚醒:支付寶紅包、支付寶主動收款均支持自動喚醒原生支付寶支付,無須手動掃碼。該功能請使用手機瀏覽器測試,生碼后點擊 <打開支付寶>即可
運行效果:
核心代碼:
hook微信二維碼生成函數
private void hookQRCreat(final ClassLoader appClassLoader, final Context context) { Class<?> clazz = XposedHelpers.findClass("com.tencent.mm.plugin.collect.b.s", appClassLoader); XposedBridge.hookAllMethods(clazz, "a", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { } @Override protected void afterHookedMethod(MethodHookParam param) { try { LogUtils.log("hookQRCreat start:"); QrBean qrBean = new QrBean(); qrBean.setChannel(QrBean.WECHAT); Field moneyField = XposedHelpers.findField(param.thisObject.getClass(), "kcp"); Double money = (Double) moneyField.get(param.thisObject); LogUtils.log("hookQRCreat money:"+money.toString()); Field markField = XposedHelpers.findField(param.thisObject.getClass(), "desc"); String mark = (String) markField.get(param.thisObject); LogUtils.log("hookQRCreat mark:"+mark); Field payurlField = XposedHelpers.findField(param.thisObject.getClass(), "kco"); String payurl = (String) payurlField.get(param.thisObject); LogUtils.log("hookQRCreat payurl:"+payurl); qrBean.setMark_sell(mark); qrBean.setUrl(payurl); LogUtils.log( "com.tencent.mm.plugin.collect.b.s qrBean:"+ JSON.toJSONString(qrBean)); Intent broadCastIntent = new Intent(); broadCastIntent.putExtra("data", qrBean.toString()); broadCastIntent.setAction(HookMain.RECEIVE_QR_WECHAT); // broadCastIntent.setComponent( new ComponentName( "com.sjk.tpay" , // "com.sjk.tpay.ReceiverMain") ); context.sendBroadcast(broadCastIntent); LogUtils.log("hookQRCreat end:"+JSON.toJSONString(param)); }catch (Exception e){ LogUtils.log("hookQRCreat exception:"+Log.getStackTraceString(e)); } } }); }
hook支付寶二維碼生成函數
private void hookQRCreat(final ClassLoader appClassLoader, final Context context) { XposedHelpers.findAndHookMethod("com.alipay.mobile.payee.ui.PayeeQRSetMoneyActivity", appClassLoader, "a", XposedHelpers.findClass("com.alipay.transferprod.rpc.result.ConsultSetAmountRes", appClassLoader), new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Field moneyField = XposedHelpers.findField(param.thisObject.getClass(), "g"); String money = (String) moneyField.get(param.thisObject); Field markField = XposedHelpers.findField(param.thisObject.getClass(), "c"); Object markObject = markField.get(param.thisObject); String mark = (String) XposedHelpers.callMethod(markObject, "getUbbStr"); Object consultSetAmountRes = param.args[0]; Field consultField = XposedHelpers.findField(consultSetAmountRes.getClass(), "qrCodeUrl"); String payurl = (String) consultField.get(consultSetAmountRes); Field consultField2 = XposedHelpers.findField(consultSetAmountRes .getClass(), "printQrCodeUrl"); String payurloffline = (String) consultField2.get(consultSetAmountRes); QrBean qrBean = new QrBean(); qrBean.setChannel(QrBean.ALIPAY); qrBean.setMark_sell(mark); qrBean.setUrl(payurl); Intent broadCastIntent = new Intent() .putExtra("data", qrBean.toString()) .setAction(RECEIVE_QR_ALIPAY); context.sendBroadcast(broadCastIntent); } }); }