微信卡券创建礼品卡接口报错 - data format error, do NOT use json unicode encode

更新日期: 2018-11-22 阅读次数: 4046 分类: 微信小程序

同事在微信小程序服务端使用 PHP Guzzle 调用微信卡券创建礼品卡接口,当参数中包含中文时,会报错

'errcode' => 47002,
'errmsg' => 'data format error, do NOT use json unicode encode (\\uxxxx\\uxxxx), please use utf8 encoded text! hint: [apaaxa01214794]',

PHP 代码为

$client = new \GuzzleHttp\Client();
$card = [
	// some code, e.g.
	'notice' => '二维码',
];

$res = $client->request(
	'POST', 
	'https://api.weixin.qq.com/card/create?access_token='.$access_token,
	[
		'json' => ['card' => $card]
	]
);

$result = (string) $res->getBody();

解决方法

将 json 那行替换成

'body' => json_encode(['card' => $card], JSON_UNESCAPED_UNICODE)

JSON_UNESCAPED_UNICODE 背后的故事

在 artisan tinker 中做个测试

>>> $a = ['name' => '中国']
=> [
     "name" => "中国",
   ]

>>> json_encode($a);
=> "{"name":"\u4e2d\u56fd"}"

>>> json_encode($a, JSON_UNESCAPED_UNICODE);
=> "{"name":"中国"}"

可以看到,json_encode 之后,中文默认变成了 unicode.

而,加上 JSON_UNESCAPED_UNICODE 参数之后,就正常显示了,我们知道 linux console 下默认是支持 utf8 字符显示的。

JSON_UNESCAPED_UNICODE, 故名思议, 就是说, JSON 不要编码 Unicode.

爱评论不评论