php - Binance Pay:PHP cURL 出现“此请求的签名无效”错误
问题描述
我正在使用 PHP cURL 连接到 Binance Pay API。我收到以下错误:
{"status":"FAIL","code":"400002","errorMessage":"Signature for this request is not valid."}
这是我的代码:
// Generate nonce string
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$nonce = '';
for($i=1; $i <= 32; $i++)
{
$pos = mt_rand(0, strlen($chars) - 1);
$char = $chars[$pos];
$nonce .= $char;
}
$ch = curl_init();
$timestamp = round(microtime(true) * 1000);
// Request body
$request = array(
"merchantTradeNo" => "12485634875fJhdd56",
"totalFee" => 15,
"productDetail" => "productDetail",
"currency" => "BUSD",
"returnUrl" => "",
"tradeType" => "WEB",
"productType" => "productType",
"productName" => "ProductName"
);
$json_request = json_encode($request);
$payload = $timestamp."\n".$nonce."\n".$json_request."\n";
$signature = strtoupper(hash_hmac('SHA512',$payload,$binance_pay_secret));
$headers = array();
$headers[] = "Content-Type: application/json";
$headers[] = "BinancePay-Timestamp: $timestamp";
$headers[] = "BinancePay-Nonce: $nonce";
$headers[] = "BinancePay-Certificate-SN: $binance_pay";
$headers[] = "BinancePay-Signature: $signature";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, "https://bpay.binanceapi.com/binancepay/openapi/order");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$result = curl_exec($ch);
if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); }
curl_close ($ch);
关于文档,一切似乎都很好,但事实并非如此,所以有问题。任何想法?谢谢!
解决方案
在 python 中(很可能在 PHP 中也是如此),json 编码通过添加空格和/或转义引号来稍微修改请求 json。Binance Pay API 要求 json 字符串与文档中的内容完全相同。也就是说,没有多余的空格。
推荐阅读
- android - Android后台计划任务不起作用
- java - 使用 Google 登录的 Firebase 身份验证中没有用户记录
- java - 我应该让我的 REST 客户端 API 库异步(Java 8)
- c++ - 无法使用文件处理创建和打开文件
- javascript - 如何将 php 变量传递给 .js 文件以创建函数 Chart
- javascript - PayPal Button API onApprove 调用了两次
- mongodb - 数组上的 MongoDB 分页 - 检查 $slice 是否到达数组的开头
- laravel - 添加自定义列以选择
- nginx - 在 Nginx 中根据主机更改静态根目录
- django - 期间内每天的总点赞数