YPAY 收款监控端 —— 使用说明
============================================================
一、这个程序做什么
------------------------------------------------------------
监控微信 PC 端的到账通知,匹配你网站上的待支付订单,
并按易支付格式签名回调你的网站,完成自动发货。
二、运行环境
------------------------------------------------------------
- Windows 10 1809(内部版本 10.0.19041)及以上,64 位
(实测 Windows Server 2012 也可运行)
- 微信 PC 版已登录
- 无需安装 .NET(本包已自带运行时)
- 无需安装中文 OCR 语言包(本包已内置离线 OCR 引擎)
- 无需安装 VC++ 运行库(本包已自带,见第七节)
三、怎么用
------------------------------------------------------------
1. 把整个 YPayMonitor 文件夹解压到磁盘上。
建议放在纯英文路径,例如 D:\YPayMonitor
⚠ 必须先完整解压,不要直接在压缩包里双击运行
⚠ 必须整个文件夹一起拷,不能只拿 YPayMonitor.exe ——
程序本体和 OCR 引擎都在 app\ 子目录里
2. 双击根目录的 YPayMonitor.exe(这是个启动器,它会拉起 app\ 里的主程序)
3. 首次启动会自动在 app\ 下生成 config.json
4. 点「配置」,填写最上面两节的**商户 / 平台**与**平台原生模式**:
商户ID(pid)、平台接口地址、商户密钥 key(本地模式)/
软件通讯密钥 appkey + 收款账号 ID channel_id(平台原生模式)
这两节的配置**单独保存在 app\platform.json** 里:
⚠ 首次运行程序目录下没有 platform.json,所以这些项都是**空的**,
需要你自己填;填完点「保存并生效」就会生成该文件,以后启动自动读取。
⚠ 没填之前程序**不会启动监控**(日志会写「平台配置尚未填写」),
这是为了避免拿空配置往平台发通知。
5. 在微信里点开「微信收款助手」会话(程序只读取,不修改微信)
⚠ 这一步很关键:微信 4.x 允许把聊天开成**独立窗口**,程序会锁定窗口。
只要当前窗口标题不是「微信收款助手」,程序就会**跳过到账判定**(不会乱回调)。
6. 界面出现「微信监听:已连接微信·OCR(…) · 监听中」,即表示已就绪
7. 也可以随时用浏览器打开 http://127.0.0.1:9501/api/diag/wechat 自查:
session_ready 是否为 true、window_title 是否等于 target_session
8. 遇到「明明收到钱了却不识别」时,用浏览器打开
http://127.0.0.1:9501/api/diag/screenshot
它会把**程序实际抓到的画面**存成 3 张 PNG 到 app\logs\captures\,
可以直接和你在屏幕上看到的样子对比(详见第六节最后几条问答)
【关闭 / 退出的两种方式】
默认行为:点右上角 × 只是把窗口收进托盘,程序继续在后台监听,
要真正退出请在托盘图标上右键 →「退出」。
想要「点 × 就退出」:配置页勾选 **关闭窗口直接退出程序(不驻留托盘)**
(对应 config.json 里的 ExitOnClose: true)。
⚠ 勾选后关闭窗口会真正结束进程,后台就不再监听收款了。
四、目录说明(1.1.0 起的新结构;1.1.4 起配置文件就在根目录)
------------------------------------------------------------
根目录放「启动器 + 本说明 + 两个配置文件」,程序本体收在 app\ 里:
YPayMonitor.exe 启动器(双击这个运行,体积很小)
使用说明.txt 本文件
config.json ← 配置:微信监听、本地接口、订单回调、界面、自动更新开关
platform.json ← 配置:商户 / 平台 + 平台原生模式(**首次运行不存在**,
在「配置」里填好并保存后才会生成;这就是把它单独放一个
文件的原因 —— 换机器或备份凭据时只动这一个文件)
app\ ← 程序本体都在这一个目录里
YPayMonitor.exe 主程序(不要直接双击它,用根目录那个启动器)
tessdata\ 内置 OCR 引擎的中文/英文语言数据
x64\ 内置 OCR 引擎的本地库 + VC++ 运行库(10 个 DLL)
Tesseract.dll 内置 OCR 引擎组件
orders.json 订单池(待支付订单)
collects.json 收款记录
logs\ 运行日志(按天生成)
captures\ 排障截图(见第六节)
logs\launcher-*.log 启动器/更新器的日志(自动更新排障用)
update\ 自动更新的下载目录(更新完可以删)
其余 .dll 程序自带的 .NET 运行时,请勿删除
为什么要分成两层:程序本体有近 200 个文件,
平铺在根目录里既不好看也不好找;启动器很小(单文件),
放在根目录一眼就能看到、方便双击。
⚠ 1.1.4 起,config.json / platform.json 就在**启动程序旁边**(根目录),
可以直接用记事本打开编辑,不用再进 app\ 里找。
从旧版本升级上来时,原来在 app\ 下的这两个文件会自动搬一份到根目录
(app\ 里的原件保留,确认没问题后可以自己删掉)。
五、版本与自动更新
------------------------------------------------------------
- 当前版本显示在两处:窗口**标题栏**和**右下角状态栏**(形如 v1.1.4)
- 工具栏右侧有「检查更新」按钮,托盘右键菜单里也有同名项
- 程序**启动后约 30 秒**会自动检查一次新版本,之后每 6 小时一次
(间隔可在「配置 → 自动更新」里改,填 0 表示只在启动时查一次)
- 发现新版本时会弹窗,列出**版本号 / 更新包大小 / 更新内容**,
由你决定是否现在更新:
· 点「立即更新」→ 自动下载 → 自动替换 → **自动重启**,全程不用手动解压
· 点「稍后再说」→ 本次不更新,下次检查时会再提醒
- 更新**不会动你的数据**:config.json、**platform.json**、orders.json、
collects.json、crash.log 以及 logs\、captures\ 都会被保留,不会被新版覆盖掉
- 更新过程中的排障日志在 app\logs\launcher-*.log
- 检查更新走的是程序内置的商城接口,**界面上不显示该地址**,
界面日志栏也不会打印它(例行检查只写进 app\logs\ 的日志文件),
避免把内部信息暴露给使用程序的人。
⚠ 想让更新能自动安装,必须保持现有的两层目录结构
(根目录有 YPayMonitor.exe、下面有 app\)。
如果你把主程序单独拷出来用,就只能手动下载覆盖了。
⚠ 从 **1.1.0 / 1.1.1 升级到 1.1.2** 时,需要**手动覆盖安装一次**:
更新包的内部目录做了整理(根目录不再散落程序文件,只留 app\ 与 _root\ 两个目录),
而执行安装的更新器是旧版本自带的那个,它认不出新格式 ——
点「立即更新」会提示「更新包内容不完整」并**安全中止**(原程序不受影响,可继续使用)。
解决:下载免安装版压缩包,解压后把 YPayMonitor.exe / 使用说明.txt / app\
覆盖到原安装目录(你自己的 config.json / platform.json / orders.json / collects.json 都不要删),
重启即可。装上 1.1.2 之后启动器就是新版,以后自动更新恢复正常。
**只有已经装过 1.1.0 / 1.1.1 的机器需要这一步,全新安装不受影响。**
六、常见问题
------------------------------------------------------------
Q: 启动后窗口比以前小了?
A: 是的(1.1.2 起初始窗口从 1040×720 改成 920×640)。
在 1366×768 这类小屏、以及远程桌面里更不容易超出屏幕。
窗口是**可以随意拉大**的,程序不会记住尺寸,每次启动都用这个较紧凑的大小。
窗口缩到最小时表格与日志都还能用(各自有最小高度)。
Q: 日志栏里的长消息会折成好几行?
A: 是的(1.1.2 起)。以前一行太长会被**直接截断**(回调地址、异常原因这些
最需要看的内容恰好都在右半边,完全看不到),现在会自动折行完整显示,
拖动窗口宽度时也会跟着重新排版。
极端长的内容(比如完整的异常链)最多显示 20 行,末行右下角会标
「…完整内容见日志文件」,完整内容始终写在 app\logs\ 下当天的日志里。
Q: 启动后提示「平台配置尚未填写」,监控也没启动?
A: 这是正常的首次运行状态。商户 / 平台相关配置存在程序目录的 platform.json 里,
而这个文件**首次运行并不存在**(所以那些项都是空的)。
点「配置」,把最上面两节(平台原生模式 + 商户 / 平台)填好,
点「保存并生效」后会生成 platform.json,监控会自动启动;
以后每次启动都会从该文件读取。不想重新填?把备份的 platform.json
拷到 app\ 目录下即可。
Q: 界面显示「未打开『微信收款助手』」?
A: 在微信里点开这个会话即可。若你的会话名不一样,改 app\config.json 里的
WeChat.TargetSession。
Q: 微信窗口能最小化吗?
A: 不能。程序用后台截图读取内容,窗口最小化后没有画面。
可以放在其他窗口后面,不要求它在前台。
Q: 提示本地接口端口被占用?
A: 改 app\config.json 里的 LocalApi.Port 为其他端口。
Q: 会不会把金额认错导致误发货?
A: 程序有多重保护:金额必须落在订单时间窗内、且在待支付订单里**唯一命中**
才会回调;默认还要求金额**精确相等**。
建议先用界面上的「模拟到账」走一遍完整链路验证。
Q: 客户先付款、我后下单,还能匹配上吗?
A: 能。到账时若订单池里没有对应订单,这条到账会保留 120 秒,
期间一旦登记了同金额订单会立刻补匹配并回调。
Q: 跑久了感觉不监控了,必须重启?
A: 本版已内置自愈,绝大多数情况会自己恢复,不用重启:
· PrintWindow 抓到纯色空图 → 自动换备用抓图参数重试
· OCR 引擎状态变坏 → 连续数轮读不到内容就重建引擎
· 微信重启 / 更新导致窗口变了 → 重新定位目标窗口并重建读取链路
(窗口是"粘性锁定"的:只要锁定的窗口还在就绝不换,不会来回跳)
程序还会复用截图内存,避免长时间运行后越跑越卡。
自查办法:浏览器打开 http://127.0.0.1:9501/api/diag/wechat
看 empty_read_streak(连续读不到内容轮数)与
auto_repair_count(已自愈次数);日志里搜「自愈重建」能看到原因。
若仍周期性失效,请把日志发来(这类通常与该机器的显卡渲染/微信版本有关)。
Q: 真收到钱了,程序却没反应?
A: 按下面顺序自查(浏览器打开 http://127.0.0.1:9501/api/diag/wechat):
1) 看 session_ready 是不是 false、window_title 是不是「微信收款助手」。
如果 window_title 显示的是**别的会话名**,说明程序看着的不是目标会话
—— 在微信里点开「微信收款助手」即可。日志里会有「不是目标会话」的告警。
⚠ 本版起,不是目标会话时程序会**明确跳过判定**(宁可不动,也不误发货)。
2) 看 line_count:一直是 0 说明截图/识别链路有问题,8 轮后会自动自愈。
3) 看 window_switch_count:正常应长期为 0~1。持续增长说明监控窗口在切换,
日志里会有「监控窗口变更」,请把日志发来。
4) line_count 大于 0 但 amount_count 一直是 0:说明读到了内容但认不出金额。
日志里搜「本轮读不到收款内容」,后面会把 OCR 实际读到的原文打出来。
5) marker 是空字符串("")而 amount_count 大于 0:说明**累计标记没读到**。
这时请用第 8 步的截图接口,把程序实际抓到的画面导出来对比 ——
2026-09-21 遇到过一次:屏幕上明明有「今日收款 0.01元(1笔)」,
而程序抓到的裁剪图里**前面「今日收款」四个字被切掉了**,导致认不出累计标记。
本版已修(裁剪区左侧多留 80 像素 + 认「0.01元(1笔)」这种没有前缀的写法)。
Q: 明明收到钱了,日志里却写着「聊天区连续 N 轮无重合,认定为界面整体变化,重建基线」?
A: 这条日志的含义是:**这一屏内容与上一轮完全对不上,程序把它当成"换了一批内容",
只作为新的起算点记录下来,不会回调**。如果那一屏其实是一笔真到账,就等于丢单了。
1.1.3 起已修掉三条会导致这种丢单的路径:
① 跨天丢单:微信的累计标记是「今日」口径,过了零点会重新从「第 1 笔」算起。
程序是长期挂着的,所以以前**每天的第一笔收款必然丢单**。
现在识别为"新周期首笔",取累计值作为本笔金额。
② "新到账卡片顶替旧卡片"被误判成界面刷新:收款助手的卡片是一张顶一张的,
所以"新到账"和"整屏刷新"在金额序列上一模一样,以前每次真到账都被这条兜底吞掉。
现在按证据强度分三层判定,不再悄悄丢掉金额;实在救不回来也会在日志里写明。
③ OCR 把「共计」读成「共记 / 共汁」时,累计行的金额被重复计入本笔金额。
现在累计行做了容错,而且"按累计差额算出的金额"必须能在卡片上看到才会采信。
1.1.3 起,这类日志后面会**把程序本轮实际读到的原文一并打出来**,
如果还遇到,直接把那段日志发来即可定位。
1.1.4 起又补了一条:**短时间内连收多笔**时,如果程序没跟上、中间几笔的卡片
已经被新卡片顶掉(日志写「笔数 +N 但可视区只看到 1 条金额」),
以前会把**整批**都丢掉。现在至少会把**最新那一笔**上报出来,并在日志里写明
「其余未能捕获、请人工核对到账记录」。
⚠ 中间那几笔的画面已经被顶掉,程序拿不回来 —— 想避免跳笔,收款节奏
慢于 1~2 秒一笔即可(程序每轮扫描约 1 秒)。
Q: 配置文件在哪?我想直接打开改?
A: 就在启动程序 YPayMonitor.exe 旁边(同一个目录):
config.json 微信监听、本地接口、订单回调、界面、自动更新开关等
platform.json 商户 / 平台 + 平台原生模式(商户号、密钥、收款账号 ID)
用记事本直接打开改,保存后重启程序即可;在界面「配置」里改效果一样,
点「保存并生效」时写入的就是这两个文件。
⚠ platform.json 里是商户凭据,别随手发给别人、也别放到共享目录里。
(1.1.4 起它们从 app\ 移到了这一层。从旧版升级上来时老文件会自动搬过来。)
Q: 怎么确认「程序看到的画面」和我看到的一样?
A: 浏览器打开 http://127.0.0.1:9501/api/diag/screenshot,它会在
app\logs\captures\ 里存 3 张图:
…-1-full.png 程序抓到的整窗
…-2-crop.png 裁剪后的聊天区(程序实际只看这一块)
…-3-ocr-input.png 放大后送去识别的图(OCR 真正看到的)
返回的 info 里还有窗口大小、屏幕位置、裁剪矩形、抓图参数和耗时。
如果 -3 里缺少你在屏幕上看到的某行字,就是裁剪比例或抓图参数的问题,
把这 3 张图和 info 一起发来即可定位。
Q: 启动后把「微信收款助手」里的**历史**收款也识别了?
A: 本版已修。启动后的第一轮读取只建立基线,不会产生任何回调;
如果启动时聊天区**本来就是空的**(还没有任何到账卡片),程序会建立一条
「**空基线**」(日志写「已建立空基线」),此后出现的到账**全部采信** ——
这样启动后的第一笔真到账就不会再被当成"建立基线"吸收掉。
另外本版修掉了「监控窗口在多个微信窗口之间抖动」这个根因
(微信同时开着独立聊天窗口时,以前可能读到别的会话内容)。
如果你还在旧包里看到这个现象,请更新到本版。
Q: 能不能像别的软件那样「Hook 绑定微信」?
A: 技术上能做,但**不会更稳**:Hook 需要注入微信进程、跟着微信每个版本
重新逆向,微信一升级就可能失效;且属于侵入第三方进程,
杀软普遍拦截,也有合规风险。同类软件"看起来稳"是因为它们跟着版本高频更新。
本版已把「窗口选错 / 会话没打开」这两个真正的坑修掉,
建议先用本版观察;若长时间跑下来仍有问题,把日志发来再评估。
七、关于 OCR 引擎与 VC++ 运行库
------------------------------------------------------------
程序按下面的顺序挑选 OCR 引擎:
1) 系统自带的 OCR(Windows.Media.Ocr)
中文识别更准、不占体积,优先使用;
2) 内置离线 OCR(Tesseract)
随程序一起分发,不依赖任何系统组件。
如果目标电脑是精简版 Windows(系统 OCR 组件被裁掉了,日志里会出现
「没有注册类 0x80040154」这类报错),程序会**自动改用内置离线引擎**,
你不需要做任何设置。注意:这条报错**不是"缺中文语言包"**,
装语言包没有用。
想手动指定,改 app\config.json 里 WeChat.OcrBackend:
auto 自动选择(默认,推荐)
winrt 只用系统 OCR
builtin 只用内置离线 OCR
凡是以 .dll 出现在 app\ 和 app\x64\ 里的 VC++ 运行库
(vcruntime140.dll / vcruntime140_1.dll / msvcp140.dll 等),
都是给内置 OCR 用的,不要删除、也不要替换成系统目录里的新版。
八、技术支持
------------------------------------------------------------
运行日志在 app\logs\ 目录,按天生成。反馈问题时请把相关日志一并提供,
并说明当前的**版本号**(标题栏或状态栏右下角显示的那个,形如 v1.1.4)。
涉及商户 / 平台配置的问题,也请附上 app\platform.json 的内容
(**先把里面的密钥打码**)。