自由的风's Archivers

From 自由的风 on 2015-01-10 23:25:34

微信公众平台高级群发接口问题处理

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);


群发的内容内包含中文时就会出现乱码,但多图文的条目是对的,如下图。





<img src="http://loosky.net/Upload/2015/01/duotuwen.jpg" alt="enter image description here" />



若经过编码处理(先将中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)得到最终的json对象)后,使用代码为:



......
$article['content'] = urlencode($post_content);
......
$request = array('articles'=>$articles);
$articles=urldecode(json_encode($request));


生成的articles数据格式是对的,但多图文都会变成单图文了。



<img src="http://loosky.net/Upload/2015/01/dantuwen.jpg" alt="enter image description here" />



百思不得其解!



于是先将生成的对象数据打印出来,分别如下:



乱码的articles对象数组:



<img src="http://loosky.net/Upload/2015/01/json1.png" alt="enter image description here" />



正常的articles对象数组:



<img src="http://loosky.net/Upload/2015/01/json2.jpg" alt="enter image description here" />



对象数据应该是正常生成了,但就是群发的时候都变成其中的第一条了,后面的都没有办法显示。



通过仔细对比,比较明显的就是乱码的articles对象数组中,一些特殊字符如 “ / 前面都加上了转义字符,而经过编码处理后的正常显示的articles对象数组中的特殊字符前面则没有转义字符。



是否是因为这个原因呢?于是自定义了一个articles对象数组,如下:



<img src="http://loosky.net/Upload/2015/01/json3.jpg" alt="enter image description here" />



上传图文并群发之后,能够正常显示了,如下图:



<img src="http://loosky.net/Upload/2015/01/duotuwen2.jpg" alt="enter image description here" />



看来确实是由于这些转义字符造成的。



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.后续



开发这个群发功能是最折腾的了,感叹如下:




查看完整版本: 微信公众平台高级群发接口问题处理

Tags: PHP, 微信, 高级接口


©自由的风