《新手避坑:微信小程序消息订阅传参的类型错误》

284 阅读1分钟

报错实况:

环境:JDK 1.8 + Spring Boot 2.5.14 + IDEA 2024.2.2 触发操作:向微信小程序发送发送构建的消息主体时,控制台打印code=47003错误(参数无效)

关键报错片段:

private static Map<String, Object> wxMessageMap(OrderInfo orderInfo) {
    HashMap<String, Object> paramMap = new HashMap<>();
    Map<String, Object> messageContent = new HashMap<>();
    messageContent.put("thing22", new HashMap<String, Object>() {{
        put("value", orderInfo.getTime());
    }});
    String orderId = orderInfo.getOrderId();
    messageContent.put("character_string5", new HashMap<String, Object>() {{
        put("value", orderId);
    }});
    messageContent.put("thing9", new HashMap<String, Object>() {{
        put("value", orderInfo.getChargingStationId());
    }});
    messageContent.put("amount17", new HashMap<String, Object>() {{
        put("value", orderInfo.getPrice());
    }});
    messageContent.put("phrase10", new HashMap<String, Object>() {{
        put("value", orderInfo.getStatus());
    }});
    paramMap.put("data", messageContent);
    return paramMap;
控制台打印错误:code = 47003 , msg = argument invalid! data.phrase10.value invalid 

菜鸟踩坑心路

  1. 错误预判: “以为是传入参数的值是不正确的,实际上值没有问题”

  2. 迷惑操作

    • 重启IDEA 3次
    • “将传入的参数修改为“111”的样式,重启之后发现依然有问题”
  3. 灵光时刻

    • 通过查询微信小程序文档发现phrase10.value 的值 "111" 或者“orderInfo.getStatus()”不符合微信模板消息的校验规则(代码中orderInfo.getStatus()返回的类型是String类型),phrase10.value的值应为“枚举类”;

破局关键:

  1. 查阅微信模板消息文档,确认 phrase10 允许的值范围。

  2. 调整 phrase10.value,改为符合要求的枚举值(如 "已完成")。

    messageContent.put("phrase10", new HashMap<String, Object>() {{
            put("value", "已完成");
        }});
    
  3. 如果 orderInfo.getStatus() 返回的值不符合要求,可以做一个映射转换。

避坑总结(新手必看)

错误认知纠正方案
“报错之后认为是值有问题”优先查看相关文档检查是否是类品匹配错误
> 我是 "炸开的淀粉肠" ,应届Java工程师  
> ✅ 专注记录新人成长路上的每一个跟头