微信小程序码生成时报data format error

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39684284/article/details/81588492

报错原因

一般而言报 data format error 就意味着传入的参数与微信API所需要的参数类型不一致,所以只要检查请求的参数类型是否与要求的参数类型一致即可

具体情况

在微信生成小程序码的时候,想要自定义线条颜色,根据图片可以看出来,line_color 类型为 Object 对象,给了个默认值
微信接口

一看是 json对象,这个时候,我使用了 json_encode() 将传入的值编码为 json 字符串

<?php
$lineColor = '255,255,255';
$lineColor = str_replace(',', ',', $lineColor);
$lineColorArr = explode(',', $lineColor);
$lineColorRgb['r'] = $lineColorArr[0];
$lineColorRgb['g'] = $lineColorArr[1];
$lineColorRgb['b'] = $lineColorArr[2];
$lineColorJson = json_encode($lineColorRgb);
var_dump($lineColorJson);

这个时候,通过 var_dump() 打印后发现,是将原先的数组转为了 json字符串

string(50) "{
    "r": "255",
    "g": "255",
    "b": "255"
}"

通过这个方式将剩余的参数组装好后,

$data = array(
    'width' => 430,
    'is_hyaline' => false,
    'auto_color' => false,
    'line_color' => $lineColorJson
);

之后请求小程序码API发现报 data format error 错误。
为什么?
最开始,我以为是 json_encode() 编码后的是 string,而不是 Object ,所以导致了请求时报错 data format error,所以就在思考:

怎么将一个json字符串转为json对象?

搜了半天,结果发现绝大部分文章都将使用 json_encode() 编码的结果称为json对象,这就有点不靠谱了,最后,在微信开发社区搜了下,正好发现有同样问题的 小程序码生成,提示data format error hint

打开后看了下3楼的评论,感觉有点靠谱。
这里写图片描述
看了下那种写法就是数组,所以采用数组的方式,不进行编码,测试后发现成功生成小程序码!
最后,在写这篇文章记录自己的解决方式的时候,发现:

不是因为 json_encode() 将数组转为 string 的原因。而是自己的代码写错了/尴尬。

因为在POST参数的时候,微信API要求的是json格式的数据,所以需要将组装好的参数进行 json_encode() 编码后,再请求API,所以如果根据之前的参数进行组装的划,就会出现下面这种情况

$data = array(
    'width' => 430,
    'is_hyaline' => false,
    'auto_color' => false,
    'line_color' => "{"r":"255","g":"255","b":"255"}"
);
var_dump(json_encode($data));

输出:

string(110) "{"width":430,"is_hyaline":false,"auto_color":false,"line_color":"{\"r\":\"255\",\"g\":\"255\",\"b\":\"255\"}"}"

json 数据再次进行 json 编码后,数据格式当然不对了。

修改方法

在组装数据的时候,除了基本的数据类型外,其他的如:ObjectArray 等,都需要考虑到,组装完成后要进行 json_encode() 编码。
最后,将代码修改如下:

$lineColor = '255,255,255';
$lineColor = str_replace(',', ',', $lineColor);
$lineColorArr = explode(',', $lineColor);
$lineColorRgb['r'] = $lineColorArr[0];
$lineColorRgb['g'] = $lineColorArr[1];
$lineColorRgb['b'] = $lineColorArr[2];
$data = array(
    'path' => "pages/index/index",
    'width' => 430,
    'is_hyaline' => false,
    'auto_color' => false,
    'line_color' => $lineColorRgb
);

之后,再进行请求就没有问题了。

注意事项

PHP是一种弱类型语言,所以 0 == false 是正确的,但是在传入参数的时候,要求的是 BOOL 值,所以需要写 false 或者 true ,而不是为图简便,写 0 或者 1

展开阅读全文

没有更多推荐了,返回首页