vc hook send烦请转delphi

WSockExpert[抓包工具] 一、WSockExpert简单介绍 WSockExpert是一个抓包工具,它能够用来监视和截获指定进程网络数据的传输,对測试站点时非常实用。在黑客的手中,它经常被用来改动网络发送和接收数据,利用它能够协助完毕非常多网页脚本入侵工作。 WSockExpert的使用原理:当指定某个进程后,WSockExpert就会在后台自己主动监视记录该进程通过网络接收和传送的全部数据。在进行网页脚 本攻击时,我们经常会利用到用户验证漏洞、Cookie构造等手段,在使用这些入侵手段时,我... 阅读详情
在DELPHI中如实HOOK send,我看不懂C代码,请哪位高手指点
只要写出DELPHI中实现hook send就行了(包括可以修改HOOK到的封包,发送自己的封包)
不知道大家用过WSockExpert没有, 它可以用来截获指定进程网络数据的传输.
前面我还以为它是通过实时远程注入DLL来更改IAT. 不过后来发现在程序一运行时,
它就已经将DLL插入所有进程了,这个跟冰哥写的那个模拟SOCKCAP的程序很相似.
似乎是将DLL注入所有进程, 不过再想一下, 如果是这样的话,那么后来启动的程序
应该不会被注入DLL(除非用定时^_^,这样就太麻烦了), 考虑到这些, 我估计它是
用的HOOK,用HOOK的话就有一点方便:不必考虑有没有读写权限的问题. 也就免
了一些麻烦.
    我在BCB环境中用APIHOOK模拟了一个类似的程序,通过HOOK将DLL插入所有
进程,然后截获WINSOCK API.中间遇到了一些问题,参考了冰哥的SOCKCAP和
EYAS大哥的XHOOK. 在XHOOK中将原始DLL做了一个备份, 在执行API时并没有先
将API地址还原,而是直接调用了备份的函数, 这样提高了执行效率.厉害, :-)
以后再改,先放上一个简单的演示,大家可以对它进行修改扩展功能:


DLL代码:

//---------------------------------------------------------------------------
// Mady By ZwelL
// 2004.8
// zwell@sohu.com
//---------------------------------------------------------------------------
#include <Winsock2.h>
#include <stdio.h>

#pragma argsused

//自定义APIHOOK结构
typedef struct
{
    FARPROC funcaddr;
    BYTE    olddata[5];
    BYTE    newdata[5];
}HOOKSTRUCT;

HHOOK       g_hHook;
HINSTANCE   g_hinstDll;
HMODULE     hModule ;
HANDLE      g_hForm;    //接收信息窗口句柄
DWORD       dwIdOld, dwIdNew;

//------------------------------------------------------------------------
// 由于要截获两个库里面的函数,所以每个函数定义了两个HOOK结构
// 在编程过程中因为没有考虑到这个问题,导致很多包没有截获到,
// 后来想到了冰哥在模仿SOCKCAP的程序中每个函数截了两次才明白
// 一个是wsock32.dll, 一个是ws2_32.dll
//------------------------------------------------------------------------
HOOKSTRUCT  recvapi;
HOOKSTRUCT  recvapi1;
HOOKSTRUCT  sendapi;
HOOKSTRUCT  sendapi1;
HOOKSTRUCT  sendtoapi;
HOOKSTRUCT  sendtoapi1;
HOOKSTRUCT  WSASendapi;

void HookOn();
void HookOff();
BOOL Init();
extern "C" __declspec(dllexport) __stdcall
BOOL InstallHook();
extern "C" __declspec(dllexport) __stdcall
BOOL UninstallHook();

BOOL hookapi(char *dllname, char *procname, DWORD myfuncaddr, HOOKSTRUCT *hookfunc);
int WINAPI Myrecv(SOCKET s, char FAR *buf, int len, int flags);
int WINAPI Myrecv1(SOCKET s, char FAR *buf, int len, int flags);
int WINAPI Mysend(SOCKET s, char FAR *buf, int len, int flags);
int WINAPI Mysend1(SOCKET s, char FAR *buf, int len, int flags);
int WINAPI Mysendto(SOCKET s, const char FAR * buf, int len,
    int flags, const struct sockaddr FAR * to, int tolen);
int WINAPI Mysendto1(SOCKET s, const char FAR * buf, int len,
    int flags, const struct sockaddr FAR * to, int tolen);
