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

文章目录

    同事在微信小程序服务端使用 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式