集成Billdesk支付网关时出现Invalid merchant details (ERRP004)错误如何解决
Billdesk UAT报错ERRP004(Invalid merchant details)原因及解决方案(Node.js/Express环境)
抱歉,我们目前无法处理您的请求 - Invalid merchant details (ERRP004)
常见触发原因
- 商户基础信息配置错误:UAT环境和生产环境的
merchant_id、secret_key、currency、return_url参数不匹配,Billdesk UAT环境会强制校验所有注册时报备的字段,哪怕差一个字符都会触发该报错 - 管道分隔消息的字段顺序/缺失错误:即便字段内容正确,和官方文档要求的字段顺序不一致、多传/漏传必填字段,都会被判定为商户信息无效
- HMACSHA256校验和生成逻辑错误:密钥编码格式、消息拼接顺序、哈希输出的大小写/编码格式(比如要求hex却输出了base64)不匹配,会导致Billdesk侧解析消息时判定身份无效
- EJS表单提交的参数格式错误:
msg字段未做URL编码、表单提交的action地址错用生产地址而非UAT地址、请求头的Content-Type不符合Billdesk要求 - UAT环境IP白名单未配置:Billdesk UAT环境会校验请求来源IP,未提前报备的服务器IP发起的请求会直接返回该错误
对应解决方案
- 核对基础配置:单独拎出所有商户配置常量,和Billdesk对接人提供的UAT参数逐一对比,注意
secret_key区分大小写,UAT的return_url必须和报备的完全一致,包括路径、参数、http/https协议头 - 校验管道分隔消息格式:按照官方文档的字段顺序写死拼接逻辑,不要用对象遍历拼接避免顺序错乱,示例代码如下:
// 严格按照官方文档顺序拼接,不要随意调整字段顺序 const msgFields = [ merchantId, customerId, txnAmount, orderId, currency, returnUrl, // 剩余必填字段按官方文档要求顺序补充 ]; const rawMsg = msgFields.join('|');
- 修正HMACSHA256生成逻辑:Node.js环境下使用内置
crypto模块生成校验和,确保密钥和消息都用utf-8编码,输出hex格式字符串后再追加到消息末尾,示例代码:
const crypto = require('crypto'); const checksum = crypto.createHmac('sha256', Buffer.from(secretKey, 'utf8')) .update(Buffer.from(rawMsg, 'utf8')) .digest('hex') .toLowerCase(); // 可根据Billdesk要求调整为toUpperCase() const finalMsg = `${rawMsg}|${checksum}`;
- 修正EJS表单提交逻辑:提交前对
msg参数做URL编码,表单action明确写UAT地址,确保表单自动提交逻辑无异常,示例EJS代码:
<form method="post" action="<%= billdeskUatUrl %>" id="billdeskForm"> <input type="hidden" name="msg" value="<%= encodeURIComponent(finalMsg) %>"> </form> <script> window.onload = () => document.getElementById('billdeskForm').submit(); </script>
- 确认IP白名单:将你UAT环境服务器的出口IP提供给Billdesk对接人,确认已加入白名单后再发起测试
内容的提问来源于stack exchange,提问作者Roh1
相关产品推荐
相关产品推荐

