同事在微信小程序服务端使用 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.
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式