int WINAPI MyWSASend(
  SOCKET s,
  LPWSABUF lpBuffers,
  DWORD dwBufferCount,
  LPDWORD lpNumberOfBytesSent,
  DWORD dwFlags,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
void sndmsg(char *buf);

//---------------------------------------------------------------------------
// 入口函数
// 在一载入库时就进行API截获
// 释放时还原
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    switch (reason)
    {
        case DLL_PROCESS_ATTACH:
            g_hinstDll = hinst;
            g_hForm = FindWindow(NULL, "ZwelL");
            if(!Init())
            {
                MessageBoxA(NULL,"Init","ERROR",MB_OK);
                return(false);
            }
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            UninstallHook();
            break;
      }
    return TRUE;
}

//-----------------------------------------------------------------------
BOOL Init()
{
    hookapi("wsock32.dll", "recv", (DWORD)Myrecv, &recvapi);
    hookapi("ws2_32.dll", "recv", (DWORD)Myrecv1, &recvapi1);
    hookapi("wsock32.dll", "send", (DWORD)Mysend, &sendapi);
    hookapi("ws2_32.dll", "send", (DWORD)Mysend1, &sendapi1);
    hookapi("wsock32.dll", "sendto", (DWORD)Mysendto, &sendtoapi);
    hookapi("ws2_32.dll", "sendto", (DWORD)Mysendto1, &sendtoapi1);
    hookapi("wsock32.dll", "WSASend", (DWORD)MyWSASend, &WSASendapi);
    dwIdNew = GetCurrentProcessId(); // 得到所属进程的ID
    dwIdOld = dwIdNew;
    HookOn(); // 开始拦截
    return(true);
}
//---------------------------------------------------------------------------
LRESULT WINAPI Hook(int nCode, WPARAM wParam, LPARAM lParam)
{
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) __stdcall
BOOL InstallHook()
{
    g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)Hook, g_hinstDll, 0);
    if (!g_hHook)
    {
        MessageBoxA(NULL, "SET ERROR", "ERROR", MB_OK);
        return(false);
    }
    return(true);
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) __stdcall
BOOL UninstallHook()
{
    HookOff();
    if(g_hHook == NULL)
        return true;
    return(UnhookWindowsHookEx(g_hHook));
}

//---------------------------------------------------------------------------
// 根据输入结构截获API
//---------------------------------------------------------------------------
BOOL hookapi(char *dllname, char *procname, DWORD myfuncaddr, HOOKSTRUCT *hookfunc)
{
    hModule = LoadLibrary(dllname);
    hookfunc->funcaddr = GetProcAddress(hModule, procname);
    if(hookfunc->funcaddr == NULL)
        return false;

    memcpy(hookfunc->olddata, hookfunc->funcaddr, 6);
    hookfunc->newdata[0] = 0xe9;
    DWORD jmpaddr = myfuncaddr - (DWORD)hookfunc->funcaddr - 5;
    memcpy(&hookfunc->newdata[1], &jmpaddr, 5);
    return true;
}
//---------------------------------------------------------------------------
void HookOnOne(HOOKSTRUCT *hookfunc)
{
    HANDLE hProc;
    dwIdOld = dwIdNew;
    hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
    VirtualProtectEx(hProc, hookfunc->funcaddr, 5, PAGE_READWRITE,&dwIdOld);
    WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->newdata, 5, 0);
    VirtualProtectEx(hProc, hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
}
//---------------------------------------------------------------------------
void HookOn()
{
    HookOnOne(&recvapi);
    HookOnOne(&sendapi);
    HookOnOne(&sendtoapi);
    HookOnOne(&recvapi1);
    HookOnOne(&sendapi1);
    HookOnOne(&sendtoapi1);
    HookOnOne(&WSASendapi);
}
//---------------------------------------------------------------------------
void HookOffOne(HOOKSTRUCT *hookfunc)
{
    HANDLE hProc;
    dwIdOld = dwIdNew;
    hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);
    VirtualProtectEx(hProc, hookfunc->funcaddr,5, PAGE_READWRITE, &dwIdOld);
    WriteProcessMemory(hProc, hookfunc->funcaddr, hookfunc->olddata, 5, 0);
    VirtualProtectEx(hProc, hookfunc->funcaddr, 5, dwIdOld, &dwIdOld);
}

