PAYATHON 2026

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:

  1. 应用是否已经创建并上线。
  2. 是否已经签约并开通当面付。
  3. 应用公钥是否已经上传并生效。
  4. 开放平台显示的签名方式是否与 RiPro 一致,通常应为 RSA2。
  5. 网站连接的是正式环境还是沙箱环境。
  6. 收款支付宝账号是否与应用主体及签约信息匹配。

正式环境和沙箱环境的应用配置不能混用。如果使用证书模式,还需要应用公钥证书、支付宝公钥证书和支付宝根证书,只填写字符串形式的支付宝公钥通常不够。

查看接口的真实错误

正常情况下,网站会先请求:

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 缓存后,再用无痕窗口测试。

建议的排查顺序

  1. 确认配置项里填写的是“支付宝公钥”,不是“应用公钥”。
  2. 确认 APPID、应用私钥和开放平台应用公钥属于同一个应用。
  3. 核对 RSA2、普通公钥模式或证书模式是否一致。
  4. 检查应用上线状态和当面付签约状态。
  5. 查看 alipay.trade.precreate 的完整响应。
  6. 根据 sub_code 和 sub_msg 判断支付宝侧的错误。
  7. 检查 PHP 扩展、服务器时间、TLS 和网络连接。
  8. 确认接口返回 qr_code 后,再检查 AJAX、JavaScript、缓存和主题兼容问题。
  9. 备份后更新 RiPro 主题及其支付组件,并确认授权版本支持当前支付宝接口。

如果后台只有“二维码生成失败”一类的通用提示,下一步应取得预下单接口的原始响应。缺少 sub_code 和 sub_msg 时,很难判断问题出在密钥、接口权限还是服务器环境。

备注:内容仅供参考。