WordPress RiPro主题当面付二维码不显示是什么原因?
明确结论
RiPro 主题不显示当面付二维码,问题通常不在二维码组件,而在于支付宝 alipay.trade.precreate 请求失败,未能返回 qr_code。
常见原因包括:
- 把“应用公钥”填进了“支付宝公钥”配置项。
- 应用私钥与支付宝开放平台中的应用公钥不属于同一密钥对。
- 应用尚未上线、没有开通当面付,或者使用了错误的应用环境。
- 密钥格式、签名方式或证书模式不一致。
- 服务器无法访问支付宝接口,或者 PHP 缺少 OpenSSL、cURL 扩展。
- RiPro 支付接口已经报错,但错误被主题、缓存或前端脚本隐藏。
排查时应先查看支付宝接口的原始响应,不必反复更换二维码插件。
先确认密钥没有填反
支付宝开放平台中有三个容易混淆的密钥概念:
应用私钥:保存在网站服务器上,用于生成请求签名。应用公钥:上传到支付宝开放平台,与应用私钥配对。支付宝公钥:由支付宝提供,网站用它验证支付宝返回的数据。
如果 RiPro 配置项写的是“支付宝公钥”,就必须填写支付宝开放平台显示的支付宝公钥,不能填写自己生成的应用公钥。
还要确认下面这些配置属于同一个支付宝应用:
APPID- 应用私钥
- 上传到开放平台的应用公钥
- 支付宝公钥
重新生成密钥后,需要同时更新网站中的应用私钥和开放平台中的应用公钥。
检查密钥格式
有些 RiPro 版本要求填写去掉头尾标记的单行密钥,另一些版本或 SDK 可以直接读取 PEM 格式。应以当前主题后台的字段说明和实际调用代码为准。
标准 RSA 私钥通常类似:
-----BEGIN PRIVATE KEY-----
MIIE...
-----END PRIVATE KEY-----
部分旧版 SDK 使用:
-----BEGIN RSA PRIVATE KEY-----
MIIE...
-----END RSA PRIVATE KEY-----
RSA2 私钥、证书文件和普通公钥模式不能混用。复制密钥时还要检查:
- 前后是否有空格。
- 是否混入中文引号。
- 密钥中间是否缺少字符。
- 是否把换行保存成了字面量
\n。 - 是否误用了其他应用或沙箱环境的密钥。
可以用 PHP 检查私钥能否被 OpenSSL 识别:
<?php
$privateKey = <<<KEY
-----BEGIN PRIVATE KEY-----
在这里放入私钥,仅用于本地排查
-----END PRIVATE KEY-----
KEY;
$key = openssl_pkey_get_private($privateKey);
if ($key === false) {
while ($message = openssl_error_string()) {
echo $message . PHP_EOL;
}
} else {
echo 'Private key is valid.' . PHP_EOL;
}
不要把真实私钥放在公开页面、工单、日志或截图里。
核对支付宝应用状态
登录支付宝开放平台,检查对应的 APPID:
- 应用是否已经创建并上线。
- 是否已经签约并开通当面付。
- 应用公钥是否已经上传并生效。
- 开放平台显示的签名方式是否与 RiPro 一致,通常应为
RSA2。 - 网站连接的是正式环境还是沙箱环境。
- 收款支付宝账号是否与应用主体及签约信息匹配。
正式环境和沙箱环境的应用配置不能混用。如果使用证书模式,还需要应用公钥证书、支付宝公钥证书和支付宝根证书,只填写字符串形式的支付宝公钥通常不够。
查看接口的真实错误
正常情况下,网站会先请求:
alipay.trade.precreate
请求成功后,接口会返回类似结构:
{
"alipay_trade_precreate_response": {
"code": "10000",
"msg": "Success",
"out_trade_no": "ORDER_202609090001",
"qr_code": "https://qr.alipay.com/..."
},
"sign": "..."
}
只有 code 为 10000,并且响应中存在 qr_code,前端才能生成支付二维码。如果响应中没有 qr_code,需要记录以下字段:
code
msg
sub_code
sub_msg
常见错误包括:
isv.invalid-signature:私钥、公钥或签名算法不匹配。isv.invalid-app-id:APPID错误或应用环境不一致。- 权限或产品未开通:应用没有当面付调用权限。
- 请求参数错误:订单号、金额、编码或必填参数不符合要求。
错误码会因接口和应用状态而异,判断时应以支付宝实际返回的 sub_code 和 sub_msg 为准。
可以临时开启 WordPress 调试日志:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
这些配置应放在 wp-config.php 的停止编辑提示之前。排查结束后建议关闭调试,并删除日志中的订单、用户和支付信息。
如果主题没有显示异常,可以在支付请求处临时记录脱敏后的响应:
error_log(
'Alipay precreate response: ' .
wp_json_encode($response, JSON_UNESCAPED_UNICODE)
);
日志中不要写入应用私钥、完整签名、买家身份信息或其他敏感数据。
检查服务器环境和网络
先确认 PHP 已经启用所需扩展:
<?php
foreach (['openssl', 'curl', 'json', 'mbstring'] as $extension) {
printf(
"%s: %s\n",
$extension,
extension_loaded($extension) ? 'enabled' : 'missing'
);
}
还需要检查:
- 服务器时间是否准确。
- DNS 能否正常解析支付宝网关。
- 防火墙或主机安全策略是否拦截外部 HTTPS 请求。
- CA 证书是否过期。
- PHP 能否建立 TLS 连接。
- 安全插件是否拦截支付 AJAX 或 REST 请求。
不要把关闭 SSL 证书校验当作连接错误的长期解决办法,这会降低支付请求的安全性。应更新服务器 CA 证书或修复 TLS 配置。
排查前端和缓存问题
如果接口已经返回 qr_code,但页面仍然空白,再打开浏览器开发者工具检查:
Console中是否有 JavaScript 错误。Network中创建支付订单的 AJAX 请求是否返回403、404、500或 HTML 页面。- 返回内容是否被缓存插件、CDN 或 Web 应用防火墙改写。
- 二维码脚本是否加载失败。
- 当前 RiPro 子主题或二次开发代码是否覆盖了支付模板。
不要缓存支付下单接口、订单状态轮询接口和回调地址。清理主题缓存、WordPress 缓存、对象缓存及 CDN 缓存后,再用无痕窗口测试。
建议的排查顺序
- 确认配置项里填写的是“支付宝公钥”,不是“应用公钥”。
- 确认
APPID、应用私钥和开放平台应用公钥属于同一个应用。 - 核对
RSA2、普通公钥模式或证书模式是否一致。 - 检查应用上线状态和当面付签约状态。
- 查看
alipay.trade.precreate的完整响应。 - 根据
sub_code和sub_msg判断支付宝侧的错误。 - 检查 PHP 扩展、服务器时间、TLS 和网络连接。
- 确认接口返回
qr_code后,再检查 AJAX、JavaScript、缓存和主题兼容问题。 - 备份后更新 RiPro 主题及其支付组件,并确认授权版本支持当前支付宝接口。
如果后台只有“二维码生成失败”一类的通用提示,下一步应取得预下单接口的原始响应。缺少 sub_code 和 sub_msg 时,很难判断问题出在密钥、接口权限还是服务器环境。
备注:内容仅供参考。