//---------------------------------------------------------------------------
void HookOff()
{
    HookOffOne(&recvapi);
    HookOffOne(&sendapi);
    HookOffOne(&sendtoapi);
    HookOffOne(&recvapi1);
    HookOffOne(&sendapi1);
    HookOffOne(&sendtoapi1);
    HookOffOne(&WSASendapi);
}
//---------------------------------------------------------------------------
int WINAPI Myrecv(SOCKET s, char FAR *buf, int len, int flags)
{
    int nReturn;
    HookOffOne(&recvapi);
    nReturn = recv(s, buf, len, flags);
    HookOnOne(&recvapi);

    char *tmpbuf=new char[len+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "recv|%d|%d|%s",
            GetCurrentProcessId(),
            len,
            buf);
    sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);
}
//---------------------------------------------------------------------------
int WINAPI Myrecv1(SOCKET s, char FAR *buf, int len, int flags)
{
    int nReturn;
    HookOffOne(&recvapi1);
    nReturn = recv(s, buf, len, flags);
    HookOnOne(&recvapi1);

    char *tmpbuf=new char[len+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "recv1|%d|%d|%s",
            GetCurrentProcessId(),
            len,
            buf);
    sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);
}
//---------------------------------------------------------------------------
int WINAPI Mysend(SOCKET s, char FAR *buf, int len, int flags)
{
    int nReturn;
    HookOffOne(&sendapi);
    nReturn = send(s, buf, len, flags);
    HookOnOne(&sendapi);

    char *tmpbuf=new char[len+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "send|%d|%d|%s",
            GetCurrentProcessId(),
            len,
            buf);
    sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);
}
//---------------------------------------------------------------------------
int WINAPI Mysend1(SOCKET s, char FAR *buf, int len, int flags)
{
    int nReturn;
    HookOffOne(&sendapi1);
    nReturn = send(s, buf, len, flags);
    HookOnOne(&sendapi1);

    char *tmpbuf=new char[len+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "send1|%d|%d|%s",
            GetCurrentProcessId(),
            len,
            buf);
    sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);
}
//--------------------------------------------------------------------------
int WINAPI Mysendto(SOCKET s, const char FAR * buf, int len,
    int flags, const struct sockaddr FAR * to, int tolen)
{
    int nReturn;
    HookOffOne(&sendtoapi);
    nReturn = sendto(s, buf, len, flags, to, tolen);
    HookOnOne(&sendtoapi);

    char *tmpbuf=new char[len+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "sendto|%d|%d|%s",
            GetCurrentProcessId(),
            len,
            buf);
    sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);    
}
//--------------------------------------------------------------------------
int WINAPI Mysendto1(SOCKET s, const char FAR * buf, int len,
    int flags, const struct sockaddr FAR * to, int tolen)
{
    int nReturn;
    HookOffOne(&sendtoapi1);
    nReturn = sendto(s, buf, len, flags, to, tolen);
    HookOnOne(&sendtoapi1);

    char *tmpbuf=new char[len+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "sendto1|%d|%d|%s",
            GetCurrentProcessId(),
            len,
            buf);
    sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);    
}
//----------------------------------------------------------------------------
int WINAPI MyWSASend(
  SOCKET s,
  LPWSABUF lpBuffers,
  DWORD dwBufferCount,
  LPDWORD lpNumberOfBytesSent,
  DWORD dwFlags,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
{
    int nReturn;
    HookOffOne(&WSASendapi);
    nReturn = WSASend(s, lpBuffers, dwBufferCount,
                lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);
    HookOnOne(&WSASendapi);

    char *tmpbuf=new char[*lpNumberOfBytesSent+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "WSASend|%d|%d|%s",
            GetCurrentProcessId(),
            lpNumberOfBytesSent,
            lpBuffers->buf);
    sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);  
}

