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 对应的应用:
- 应用是否已经上线,或处于可以调用相关接口的状态。
- 是否已经签约并开通“当面付”产品。
- 应用公钥是否已经上传并生效。
- 后台填写的
APPID是否属于同一个应用。 - 当前使用的是正式环境还是沙箱环境。
正式环境通常使用:
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”面板,然后重新点击支付:
- 找到创建订单或生成二维码的 AJAX 请求。
- 查看 HTTP 状态码是否为
200。 - 检查响应中是否包含
qr_code、错误码或 PHP 报错。 - 查看 Console 中是否有 JavaScript 错误。
- 检查二维码容器是否被 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。
- 服务器时间偏差过大也可能导致请求失败。
建议的排查顺序
按以下顺序检查会更高效:
- 确认填写的是支付宝公钥,而不是应用公钥。
- 确认应用私钥与当前
APPID下的应用公钥配对。 - 确认主题配置和支付宝开放平台都使用 RSA2。
- 确认正式环境与沙箱环境没有混用。
- 确认应用已经开通当面付,并拥有
alipay.trade.precreate的调用权限。 - 查看 AJAX 响应和 WordPress 日志中的
sub_code、sub_msg。 - 检查 OpenSSL、cURL、服务器外网访问和系统时间。
- 如果接口已经返回
qr_code,再检查缓存、JavaScript 和 CSS。 - 更新到来源可靠,并且兼容当前 WordPress 和 PHP 环境的 RiPro 版本,同时确认支付模块没有经过二次修改。
如果日志中完全没有支付宝响应,问题更可能出在主题 AJAX、PHP 致命错误或服务器网络层。如果已经收到支付宝错误码,应先根据 sub_code 和 sub_msg 修正配置,而不是反复更换二维码插件。
备注:内容仅供参考。
