小心爱与不爱之间 离得不是太远

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

技术文档 11282浏览 0评论
文章目录[隐藏]

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

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

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数据格式是对的,但多图文都会变成单图文了。

enter image description here

百思不得其解!

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

乱码的articles对象数组:

enter image description here

正常的articles对象数组:

enter image description here

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

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

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

enter image description here

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

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

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

  • 微信公众平台的接口调用限制太死了点,造成调试起来很不方便。比如预览功能,似乎每天只能调用两次(?不确定?),今天用完了就只能明天继续了。
  • 其他也要进行编码处理的一些接口,比如自定义菜单,我使用的就是传统的方法,似乎不会造成内容被截掉的问题,是否群发接口的服务器端处理比较严格?

转载请注明:自由的风 » 微信公众平台高级群发接口问题处理

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址