Appearance
错误码参考
全局错误码
| 错误码 | 说明 | 处理建议 |
|---|---|---|
| 0000 | 成功 | - |
| 1001 | 参数错误 | 检查请求参数是否完整、格式是否正确 |
| 1002 | 签名验证失败 | 检查签名算法、密钥是否正确 |
| 1003 | 商户号不存在 | 确认商户号是否正确 |
| 1004 | 商户未开通该支付渠道 | 联系平台开通相应渠道 |
| 1005 | 订单号重复 | 更换唯一的订单号 |
| 1006 | 订单金额错误 | 确认金额为正整数,单位:分 |
| 1007 | 时间戳过期 | 检查服务器时间是否同步 |
| 1008 | 支付渠道错误 | 检查 channel 参数是否正确 |
| 1009 | openid 无效 | 确认 openid 是否正确 |
| 1010 | 系统繁忙 | 稍后重试或联系客服 |
支付接口错误码
| 错误码 | 说明 | 处理建议 |
|---|---|---|
| 2001 | 订单创建失败 | 检查参数后重试 |
| 2002 | 支付渠道异常 | 联系平台处理 |
| 2003 | 订单已支付 | 无需重复支付 |
| 2004 | 订单已关闭 | 重新创建订单 |
| 2005 | 订单已过期 | 重新创建订单 |
退款接口错误码
| 错误码 | 说明 | 处理建议 |
|---|---|---|
| 4001 | 订单不存在 | 检查订单号 |
| 4002 | 订单未支付 | 只能退款已支付订单 |
| 4003 | 退款金额超限 | 退款金额超过订单金额 |
| 4004 | 退款单号重复 | 更换退款单号 |
| 4005 | 退款失败 | 联系平台处理 |
查询接口错误码
| 错误码 | 说明 | 处理建议 |
|---|---|---|
| 3001 | 订单不存在 | 检查订单号是否正确 |
| 3002 | 订单不属于该商户 | 确认商户号是否正确 |
| 5001 | 退款订单不存在 | 检查退款单号是否正确 |
| 5002 | 退款不属于该商户 | 确认商户号是否正确 |
常见错误处理
签名验证失败 (1002)
可能原因:
- 私钥与公钥不匹配
- 参数排序错误
- 拼接格式错误
- 字符编码不是 UTF-8
解决方法:
javascript
// 正确的签名流程
const sortedKeys = Object.keys(params)
.filter(key => key !== 'sign' && params[key] !== null)
.sort();
const signString = sortedKeys
.map(key => `${key}=${params[key]}`)
.join('&');
const sign = crypto
.createSign('RSA-SHA256')
.update(signString)
.sign(privateKey, 'base64');订单号重复 (1005)
原因: out_trade_no 在商户系统内必须唯一
解决方法:
javascript
// 使用唯一订单号
const outTradeNo = 'ORDER' + Date.now() + Math.random().toString(36).substr(2, 6);时间戳过期 (1007)
原因: 服务器时间与标准时间相差超过 5 分钟
解决方法:
bash
# 同步服务器时间
sudo ntpdate ntp.aliyun.com退款金额超限 (4003)
原因: 退款金额超过订单可退金额
解决方法:
javascript
// 检查订单可退金额
const order = await queryOrder(tradeNo);
const refundableAmount = order.total_amount - order.refunded_amount;
if (refundAmount > refundableAmount) {
console.error('退款金额超限,可退金额:', refundableAmount);
return;
}调试建议
- 开启日志: 记录所有请求和响应
- 使用测试环境: 先在沙箱环境测试
- 检查签名: 使用平台提供的签名验证工具
- 查看文档: 确认参数格式和要求
- 联系客服: 提供完整的请求日志
