ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

三合一收款码源码:PHP本地生成,告别聚合支付API

三合一收款码源码:PHP本地生成,告别聚合支付API 简介一套基于PHP的单文件收款码生成源码用于将QQ、微信、支付宝三种收款码合并为一张可识别二维码适合个人开发者、小微商家或需要在网页中集成聚合收款能力的场景。压缩包共4个文件包含PHP核心逻辑、HTML示例页面及CSS样式整体仅33KB结构简洁、便于部署与二次修改。目前已有443人学习实用性与轻量特点较为突出。源码不依赖第三方接口数据自主可控开发者只需替换文件内对应行的解码数据即可生成自己的三合一收款码同时保留了可调整的页面样式与基础模板便于按需定制展示效果或嵌入现有业务系统。1. 三合一收款码源码不是聚合支付是本地生成的三个码搜收款码生成器的同学十有八九会被引导到第三方聚合支付 API 上去申请 appid、配置密钥、联调回调一套流程没三五天下不来还得担心平台突然改规则。这份源码走的是完全不同的一条路——它不调用任何三方接口核心就是一个index.php加一个phpqrcode.php在 PHP 环境里本地生成黑白二维码。你用草料二维码把微信、支付宝、QQ 钱包各自的收款码解码成 URL 串替换进index.php的第 7、10、13 行上传到虚拟主机就能跑。适合独立开发者、个体商户也适合不想让客户付款数据流经第三方平台的团队。2. 先把收款码变成可替换的 URL解码与 index.php 改造2.1 为什么不能直接拿收款码原图拼页面很多第一次接触的人会问既然要做三合一直接把三张收款码图片摆在一页里点击切换不就行了不行。微信扫一扫识别的是二维码内部承载的文本内容而不是图片文件本身。用户手机扫到新生成的二维码时微信要能识别出这是 wxp 开头的微信支付串支付宝要能识别出这是 qr.alipay.com 的收银台链接跳转逻辑才能成立。所以第一步必须把原收款码解析成普通文本 URL这个过程行业里叫解码。解码得到的字符串就是后续所有页面的数据源相当于把图翻译成数据然后再由phpqrcode.php把数据还原成新的二维码图。这个图 → 数据 → 新图的链路就是整个三合一系统的底层基础。2.2 草料二维码解码的具体步骤摘要里提到的是草料二维码这也是目前最不需要注册就能完成解码的在线工具。在浏览器打开https://cli.im/deqr点击页面上传按钮把微信收款码的截图传上去识别结果出来后复制解码内容粘贴到本地临时文件存好重复第 2、3 步分别处理支付宝收款码和 QQ 钱包收款码。这一步没有难度但有一个高频失误三张图容易搞混。建议按微信/支付宝/QQ分别建立三个文本文件保存解码结果不要堆在一个文件里后面替换时复制粘贴更方便。另一个注意点是部分新版本微信收款码解码出来的内容很长复制时容易漏掉尾部字符而 URL 缺一个字符直接用不了。提示解码要在电脑浏览器上做手机端页面交互和复制体验都不如桌面端。2.3 三种收款码解码内容的典型形态渠道解码内容示例特征说明微信wxp://f2f0xxxxxxxxxxxxwxp 协议串由微信客户端内部识别并拉起收银台支付宝https://qr.alipay.com/fkx0xxxxxxxxxxxx标准 HTTPS 短链浏览器可直接访问QQ 钱包https://i.qianbao.qq.com/xxxxxxxxHTTPS 链接打开后走 QQ 客户端支付环境看懂这三类结构的价值在排错。如果你把支付宝的qr.alipay.com链接生成二维码后让用户用微信扫微信会提示无法打开该链接因为微信不认识支付宝域名下的支付页面反过来把wxp://串放到支付宝里扫支付宝也会直接忽略。三合一页面之所以三合一不是因为它生成了某种神奇的新协议而是因为它把三个互不兼容的协议放在同一个展示页里各回各家。另外注意一点解码后的字符串是固定不变的它不包含账户名、手机号等明文信息这也是收款码相对安全的根本原因——你贴出去的是加密后的支付路由参数。2.4 替换 index.php 的第 7、10、13 行在这份源码的index.php布局里第 7、10、13 行各定义了一个变量来存放对应渠道的解码内容。整体写法通常是这样的?php // 第 7 行微信收款码解码内容 $wx_pay_url wxp://f2f0xxxxxxxxxxxxxxxxxxxxxxxx; // 第 10 行支付宝收款码解码内容 $ali_pay_url https://qr.alipay.com/fkx0xxxxxxxxxxxx; // 第 13 行QQ 钱包收款码解码内容 $qq_pay_url https://i.qianbao.qq.com/xxxxxxxx; ?上面这段代码的逻辑很直接$wx_pay_url、$ali_pay_url、$qq_pay_url三个变量承载的是后续页面渲染二维码所需的原始数据。替换时只改动单引号里的内容变量名、分号、注释都不要动。单引号字符串里的符号无需转义PHP 不会对它做变量解析所以支付宝链接里常见的参数可以直接粘贴。如果替换后页面能打开但二维码扫出来不是收款页问题基本就是解码内容和变量对不上号比如把 QQ 钱包的串填进了微信变量里。3. 部署到 PHP 环境虚拟主机与 Nginx 的完整落地3.1 环境前提PHP 与 GD 扩展phpqrcode.php依赖 PHP 的 GD 扩展来输出 PNG 图片。绝大多数虚拟主机默认开启了 GD但自己用 Docker 或 LNMP 搭建的环境不一定装了所以先做检查php -v php -m | grep -i gd第一条命令确认 PHP 版本这条源码在 PHP 5.4 ~ 8.1 下都能运行但老版本的phpqrcode.php在 PHP 8.0 以上偶尔会有Deprecated警告建议优先用 PHP 7.4。第二条命令的grep -i gd忽略大小写匹配模块列表有gd字样就说明扩展存在。如果没装Debian/Ubuntu 系统执行apt install php7.4-gd后重启 php-fpm 即可宝塔面板则是在软件商店的 PHP 设置里勾选安装扩展里的 gd保存后自动重载。php-fpm 重启完再用php -m验证一次确认出现gd再继续部署。3.2 上传后的目录结构和权限下载解压后你会得到四个文件和一个目录部署到服务器上的标准结构如下/var/www/qrcode/ ├── index.php # 页面入口三合一展示逻辑 ├── phpqrcode.php # 二维码生成库 ├── 404.html # 兜底页面 ├── css/ │ └── style.css # 页面按钮与布局样式 └── cache/ # 二维码图片缓存首次生成后落盘index.php负责读取三个 URL 变量并调用phpqrcode.php生成二维码404.html在用户访问不存在路径时返回一个友好页面避免直接把 PHP 报错暴露给访客cache目录保存生成的 PNG 缓存。上传完成后需要调整权限PHP-FPM 进程要能读写cache目录否则生成图片时提示写文件失败chown -R www-data:www-data /var/www/qrcode chmod -R 755 /var/www/qrcode chmod 775 /var/www/qrcode/cachechown把目录归属权交给 web 服务用户Debian/Ubuntu 下通常是www-datachmod 755保证目录可读可执行cache目录单独给775是为了让 PHP 进程可以在其中创建新文件。这段操作在虚拟主机面板里通常对应文件管理器 → 权限设置勾选可写即可。3.3 Nginx 环境下的站点配置如果你用的是 Nginx一份可用的虚拟主机配置类似这样server { listen 80; server_name pay.example.com; root /var/www/qrcode; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ ^/cache/.*\.php$ { deny all; } }这段配置的核心逻辑try_files把不存在的路由全部交回index.php处理避免直接访问子路径时出 404fastcgi_pass里 socket 的路径要和实际 PHP 版本对应装了 PHP 7.4 就用php7.4-fpm.sock8.0 就改成php8.0-fpm.sock最后一段deny all禁止直接执行cache目录里的 PHP 文件防止别人往缓存目录传马后执行。Apache 用户更简单源码里自带的404.html可以直接用把目录指向public_html确保mod_rewrite开启即可虚拟主机一般默认支持。3.4 部署后的白屏、乱码与识别失败排查部署完打开域名最常见的三种现象及处理方式如下白屏优先在服务器上执行php -l index.php做语法检查有语法错误会直接输出行号同时用php -m确认 GD 已启用GD 缺失时imagepng()会被判定为未定义函数页面直接空白。二维码乱码用带 BOM 的编辑器比如 Windows 记事本保存过 PHP 文件BOM 字节会被当成输出内容发送给浏览器导致 PNG 图片流被污染。解决办法是用 VSCode 或 Notepad 把文件另存为 UTF-8 无 BOM 格式再重新上传。扫码提示无法识别的二维码格式优先检查三个 URL 变量是否填反了其次看二维码容错级别和尺寸设置是否过小这部分在下一章详说。4. phpqrcode.php 参数边界容错级别、尺寸与缓存策略4.1 QRcode::png 的函数签名phpqrcode.php这个库最核心的方法就是QRcode::png()理解它的五个参数基本就掌握了大半调优空间。签名如下QRcode::png($data, $outfile false, $level QR_ECLEVEL_L, $size 3, $margin 4);参数逐个展开$data二维码承载的内容也就是第 2 章替换进来的 URL 字符串$outfile输出文件路径填false时直接向浏览器输出 PNG 图片流$level容错级别常量QR_ECLEVEL_L/M/Q/H分别对应 7%、15%、25%、30% 的冗余数据量$size每个二维码模块的像素大小值越大图越大但不是总边长的直接尺寸$margin二维码四周的留白宽度以模块数为单位留白过小会导致扫码器把边缘杂色误判为二维码的一部分。4.2 收款码推荐容错级别与实测对比在实际使用里这份源码默认走的是 L 级还是 H 级取决于原作者在index.php里怎么调QRcode::png()。如果默认值偏低建议手动改成 H 级。不同的容错级别在同等内容下生成的二维码密度差别不小直接对比容错级别冗余占比推荐场景码点密度L7%白纸打印、大幅海报最稀疏M15%常规屏幕展示适中Q25%卡片、塑料材质较密H30%手机屏幕、弱光、反光环境最密收款码的实际使用场景是手机屏幕用户可能贴了防窥膜、屏幕亮度调得不高、甚至手抖导致对焦不稳定L 级会出现偶发扫不出的情况。这里有个反直觉的点H 级虽然码点最密、视觉上更复杂但冗余数据多只要图片尺寸和留白合适弱光下的成功率反而明显高于 L 级。我在自己的部署里统一用 H 级并配合margin 2来抵消密集感实际识别速度和 L 级无差别。4.3 对 size 和 margin 的取值建议size和margin直接决定图片物理大小。建议的调用方式require_once phpqrcode.php; $wx_url wxp://f2f0xxxxxxxxxxxxxxxxxxxx; QRcode::png($wx_url, /var/www/qrcode/cache/wx.png, QR_ECLEVEL_H, 8, 2);给size传 8 表示每个模块渲染成 8 像素margin传 2 表示左右各留 2 个模块的空白。这样生成的二维码在手机上大约 3 厘米见方扫码距离在 10 ~ 30 厘米之间最稳定。如果生成的二维码要放在公众号文章里展示建议size提到 10margin保持 2如果要印在门头海报上则由前端 CSS 拉伸放大只要原始 PNG 不小于 600 像素宽就行。4.4 用文件缓存避免每次刷新都重新编码phpqrcode.php编码一张二维码大约消耗几十毫秒 CPU单次访问没问题但如果页面被频繁打开每次刷新都重新算三张图就有点浪费。我一般会在index.php里加一段文件缓存逻辑$cache_file __DIR__ . /cache/wx.png; if (!file_exists($cache_file) || filemtime($cache_file) time() - 86400) { require_once phpqrcode.php; QRcode::png($wx_url, $cache_file, QR_ECLEVEL_H, 8, 2); } echo img src/cache/wx.png alt微信收款码 /;逻辑说明file_exists先判断缓存文件是否已生成filemtime拿到文件的最后修改时间戳time() - 86400表示 24 小时之前的时间点两个条件同时满足才重新生成二维码。也就是说同一张微信收款码 24 小时内只会被计算一次其余请求直接读取 PNG。这套缓存策略有一个很实用的特性需要更换收款码时只要删除cache目录下对应的 PNG下次访问就会用新 URL 自动重新生成无需改业务代码对接非技术出身的老板时特别好用。5. 接入公众号菜单、小程序 web-view 与收银台的三个验证点5.1 公众号菜单直接挂落地页部署完成并绑定域名后最直接的使用方式是把三合一页面配置到微信公众号的自定义菜单里。公众号后台 → 自定义菜单 → 添加跳转网页类型的菜单项URL 填https://pay.example.com/index.php。用户在微信内点击菜单页面加载后直接展示微信收款码长按图片即可识别转账。这个场景下要确认二维码的展示尺寸在手机端不小于 300x300 像素否则长按识别会提示无法识别。样式表style.css里对图片宽度做了响应式处理时才不会出问题建议打开 DevTools 切到 iPhone 12 模拟尺寸看一眼。5.2 小程序 web-view 的域名校验与协议限制如果想把三合一收款码塞进小程序页面用web-view组件是最快的路子但有一个前置条件在小程序管理后台的开发管理 → 开发设置 → 业务域名里把当前域名加入白名单同时页面必须走 HTTPS。这里有一个特别容易踩的细节小程序web-view内部无法拉起wxp://这类自定义协议直接点击跳转会没有任何反应所以页面在微信渠道上必须设计成展示二维码图片 引导长按识别而不是点击按钮直接拉起支付。也就是说三合一页面上三个按钮的交互逻辑要针对场景做区分支付宝和 QQ 渠道可以做成点击跳转链接微信渠道必须守成长按识别图片的交互形态。5.3 三端扫码跳转的闭环验证部署完成后用手机分别验证三条链路这一步不能省微信扫页面上微信码区域应直接进入微信转账收银台页面显示收款方头像和昵称支付宝扫支付宝码应打开qr.alipay.com对应的收款页面QQ 扫QQ 钱包码应在 QQ 内置浏览器里拉起 QQ 钱包收银台。验证时重点看两类问题。第一类是跳转目标错误比如微信扫出来是支付宝收银台说明三个变量填串了需要重新对比解码文本和变量对应关系第二类是能识别但页面空白多半是 404.html 或资源文件路径写错打开浏览器开发者工具看 Network 面板凡是返回 404 的 css/js 请求都要修掉。最后挑一个访问低峰期用新注册的小号转 0.01 元确认到账记录中显示的付款人备注是自己设置的名字整个三合一收款流程才算完整跑通。本文还有配套的精品资源点击获取
返回列表