我的个人网站如何实现支付功能?

  想必很多程序员都有过想开发一个自己的网站来获得一些额外的收入,但做这件事会遇到支付这个问题。目前个人网站是无法实现支付功能的。

  今天我就给大家分享一下我的实现方案:《基于xposed逆向微信、支付宝、云闪付来实现个人免签支付方案》

  测试页面(点我)  http://pay.changu.net

  接下来给大家简单分享一下实现过程,这个过程其实是非常复杂的,关键点在于如何逆向微信支付宝云闪付这些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 Hook框架实现个人免签支付方案的更多相关文章

  1. 查找和定位Android应用的按钮点击事件的代码位置基于Xposed Hook实现

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80956455 在进行Android程序的逆向分析的时候,经常需要通过Androi ...

  2. ART模式下基于Xposed Hook开发脱壳工具

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78092365 Dalvik模式下的Android加固技术已经很成熟了,Dalvik ...

  3. 基于Xposed Hook实现的Android App的协议算法分析小工具-CryptoFucker

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80962121 在进行Android应用的网络协议分析的时候,不可避免涉及到网络传 ...

  4. 基于Xposed hook 实时监测微信消息

    本文以微信版本6.7.3为例进行分析有hook, 大部分做微信机器人的话,首先要实时抓取微信的消息,在这里展示三种方式对微信的消息进行hook: 1.基于UI层拉取加载进行监听 2.基于微信dao层调 ...

  5. xposed实现个人收款免签支付

    想必很多程序员都有这样的烦恼,想做个人网站,但如何实现收款功能? 今天我就给大家分享一下我的实现方案:基于xposed逆向框架实现微信免签支付.支付宝免签支付 接下来给大家简单分享一下实现过程,这个过 ...

  6. 基于dalvik模式下的Xposed Hook开发的某加固脱壳工具

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77966109 这段时间好好的学习了一下Android加固相关的知识和流程也大致把A ...

  7. 阿里系产品Xposed Hook检测机制原理分析

    阿里系产品Xposed Hook检测机制原理分析 导语: 在逆向分析android App过程中,我们时常用的用的Java层hook框架就是Xposed Hook框架了.一些应用程序厂商为了保护自家a ...

  8. 基于xposed逆向微信、支付宝、云闪付来实现个人免签支付功能

    我的个人网站如何实现支付功能? 想必很多程序员都有过想开发一个自己的网站来获得一些额外的收入,但做这件事会遇到支付这个问题.目前个人网站通过常规手法是无法实现支付管理的,所有支付渠道都需要以公司的身份 ...

  9. 微信支付宝xposed个人收款免签支付源码

    源码介绍: 个人免签支付是指使用自己的微信支付宝账号作为个人网站的收款账号,网站订单支付成功后,网站能实时收到成功回调信息.        系统基于xposed逆向微信.支付宝.云闪付来实现个人收款免 ...

随机推荐

  1. 大神都在用的yum源

    本文原创首发于公众号:编程三分钟 yum 命令的使用 yum命令天天都在用,都快用烂了,但是很多人不知道为什么只要联网,yum命令就能像老奶奶手中的魔法棒一样,随心所欲的下载到想到的包. 比如你想装个 ...

  2. django-rest-framework解析请求参数

    django-rest-framework解析请求参数 前言 前面的文章中编写了接口, 调通了接口文档. 接口文档可以直接填写参数进行请求, 接下来的问题是如何接受参数, 由于请求方式与参数序列化形式 ...

  3. 基于.Net core3.0 开发的斗图小程序后端+斗图小程序

    为啥要写这么一个小程序? 作为互联网的原住民. 90后程序员的我,从高中开始发QQ小表情. 到之后的熊猫头,蘑菇头. 可以说表情包陪伴我从学校到社会,从青少年到中年.. 而且因为斗图厉害,还找到一个女 ...

  4. Flex 布局——语法属性详解

    前言 Flexbox 是 flexible box 的简称(注:意思是“灵活的盒子容器”),是 CSS3 引入的新的布局模式.它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现 ...

  5. 【NOIP2015】子串

    题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问 ...

  6. 各种常见文件的hex文件头

    我们在做ctf时,经常需要辨认各种文件头,跟大家分享一下一些常见的文件头.   扩展名 文件头标识(HEX) 文件描述 123 00 00 1A 00 05 10 04 Lotus 1-2-3 spr ...

  7. 第10项:重写equals时请遵守通用约定

      重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...

  8. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理五 (二十三)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. Bran的内核开发教程(bkerndev)-05 打印到屏幕

    打印到屏幕   现在, 我们需要尝试打印到屏幕上.为此, 我们需要管理屏幕滚动, 如果能允许使用不同的颜色就更好了.好在VGA视频卡为我们提供了一片内存空间, 允许同时写入属性字节和字符字节对, 可以 ...

  10. pdfminer API介绍:pdf网页爬虫

    安装 pip install pdfminer 爬取数据是数据分析项目的第一个阶段,有的加密成pdf格式的文件,下载后需要解析,使用pdfminer工具. 先介绍一下什么是pdfminer 下面是官方 ...