//-----------------------------------------------------------------
// 向窗口发送消息
// 考虑到简单性,用了COPYDATASTRUCT结构
// 用内存映射应该会快一点
//-----------------------------------------------------------------
void sndmsg(char *buf)
{
    COPYDATASTRUCT cds;
    cds.dwData=sizeof(COPYDATASTRUCT);
    cds.cbData=strlen(buf);
    cds.lpData=buf;
    SendMessage(g_hForm,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
}






主窗体代码:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main_Form.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "HexEdit"
#pragma resource "*.dfm"
TForm1 *Form1;

HINSTANCE hdll;
BOOL __stdcall (*InstallHook)();
BOOL __stdcall (*UninstallHook)();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    Application->OnHint=DisplayHint;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    g_dindex=0;
    
    hdll = LoadLibrary("dll.dll");
    if(hdll == NULL)
        MessageBox(NULL, "LoadLibrary", "Error", MB_OK|MB_ICONERROR);
    InstallHook = GetProcAddress(hdll, "InstallHook");
    if(!InstallHook)
    {
        MessageBox(NULL, "InstallHook", "Error", MB_OK|MB_ICONERROR);
    }
    UninstallHook = GetProcAddress(hdll, "UninstallHook");
    if(!UninstallHook)
    {
        MessageBox(NULL, "UninstallHook", "Error", MB_OK|MB_ICONERROR);
    }
    InstallHook();

    startBtn->Enabled=false;
    stopBtn->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    g_dindex=0;
    UninstallHook();
    FreeLibrary(hdll);
    startBtn->Enabled=true;
    stopBtn->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnCopyData(TMessage &Msg)
{
    COPYDATASTRUCT *cds=(COPYDATASTRUCT*)Msg.LParam;
    AnsiString tmpbuf = (char *)cds->lpData;
    TListItem *li=lv->Items->Add();
    li->Caption=g_dindex;
    if(tmpbuf.SubString(1, tmpbuf.Pos("|")-1).Pos("send")>0)
    {
        li->ImageIndex=1;
    }
    else
    {
        li->ImageIndex=0;
    }
    
    li->SubItems->Add(tmpbuf.SubString(1, tmpbuf.Pos("|")-1));
    tmpbuf=tmpbuf.SubString(tmpbuf.Pos("|")+1, tmpbuf.Length());
    li->SubItems->Add(tmpbuf.SubString(1, tmpbuf.Pos("|")-1));
    tmpbuf=tmpbuf.SubString(tmpbuf.Pos("|")+1, tmpbuf.Length());
    li->SubItems->Add(tmpbuf.SubString(1, tmpbuf.Pos("|")-1));
    li->SubItems->Add(tmpbuf.SubString(tmpbuf.Pos("|")+1, tmpbuf.Length()));
}

void __fastcall TForm1::lvInsert(TObject *Sender, TListItem *Item)
{
    g_dindex++;
    lv->Perform(LVM_SCROLL,0,10);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::lvClick(TObject *Sender)
{
    if(lv->ItemIndex < 0)
        return;
    HexEdit1->LoadFromBuffer(lv->Items->Item[lv->ItemIndex]->SubItems->Strings[3].c_str(),
        lv->Items->Item[lv->ItemIndex]->SubItems->Strings[3].Length());
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
    lv->Clear();    
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if(stopBtn->Enabled)
        Button2Click(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::lvAdvancedCustomDrawItem(TCustomListView *Sender,
      TListItem *Item, TCustomDrawState State, TCustomDrawStage Stage,
      bool &DefaultDraw)
{
    if(Item->ImageIndex==0)
    {
        lv->Canvas->Brush->Color = 0x00FFF5EC;
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::lvKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    if(lv->ItemIndex < 0)
        return;
    HexEdit1->LoadFromBuffer(lv->Items->Item[lv->ItemIndex]->SubItems->Strings[3].c_str(),
        lv->Items->Item[lv->ItemIndex]->SubItems->Strings[3].Length());    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DisplayHint(TObject *Sender)
{
    StatusBar1->SimpleText=GetLongHint(Application->Hint);
}
hook send recv wsasend wsarecv 封包工具源码 hook send recv wsasend wsarecv 封包工具源码 本工具支持命令行操作,采用远程线程注入目标进程,注入后hook发包函数,实现封包拦截。 主程序为MFC编写 动态链接库VC WIN32项目 立即下载

相关推荐

抓包工具WSock Expert

抓包工具WSock Expert 用过的都知道

Windows下Hook API 技术(HOOK SEND

Windows下HookAPI技术 什么叫HookAPI?所谓Hook就是钩子的意思,而API是指Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是...

weixin_33749242的博客 683

WSockExpert(广凌寒个人修改免杀版+黑眼睛汉化版)

WSockExpert 汉化中文版,一款抓包软件,软件包内包含有两个版本

终于搞定webbrowers的hook_sendsend数据了。

今天终于搞定hook_send了,参考一个朋友的博客,少一个__stdcall结果就是编译不出错,运行出错,原来必须得加上这个,让函数自己搞好堆栈。

ebhb111的专栏 913

java 后台 接入app微信支付

目录pom.xml配置OurWxPayConfigController层Serviceimpl回调 第一次微信支付接入,吐血,记录一下。 简单的支付,不涉及退款等更多操作 需要准备的参数: appid:商家平台ID。在微信的平台上有 body:商品描述。 mch_id:商户ID。在微信的平台上有 nonce_str:随机字符串,UUID就好了。 out_trade_no:商户订单号 spbill_create_ip:终端IP。这个可以从请求头中拿到 total_fee:支付金额。单位是分。 trade_t

那就叫我枫哥吧 1084

java app微信支付接口_APP支付微信支付,Java后台开发

记录微信支付的开发过程附上开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html统一下单,完成微信支付共需要两个接口第一个:拉取微信预付单第二个:微信异步通知前期准备,都是产品或者其他人员来准备的,我们需要的东西有,商户appid商户号服务器异步通知路径(开发人员)密钥(AppSecret)统一下单接口链接:https://api.mch.we...

weixin_35801556的博客 841

java后台对接app微信支付

java后台对接app微信支付 一开始对接微信支付也是云里雾里,找了很多资料,参考大佬们的案例 好在最后还是完成了 记录一下我是怎么完成的,希望能帮到后来者,也有助于自己以后回顾 1:申请微信支付 首先要申请微信支付,申请通过之后会收到一个邮件 里面会有 商户号和appid等信息 2:获取必要参数 到微信的商户平台通过安装证书等一系列操作获取密钥key,然后到微信开发平台获取app的APP_SEC...

qq_40236767的博客 6098

微信回调 java_详解APP微信支付(java后台_统一下单和回调)

1.微信配置信息 global.properties2.方法wxpay用于生成预支付订单信息方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服务器会根据提供的回调地址进行回调,parameterMap.put("notify_url", wxnotify); (见下面代码)在局域网是无法进行回调的,必须将你的服务端放在公网上进行测试, 回调函...

weixin_30768881的博客 2947

微信支付(APP支付,java后台)

1.微信支付原理流程图支付流程说明:2.微信支付的流程3.微信支付的后台代码java开发4.总结

调皮的写代码 930

WSockExpert中文.rar

用来抓包的工具,我看还是会用的再用吧!我没什么好说的了!

hook WSASend源码-易语言

hook WSASend源码

App支付JAVA后台-JAVA微信支付

这篇内容看标题已经很明确了,由于微信是用xml通讯的,所以这一点比较恶心,各位可能需要在项目里导入一些解析xml的包。 首先放出工具类(包含支付宝用到的工具类),因为现在csdn下载都是扣积分的,因为工具类代码会在文尾贴出。 工具类下载:点击这里 首先我在重新贴一下支付流程图吧,我再重复一遍,一定要认真看流程图,这样对你业务逻辑的处理有很大的提升。 知道了支付的大致流程,接下来就要分...

weixin_34266504的博客 131

java app微信支付接口_app微信支付java后台实现(spring mvc

前言由于项目需要做微信支付和支付宝支付,自己花时间研究了一下,也百度了很久,最后发现百度上很多都讲得不是很详细,对于新手小白来说,还是比较难得,所以自己整理了一下自己写的,也有很多是参考的,希望能给大家带来帮助一 图示(乱画的,方便看)二 工具类准备2.1由于微信支付发送的https的post请求,所以需要写个工具类来实现https的发送发送https需要自定义一个TrustManager实现X5...

weixin_39589511的博客 556

App支付JAVA后台-微信支付JAVA

上篇我们记录了手机端的微信支付的大致流程,期间可能会遇到各种各样的错误,但这些问题没有得到官方的重视,所以我们只能一步步自己排查,要有足够的耐心。 这篇内容看标题已经很明确了,由于微信是用xml通讯的,所以这一点比较恶心,各...

s297485987的专栏 466

APP微信支付java后台+SpringMVC

      最新有些人来问我微信支付这块后台代码,有些人说网上的代码很多坑,在这里我把我一直用的一套代码贴出来,让网友们不再在微信支付后台这里踩坑。    首先微信申请账号、账号配置这些就不写了,百度上有很多,基本上按着步骤来都是正确的,这里只贴相关代码。    1.Controller代码 String sign = null; Double totalAmount = D...

倚栏静望的博客 738

APP微信支付Java后台的实现(springmvc

第一次做微信支付,阅读完开发文档后,下了个官方demo,摸索了好久,期间也出现了好多问题,终于是实现生成预支付订单以及支付成功后接收微信服务器通知,不多说了,直接上代码: 一、工具类 ConstantUtil.java public class ConstantUtil { /** * 微信开发平台应用ID */ public static f...

weixin_30437337的博客 178

手把手教你完成App支付JAVA后台-微信支付JAVA

上篇我们记录了手机端的微信支付的大致流程,期间可能会遇到各种各样的错误,但这些问题没有得到官方的重视,所以我们只能一步步自己排查,要有足够的耐心。这篇内容看标题已经很明确了,由于微信是用xml通讯的,所以这一点比较恶心,各位可能需要在项目里导入一些解析xml的包。 首先放出工具类(包含支付宝用到的工具类),因为现在csdn下载都是扣积分的,因为工具类代码会在文尾贴出。 工具类下载:点击这里首先我

大胡子康贝勒爷 4万+
web518
博客等级 码龄21年 0粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值