使用PHP+CCXT对接Lbank时遭遇PermissionDenied权限错误求助
问题描述
使用PHP结合CCXT开发Lbank交易机器人时,公共API(获取订单簿、计算市场价)调用正常,但调用需权限验证的API时出现异常:
fetch_balance()返回空数组create_order()抛出ccxt\PermissionDenied: Invalid authorization错误
代码步骤回顾
- 依赖引入与初始化
require 'vendor/autoload.php'; use ccxt\lbank;
- 交易所实例与API配置
date_default_timezone_set('UTC'); $id = 'lbank'; $exchange_class = "\\ccxt\\$id"; $exchange = new $exchange_class(array( 'apiKey' => '3462cef5-7db0-4cb6-bb93-74dc084d9fe9', 'secret' => 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ+uWjcvKa1K4NtemmT7LmgoW1s2DYr+d/JIk3UU2dFUT/xPY9fNR6aiJ8SNd/d5WPN7z7TIO+TuOwmeo0GpjzGyRG1a1dmbmxxqR3H5o4a/gd2dJo/Dqf8WX/eLzDVjLGC3pXyWe8jeIRzYYvtbgkiQNu5xTRfYZ4I0roTp/EvfAgMBAAECgYEAnsjQewmSBvlriZiULRA9QGPJHHUumGWcvrd+sjFOu8J8WyhS31gJBOFAbEpE3jizxEL88wcdz/M5j8JJE1VZxnYonO2ev9wS3Ls7UHkRVFx2gzxWxhuDrtvbiSHetDJ08N7sRbW3H5PmzDufTNLCgB4hgAr0vluzM83fXq3HK9ECQQD2sXkc+LM6UfwvIdxm0gztisfD2ZQzMoXcGlqgjYfXsbDGUHPkzZ3NWOBa36CiTFdQBF2COX0Ew+A3pTl9a4w5AkEApbSHSW8PEw0/lgDKHsRNgaUQkOAlFrUhPplsE9ICsWLkgNGXoJnZpQhkVDSaYWi/NNKkPk1lXIxYGQhBYgXI1wJAIFh6ydquHVp8l214KZ8nBMpqkPppXSElvgtSkLSd+CEbTZVk7L4tD6y0lhW2STF7TUmVPSrugn5wWrt2Q0SjuQJBAJJiC41krdVvw7dY1TUexzV7Q0ooqLsJoeeyExbjVHut2BywixlWMD2pTzBQE/1vUlJwrqVXK+75EC5064WThJsCQCaDTNXNfcMRRQZFePVm0wTEU4ajG++UyRI/I47uzl+8RV2cuNyRoj7xa7LTnBYc8sOPcYTgF/9zBhkwZEBRtUk=', ));
- 公共API调用正常
$markets=$exchange->loadMarkets(); $symbol = 'BTC/USDT'; $orderbook = $exchange->fetch_order_book ($symbol); $bid = count ($orderbook['bids']) ? $orderbook['bids'][0][0] : null; $ask = count ($orderbook['asks']) ? $orderbook['asks'][0][0] : null; $marketprice = ($bid + $ask)/2; print($marketprice); // 输出99336.605
- 权限API异常输出
99336.605 Array ( ) test Fatal error: Uncaught ccxt\PermissionDenied: Invalid authorization in /home/robatixi/domains/robatix.ir/public_html/vendor/ccxt/ccxt/php/lbank.php:2995 Stack trace: #0 /home/robatixi/domains/robatix.ir/public_html/vendor/ccxt/ccxt/php/Exchange.php(1610): ccxt\lbank->handle_errors() #1 /home/robatixi/domains/robatix.ir/public_html/vendor/ccxt/ccxt/php/Exchange.php(5168): ccxt\Exchange->fetch() #2 /home/robatixi/domains/robatix.ir/public_html/vendor/ccxt/ccxt/php/Exchange.php(5188): ccxt\Exchange->fetch2() #3 /home/robatixi/domains/robatix.ir/public_html/vendor/ccxt/ccxt/php/abstract/lbank.php(317): ccxt\Exchange->request() #4 /home/robatixi/domains/robatix.ir/public_html/vendor/ccxt/ccxt/php/lbank.php(1500): ccxt\abstract\lbank->spotPrivatePostSupplementCreateOrder() #5 /home/robatixi/domains/robatix.ir/public_html/samplecallapi.php(63): ccxt\lbank->create_order() #6 {main} thrown in /home/robatixi/domains/robatix.ir/public_html/vendor/ccxt/ccxt/php/lbank.php on line 2995
解决方案
1. 验证API密钥与Secret正确性
- 登录Lbank后台,检查API密钥是否完整复制,无多余空格、换行符。
- 确认Secret为原始字符串,不要做任何编码或转义,Lbank签名验证需要未修改的Secret。
- 检查API密钥状态:是否启用、是否被冻结,若异常则重新生成密钥。
2. 确认API权限配置
- 在Lbank API管理页面,确保该密钥开启了读取余额和下单交易权限(部分交易所默认仅开启只读权限)。
- 测试时可先开启只读权限验证
fetch_balance(),正常后再添加交易权限。
3. 简化CCXT实例初始化代码
代码中重复创建多个Lbank实例可能导致配置混乱,简化为:
require 'vendor/autoload.php'; date_default_timezone_set('UTC'); $exchange = new \ccxt\lbank([ 'apiKey' => '你的API密钥', 'secret' => '你的Secret', ]);
确保配置参数传递给最终使用的实例。
4. 检查时区与时间同步
- Lbank API签名依赖UTC时间,确保
date_default_timezone_set('UTC')在实例化前执行,且服务器时间与UTC时间误差不超过5分钟(否则签名失效)。 - 可添加代码验证当前UTC时间:
echo gmdate('Y-m-d H:i:s'); // 输出UTC时间,对比Lbank服务器时间
5. 开启CCXT调试模式排查请求
开启调试模式查看请求细节,定位签名或参数问题:
$exchange->verbose = true; // 开启调试 $balance = $exchange->fetch_balance(); print_r($balance);
对比Lbank官方API文档,检查请求头、签名参数是否符合要求。
6. 更新CCXT版本
- 旧版本CCXT可能存在Lbank API适配问题,执行命令更新到最新版:
composer update ccxt/ccxt
- 若更新后问题依旧,可查看CCXT仓库确认是否有针对Lbank的已知修复。
内容的提问来源于stack exchange,提问作者Eng.Ali karimifard
相关产品推荐
相关产品推荐

