如何通过 Payeer payment API 显示钱包余额?
结论
这段调用流程没有明显问题。最常见的原因是 PHP 短标签 <? 未启用,代码实际上并未执行。先改用标准的 <?php,然后确认 cpayeer.php 路径无误、API 凭据有效,并分别查看认证错误和 getBalance() 的返回结果。
示例中的账号和 API 凭据已经出现在公开内容中。请立即前往 Payeer 后台撤销或更换相关密钥,不要继续使用原有凭据。
建议修改后的代码
<?php
require_once __DIR__ . '/cpayeer.php';
$accountNumber = 'PXXXXXXXXXX';
$apiId = 'YOUR_API_ID';
$apiKey = 'YOUR_API_KEY';
$payeer = new CPayeer($accountNumber, $apiId, $apiKey);
if (!$payeer->isAuth()) {
echo '<pre>';
print_r($payeer->getErrors());
echo '</pre>';
exit;
}
$balance = $payeer->getBalance();
if ($balance === false || $balance === null) {
echo '<pre>';
print_r($payeer->getErrors());
echo '</pre>';
exit;
}
echo '<pre>';
print_r($balance);
echo '</pre>';
这段代码主要做了两处调整:
- 将短标签改为完整的
<?php,防止服务器禁用short_open_tag后代码无法执行。 - 通过
__DIR__ . '/cpayeer.php'加载文件,避免当前工作目录不同而导致加载失败。
按顺序排查
1. 确认 PHP 正在执行
创建一个最小测试页面:
<?php
echo 'PHP is running';
如果浏览器没有显示这段文字,或者直接显示了 PHP 源码,说明 Web 服务器尚未正确处理 PHP。这个问题与 Payeer API 无关。
2. 在开发环境中打开错误报告
页面空白通常是因为 PHP 错误被隐藏了。可以在开发或排查环境中临时加入:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
require_once __DIR__ . '/cpayeer.php';
如果出现 Failed opening required,说明 cpayeer.php 不在预期目录。如果提示类不存在,则要检查 SDK 文件是否完整,以及文件中是否确实定义了 CPayeer。
不要在生产环境中长期启用 display_errors,否则错误信息可能暴露服务器路径或其他敏感数据。
3. 检查 API 凭据
$accountNumber、$apiId 和 $apiKey 必须来自同一个 Payeer API 配置,不能混用:
$accountNumber = 'PXXXXXXXXXX';
$apiId = 'YOUR_API_ID';
$apiKey = 'YOUR_API_KEY';
复制凭据后,还要逐项检查:
- 是否包含前后空格;
- API 配置是否仍处于启用状态;
- 密钥是否已经重置;
- 后台是否设置了 IP 白名单;
- 当前服务器的公网 IP 是否在允许范围内;
- 当前账户或 API 权限是否允许查询余额。
具体字段名称和权限规则可能因 Payeer 接口及 SDK 版本而异,请以账户后台和对应版本的 SDK 文档为准。
4. 不要只检查 isAuth()
认证成功不等于余额请求一定成功。网络异常、接口响应格式变化或权限限制都可能导致 getBalance() 失败,所以调用后仍需检查并输出错误:
$balance = $payeer->getBalance();
if ($balance === false || $balance === null) {
print_r($payeer->getErrors());
} else {
print_r($balance);
}
不要用 if (!$balance) 判断请求是否失败,因为某些合法的空数据结构也会被 PHP 视为假值。
5. 检查服务器能否访问接口
如果代码和凭据都没有问题,还要确认服务器能够发起 HTTPS 请求。常见原因包括:
- PHP cURL 扩展未安装或未启用;
- DNS 无法解析接口域名;
- 防火墙阻止出站 HTTPS 请求;
- CA 证书过旧,导致 TLS 验证失败;
- 主机时间不准确;
cpayeer.php版本过旧或已经不兼容。
可以用下面的代码检查扩展是否已经加载:
<?php
var_dump(extension_loaded('curl'));
var_dump(OPENSSL_VERSION_TEXT);
不要关闭 SSL 证书验证来绕过 TLS 错误。正确的处理方式是更新系统 CA 证书、PHP、cURL、OpenSSL 或相关服务器配置。
只显示某一种货币
getBalance() 通常返回数组,不能当作普通字符串直接输出。不同 CPayeer 实现或接口版本的返回结构可能不同,因此应先查看实际结果:
echo '<pre>';
print_r($balance);
echo '</pre>';
确认数组结构后,再读取目标币种。例如,如果实际结果中存在 balance['USD']['DOSTUPNO'],可以这样处理:
if (isset($balance['balance']['USD']['DOSTUPNO'])) {
echo htmlspecialchars(
(string) $balance['balance']['USD']['DOSTUPNO'],
ENT_QUOTES,
'UTF-8'
);
} else {
echo '未在 API 响应中找到 USD 可用余额';
}
这里的数组路径只是条件示例。在查看真实响应之前,不能直接认定它适用于当前 SDK。
安全注意事项
不要将 API 密钥硬编码到公开可访问的源码仓库中。更稳妥的做法是从环境变量读取:
$accountNumber = getenv('PAYEER_ACCOUNT');
$apiId = getenv('PAYEER_API_ID');
$apiKey = getenv('PAYEER_API_KEY');
生产页面也不应直接向访客输出完整的 getErrors() 或原始 API 响应。排查结束后,应将这些信息写入受保护的服务器日志,页面只返回简短的错误提示。
备注:内容仅供参考。
