You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP生成无效HMAC签名:MoonPay集成异常排查

MoonPay集成:签名无效+URL乱码问题解决方案

问题分析

你遇到的两个核心问题:

  1. URL中的奇怪字符¤:这是&currencyCode被浏览器解析为HTML实体¤(对应符号¤)导致的,本质是输出编码或HTML转义问题。
  2. 无效HMAC签名:大概率是签名生成逻辑的细节偏差、参数顺序错误,或服务器环境编码干扰导致。

解决方案

一、修复URL乱码问题

乱码是因为PHP输出的URL未做HTML转义,浏览器将&cur识别为实体符号。直接修改输出逻辑即可:

<?php
// 强制设置输出编码为UTF-8
header('Content-Type: text/html; charset=utf-8');

$host = 'https://buy.moonpay.com';
$query = '?apiKey=pk_live_你的真实密钥&currencyCode=eth&walletAddress=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae';
$secretKey = 'sk_live_你的真实密钥';

$signature = base64_encode(hash_hmac('sha256', $query, $secretKey, true));
$finalUrl = $host . $query . "&signature=" . urlencode($signature);

// 用htmlspecialchars转义输出,避免HTML实体解析
echo htmlspecialchars($finalUrl);
?>

另外可以检查服务器php.ini的default_charset配置,确保值为UTF-8,从根源避免编码问题。

二、修复无效签名问题

HMAC签名对输入的一致性要求极高,按以下步骤排查:

  1. 严格遵循参数顺序:MoonPay的签名是基于完整query字符串的哈希,参数顺序必须和官方示例完全一致(apiKey→currencyCode→walletAddress),不能调换顺序。
  2. 确认密钥正确性:测试环境用测试密钥,生产环境用生产密钥,绝对不能混用;确保密钥没有多余空格或字符。
  3. 验证hash_hmac参数:第四个参数必须设为true(返回原始二进制数据),如果设为false会返回十六进制字符串,再base64编码就会生成错误签名。
  4. 排除WordPress干扰:在WordPress环境下,部分插件/主题可能会过滤输出内容。先在纯PHP文件中测试代码,确认签名正常后,再移植到WordPress中,逐步排查插件影响。

额外排查步骤

  • 本地测试:在本地PHP环境运行代码,对比服务器生成的签名,确认是否是服务器环境差异导致。
  • 签名验证:用MoonPay后台提供的签名校验工具(如果有),输入你的query字符串和密钥,对比自己生成的签名是否一致。

内容的提问来源于stack exchange,提问作者user3509046

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:25:29