1.问题描述
开发微信公众号的群发功能时,需要先上传图文消息素材,其POST数据格式类似于:
{
"articles": [
{
"thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
"author":"xxx",
"title":"Happy Day",
"content_source_url":"www.qq.com",
"content":"content",
"digest":"digest",
"show_cover_pic":"1"
},
{
"thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
"author":"xxx",
"title":"Happy Day",
"content_source_url":"www.qq.com",
"content":"content",
"digest":"digest",
"show_cover_pic":"0"
}
]
}
但碰到一个比较奇怪的问题,POST提交的数据若不经过编码处理,即使用代码为:
......
$article['content'] = $post_content;
......
$request = array('articles'=>$articles);
$articles=json_encode($request);
群发的内容内包含中文时就会出现乱码,但多图文的条目是对的,如下图。
若经过编码处理(先将中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)得到最终的json对象)后,使用代码为:
......
$article['content'] = urlencode($post_content);
......
$request = array('articles'=>$articles);
$articles=urldecode(json_encode($request));
生成的articles数据格式是对的,但多图文都会变成单图文了。
百思不得其解!
于是先将生成的对象数据打印出来,分别如下:
乱码的articles对象数组:
正常的articles对象数组:
对象数据应该是正常生成了,但就是群发的时候都变成其中的第一条了,后面的都没有办法显示。
通过仔细对比,比较明显的就是乱码的articles对象数组中,一些特殊字符如 “ / 前面都加上了转义字符,而经过编码处理后的正常显示的articles对象数组中的特殊字符前面则没有转义字符。
是否是因为这个原因呢?于是自定义了一个articles对象数组,如下:
上传图文并群发之后,能够正常显示了,如下图:
看来确实是由于这些转义字符造成的。
2.解决方案
找到了问题所在,那么解决思路就出来了,则是要把articles对象数组中的特殊字符都加上转义字符。
但我没有找到类似的函数,在网上看到说PHP 5.4以后json_encode函数能够原生地处理中文字符了,于是将系统的PHP版本进行了升级,并改写代码如下:
......
$article['content'] = $post_content;
......
$request = array('articles'=>$articles);
$articles=json_encode($request,JSON_UNESCAPED_UNICODE);
终于顺利地生成了正确的articles对象数组,解决了多图文变单图文的问题。
注:JSON_UNESCAPED_UNICODE 参数需要加上。
3.后续
开发这个群发功能是最折腾的了,感叹如下:
- 微信公众平台的接口调用限制太死了点,造成调试起来很不方便。比如预览功能,似乎每天只能调用两次(?不确定?),今天用完了就只能明天继续了。
- 其他也要进行编码处理的一些接口,比如自定义菜单,我使用的就是传统的方法,似乎不会造成内容被截掉的问题,是否群发接口的服务器端处理比较严格?
转载请注明:自由的风 » 微信公众平台高级群发接口问题处理