PAYATHON 2026

WordPress RiPro主题当面付支付二维码不显示

支付阿杰

结论

只填写“支付宝公钥”和“应用私钥”,不一定能正常生成二维码。RiPro 主题的当面付功能通常还需要正确配置 APPID、签名类型、密钥格式、支付宝应用权限和网关地址,服务器环境也必须满足要求。

常见原因包括:把应用公钥填成支付宝公钥、RSA2 密钥不匹配、应用没有开通当面付,或者主题调用支付宝接口后收到错误,但页面没有显示错误信息。

建议先查看支付宝接口的原始响应。拿到 code、sub_code 和 sub_msg 后,通常就能确定问题所在。

先检查密钥是否填对

支付宝开放平台中有两类容易混淆的公钥:

  • 应用公钥:由商户生成并上传到支付宝开放平台。
  • 支付宝公钥:由支付宝根据应用配置提供,用来验证支付宝返回的数据。

如果 RiPro 后台要求填写“支付宝公钥”,这里应填写开放平台中显示的支付宝公钥,不能使用应用公钥。

应用私钥必须与当前 APPID 下上传的应用公钥配对。如果重新生成了密钥,却只替换了其中一个,也会导致签名失败。

使用 RSA2 时,一般应满足以下配置:

sign_type = RSA2
密钥长度 = 2048 位
charset = UTF-8

密钥内容通常只保留 Base64 正文,不要带有多余空格、中文标点或换行。如果主题要求填写纯密钥,格式应类似:

MIIEvQIBADANBgkqhkiG9w0BAQEFAASC...

不要填写成:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASC...
-----END PRIVATE KEY-----

不过,不同 RiPro 版本或二次开发版本处理密钥的方式可能不同。如果源码会自动补充 PEM 头尾,就填写纯正文;如果源码直接把密钥交给 OpenSSL,则可能需要完整的 PEM 内容。具体应以当前主题支付模块的实现为准。

确认支付宝应用状态和产品权限

登录支付宝开放平台,检查当前 APPID 对应的应用:

  1. 应用是否已经上线,或处于可以调用相关接口的状态。
  2. 是否已经签约并开通“当面付”产品。
  3. 应用公钥是否已经上传并生效。
  4. 后台填写的 APPID 是否属于同一个应用。
  5. 当前使用的是正式环境还是沙箱环境。

正式环境通常使用:

https://openapi.alipay.com/gateway.do

沙箱环境通常使用:

https://openapi-sandbox.dl.alipaydev.com/gateway.do

沙箱的 APPID、密钥和网关不能与正式环境混用,否则可能出现应用不存在、签名校验失败或没有接口权限等错误。

获取支付宝接口的真实错误信息

二维码不显示,问题不一定出在二维码组件。RiPro 通常会先调用当面付预下单接口,取得 qr_code 字段,再根据该地址绘制二维码。如果预下单失败,前端就没有可供显示的内容。

当面付常用的接口名称是:

alipay.trade.precreate

成功响应通常包含:

{
  "alipay_trade_precreate_response": {
    "code": "10000",
    "msg": "Success",
    "out_trade_no": "ORDER_123456",
    "qr_code": "https://qr.alipay.com/..."
  },
  "sign": "..."
}

如果 code 不是 10000,重点查看以下字段:

code
msg
sub_code
sub_msg

常见错误包括:

  • isv.invalid-signature:签名错误,通常与私钥、签名类型或待签名参数有关。
  • isv.missing-signature-config:应用没有正确配置签名公钥。
  • isv.invalid-app-id:APPID 不正确,或正式环境与沙箱环境混用。
  • isv.insufficient-isv-permissions:应用没有相应的接口权限。
  • 业务参数错误:订单号、金额、标题或 JSON 参数格式不符合要求。

具体错误码应结合接口的实际返回信息和支付宝开放平台文档判断。

如果主题隐藏了接口错误,可以在 WordPress 中临时启用日志。编辑 wp-config.php,在“停止编辑”注释之前加入:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

然后重新发起一次支付,并检查:

wp-content/debug.log

也可以在支付请求取得响应后,临时记录返回数据:

error_log('Alipay response: ' . print_r($response, true));

