基于xposed逆向微信、支付宝、云闪付来实现个人免签支付功能
我的个人网站如何实现支付功能?
想必很多程序员都有过想开发一个自己的网站来获得一些额外的收入,但做这件事会遇到支付这个问题。目前个人网站通过常规手法是无法实现支付管理的,所有支付渠道都需要以公司的身份去申请。而且像支付宝、微信这些通道都是需要付费申请,且会收取部分手续费的。
今天我就给大家分享一下我的实现方案:《基于xposed逆向微信、支付宝、云闪付来实现个人免签支付框架》
可以先看下我做好的 支付测试页面(点我) ,目前已实现的个人免签支付功能有:
1、微信扫码支付,5秒内自动回调支付成功信息
2、支付宝二维码、支付宝红包、支付宝主动收款、支付宝银行卡转账,秒级回调
3、云闪付二维码,可使用云闪付App,招行建行等各大行App扫码支付,大概10秒左右自动回调
接下来给大家简单分享一下实现过程,这个过程其实是非常复杂的,关键点在于如何逆向微信支付宝云闪付这些App,找到核心函数钩子,然后写一个hook程序来模拟调用这些方法,来实现根据服务端传过来的金额,订单号自动调用微信支付宝生成支付二维码的函数得到相对应的支付二维码再传给服务端,然后监听微信支付宝的支付成功消息最终回调给服务端实现支付成功通知。这里面用到的核心技术点有:xposed逆向框架、apk反编译,网络抓包,apk动态调试等技术。
像微信支付宝这些apk反编译后的代码基本上都是天书一样的,严重混淆过的代码。想从中找到核心代码并非易事,下面我贴一些核心代码吧。
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); } }); }
hook云闪付二维码生成函数
public static void GenQrCode(final String paramString1, final String paramString2, final String bankName, final String bankNo) { new Thread(new Runnable() { public void run() { try { Object obj1 = paramString2; Object obj2 = new BigDecimal(paramString1); obj2 = ((BigDecimal) obj2).setScale(2, RoundingMode.HALF_UP).toPlainString().replace(".", ""); // LogUtils.getInstance().saveLog("GenQrCode begin :" + obj1 + obj2); Object obj3 = new StringBuilder(); ((StringBuilder) obj3).append("https://pay.95516.com/pay-web/restlet/qr/p2pPay/applyQrCode?txnAmt="); ((StringBuilder) obj3).append(MainHook.Enc((String) obj2)); ((StringBuilder) obj3).append("&cityCode="); ((StringBuilder) obj3).append(MainHook.Enc(MainHook.getcityCd())); ((StringBuilder) obj3).append("&comments="); ((StringBuilder) obj3).append(MainHook.Enc((String) obj1)); ((StringBuilder) obj3).append("&virtualCardNo="); // ((StringBuilder) obj3).append(MainHook.encvirtualCardNo); CardInfo cardInfo = getEncvirtualCardNo(bankName, bankNo); if (cardInfo == null) { throw new Exception("找不到对应的下单卡"); } cardInfo.setAccount(ysfAccount); ((StringBuilder) obj3).append(Enc(cardInfo.getVirtualCardNo())); obj1 = ((StringBuilder) obj3).toString(); obj2 = HttpHelper.getInstance().getOkHttpClient(); obj3 = new okhttp3.Request.Builder(); Request.Builder localBuilder = ((Request.Builder) obj3).url((String) obj1).header("X-Tingyun-Id", MainHook.getXTid()); // LogUtils.getInstance().saveLog("GenQrCode url:" + obj1); obj3 = new StringBuilder(); ((StringBuilder) obj3).append("0;"); ((StringBuilder) obj3).append(System.currentTimeMillis()); obj3 = ((OkHttpClient) obj2).newCall(localBuilder.header("X-Tingyun-Lib-Type-N-ST", ((StringBuilder) obj3).toString()) .header("sid", MainHook.getSid()).header("urid", MainHook.geturid()).header("cityCd", MainHook.getcityCd()) .header("locale", "zh-CN").header("User-Agent", "Android CHSP").header("dfpSessionId", MainHook.getDfpSessionId()) .header("gray", MainHook.getgray()).header("key_session_id", "").header("Host", "pay.95516.com").build()).execute().body().string(); obj1 = MainHook.Dec((String) obj3); obj2 = new StringBuilder(); ((StringBuilder) obj2).append("GenQrCode RSP=>"); ((StringBuilder) obj2).append((String) obj1); MainHook.mlog(obj2.toString()); try { obj2 = new JSONObject((String) obj1); String certificate = ((JSONObject) obj2).getJSONObject("params").getString("certificate"); QRInfo qrInfo = new QRInfo(certificate, paramString2); qrInfo.setRemark(JSON.toJSONString(cardInfo)); String body = JSON.toJSONString(qrInfo); Intent localIntent = new Intent("websocket.sendmsg"); localIntent.putExtra("data", "qr:" + body); MainHook.getContext().sendBroadcast(localIntent); } catch (Exception ex) { LogUtils.getInstance().saveLog("二维码广播发送异常:" + ex.getMessage()); } return; } catch (Exception ex) { LogUtils.getInstance().saveLog("GenQrCode异常:" + ex.getMessage()); } } }).start(); }
有问题的朋友可以给我留言或者加我Q好友
基于xposed逆向微信、支付宝、云闪付来实现个人免签支付功能的更多相关文章
- 云闪付个人免签支付用xposed解决强制升级
云闪付的xposed程序之前用的是6.18的版本,前段时间突然不能用了,提示要升级到最新的7.0版本.之前这个云闪付的个人免签支付程序一直跑的挺好,云闪付也是所有免签支付里面最能跑量的,不甘就这么放弃 ...
- Java 银联云闪付对接记录
一开始盲目找资料走了弯路: 还是从银联给的官方文档入手最高效: 附件3:云闪付业务商户入网服务指引.pdf http://tomas.test.upcdn.net/pay/%E9%99%84%E4%B ...
- 基于AlipayJSBridge封装的H5网页支付宝打赏、网站打赏、个人免签支付,支付宝转账打赏支付组件
之前公司要做个打赏用户的功能,网站查询一些资料之后把一些api封装之后提供了一个demo组件供大家下载:扫描下图二维码 功能: 支付宝H5 Js方案,调起应用内页面,自动设定转账金额和收款理由,用户付 ...
- 基于IOS下的支付宝SDK的学习与使用——实现产品支付(二)
首先本篇为作者原创,仅供学习使用,以后会不断完善,精炼.阅读之前请参考 上一篇 上一篇 中详细说明了结合官方支付宝SDK,对工程环境进行的一些配置,实现了支付,本篇重点说明一下,注意事项和原理,主要 ...
- 基于xposed Hook框架实现个人免签支付方案
我的个人网站如何实现支付功能? 想必很多程序员都有过想开发一个自己的网站来获得一些额外的收入,但做这件事会遇到支付这个问题.目前个人网站是无法实现支付功能的. 今天我就给大家分享一下我的实现方案:&l ...
- 微信支付宝xposed个人收款免签支付源码
源码介绍: 个人免签支付是指使用自己的微信支付宝账号作为个人网站的收款账号,网站订单支付成功后,网站能实时收到成功回调信息. 系统基于xposed逆向微信.支付宝.云闪付来实现个人收款免 ...
- ****基于H5的微信支付开发详解[转]
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
- RFID Hacking③:使用ProxMark3嗅探银行闪付卡信息
0×00 前言 RFID是Radio Frequency Identification的缩写,术语为射频识别,俗称电子标签.按照工作频率的不同,RFID标签可以分为低频(LF).高频(HF).超高频( ...
- 基于H5的微信支付开发详解
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
随机推荐
- Eclipse的Debug各种视图介绍(二)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- Java匹马行天下之教你用学汉语式方法学编程语言
Java匹马行天下之教你用学汉语式方法学编程语言 前言: 前段时间接连更新了带小白从入门到了解的几篇博客: <Java匹马行天下之编程常识知多少> <Java匹马行天下之走进编程的殿 ...
- Vue入门教程 第二篇 (数据绑定与响应式)
数据绑定 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: <div id="app"> {{ message }} </ ...
- python编程基础之十七
字符串:str1 = '123' str2 ="123" str3 = """123""" str4 = '''123' ...
- python urllib2实现http GET PUT DELETE POST的方法
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/3/11 下午8:33 # @Author : liubing # @File ...
- JS里面的铠甲合体!
本标题党又回来了,最近在专心研究一些JS基础性的书籍,以期把原理都了解透彻,所以写文章的频率就降了下来.但是今天我必须要来写一下子,为什么呢,因为今天周五!先说明一下JS里面的拆箱与装箱指的是JS封箱 ...
- 网络编程之winInet
InternetGetConnectedState() 简介: 功能:检索本地系统的网络连接状态. 函数原型:BOOLAPI InternetGetConnectedState( ...
- 后门免杀工具-Backdoor-factory
水一水最近玩的工具 弄dll注入的时候用到的 介绍这款老工具 免杀效果一般..但是简单实用 目录: 0x01 backdoor-factory简介 0x02 特点功能 0x03 具体参数使用 PS: ...
- [HDU5001]Walk
Problem Description I used to think I could be anything, but now I know that I couldn't do anything. ...
- opencv::opencv_createsamples.exe
opencv_createsamples.exe 用来生成正样本vec的,用来准备训练用的正样本数据和测试数据.他的输出为以 *.vec 为扩展名的文件,该文件以二进制方式存储图像. Usage: o ...