排查结束后建议关闭调试,避免日志持续增长或写入敏感信息:

define('WP_DEBUG', false);

不要在网页、论坛或工单中公开应用私钥、完整签名、用户身份信息或支付参数。

检查 PHP 和服务器环境

支付宝签名依赖 OpenSSL。至少需要确认服务器已经启用相关扩展:

<?php
var_dump(extension_loaded('openssl'));
var_dump(extension_loaded('curl'));

正常情况下应返回:

bool(true)
bool(true)

还需要检查:

  • 服务器能否通过 HTTPS 访问支付宝网关。
  • PHP 是否允许发起外部网络请求。
  • DNS、证书链和系统时间是否正常。
  • 防火墙、安全插件或主机商策略是否拦截了请求。
  • PHP 版本是否兼容当前 RiPro 支付模块及其支付宝 SDK。

可以使用 WordPress HTTP API 做一次只验证连通性的测试:

$response = wp_remote_get(
    'https://openapi.alipay.com/gateway.do',
    [
        'timeout' => 15,
    ]
);

if (is_wp_error($response)) {
    error_log($response->get_error_message());
} else {
    error_log('HTTP status: ' . wp_remote_retrieve_response_code($response));
}

这个测试只能确认服务器是否可以访问支付宝网关,不能证明签名和业务参数正确。

检查浏览器端是否收到二维码数据

打开浏览器开发者工具,进入“网络”或“Network”面板,然后重新点击支付:

  1. 找到创建订单或生成二维码的 AJAX 请求。
  2. 查看 HTTP 状态码是否为 200。
  3. 检查响应中是否包含 qr_code、错误码或 PHP 报错。
  4. 查看 Console 中是否有 JavaScript 错误。
  5. 检查二维码容器是否被 CSS 隐藏。

如果接口已经返回 qr_code,但页面仍然没有显示二维码,问题通常出在前端:

  • 二维码 JavaScript 库没有加载。
  • 文件经过缓存、压缩或合并插件处理后报错。
  • AJAX 返回格式与主题脚本预期的格式不一致。
  • 弹窗层级有误,或 CSS 设置了 display: none。
  • CDN、安全插件或内容安全策略拦截了相关脚本。

可以暂时关闭 JavaScript 合并、延迟加载、页面缓存和 CDN 缓存,再用无痕窗口测试。先确认支付宝是否返回了二维码数据,以及前端是否完成绘制,不要一开始就修改主题文件。

检查订单参数

即使签名正确,订单参数异常也可能导致预下单失败。至少应确认以下内容:

{
  "out_trade_no": "ORDER_202609090001",
  "total_amount": "0.01",
  "subject": "测试订单"
}

需要注意:

  • out_trade_no 在商户系统中应保持唯一,重复测试时需要生成新的订单号。
  • total_amount 必须使用合法的金额格式,不能是负数或空值。
  • subject 不能为空,也不要包含无法正确编码的内容。
  • JSON 参数必须正确编码,不能通过手工拼接生成无效 JSON。
  • 服务器时间偏差过大也可能导致请求失败。

建议的排查顺序

按以下顺序检查会更高效:

  1. 确认填写的是支付宝公钥,而不是应用公钥。
  2. 确认应用私钥与当前 APPID 下的应用公钥配对。
  3. 确认主题配置和支付宝开放平台都使用 RSA2。
  4. 确认正式环境与沙箱环境没有混用。
  5. 确认应用已经开通当面付,并拥有 alipay.trade.precreate 的调用权限。
  6. 查看 AJAX 响应和 WordPress 日志中的 sub_code、sub_msg。
  7. 检查 OpenSSL、cURL、服务器外网访问和系统时间。
  8. 如果接口已经返回 qr_code,再检查缓存、JavaScript 和 CSS。
  9. 更新到来源可靠,并且兼容当前 WordPress 和 PHP 环境的 RiPro 版本,同时确认支付模块没有经过二次修改。

如果日志中完全没有支付宝响应,问题更可能出在主题 AJAX、PHP 致命错误或服务器网络层。如果已经收到支付宝错误码,应先根据 sub_code 和 sub_msg 修正配置,而不是反复更换二维码插件。

备注:内容仅供参考。