微信公众号自定义菜单中加入emoji
2017-11-24 dingshangchao 其它
以前开发公众号自定义菜单时直接定义json字符串作为常量放入配置文件中,例如
'{"button":[ { "name":"活动公告", "sub_button":[ { "name":"最新公告", "type":"view", "url":"http://www.baidu.com" }, { "name":"往期回顾", "type":"view", "url":"http://www.baidu.com" }, { "name":"征稿启事", "type":"view", "url":"http://www.baidu.com" } ] }, { "name":"每日国学", "sub_button":[ { "name":"教材解读", "type":"view", "url":"http://www.baidu.com" }, { "name":"教学设计", "type":"view", "url":"http://www.baidu.com" }, { "name":"经典诵读", "type":"view", "url":"http://www.baidu.com" }, { "name":"古曲雅音", "type":"view", "url":"http://www.baidu.com" } ] }, { "name":"投票", "type":"view", "url":"http://weixin.elight.cn/guoxue360/web/index.php" } ] }'为了在自定义菜单中加入emoji图标,想改为数组方便维护,汉字和网址就要用urlencode处理后再生成json字符串,然后urldecode后post到微信服务器,否则会报错,{“errcode”:40033,”errmsg”:”invalid charset. please check your request, if include \uxxxx will create fail!”}
但是这样就不能把这个数组定义为类的属性,会让代码看起来更乱,所以又改成了在方法内定义字符串变量,直接post给微信服务器生成菜单。
根据网上的方法把emoji加入自定义菜单,大部分讲的都是非开发者模式的办法
网上找来softbank的emoji编码加入自定义菜单的json字符串中并不能使用,查找了下原因是因为emoji是unicode编码,所以要改成utf8编码接入菜单字符串
protected function unicode2utf8($str) { $str = '{"result_str":"' . $str . '"}'; $strarray = json_decode ( $str, true ); return $test = $strarray ['result_str']; }
但是全部完成之后发现android系统显示正常,ios会把图标显示为小方块,但是用类似方法在自动回复中文本中混入emoji无论是ios还是android是能够成功的
网上说是因为ios版本的问题要使用使用频率大的图标但是试了几个图标后ios始终不能正常显示
后来想到在自定义回复时,微信服务器会把接收到的数据返回给服务器,可以记录下发送的内容
public function logger($content){ file_put_contents("./log.html", date('Y-m-d H:i:s ')."<br>".$content."<br>",FILE_APPEND); }
然后在公众号中发送想放入的图标,果然记录下了图标对应的编码
2017-11-24 15:12:54
{"ToUserName":"gh_806832e587d0","FromUserName":"ojWrCw7LVKDcuz1NWp0m5LkeE_Po","CreateTime":"1511507574","MsgType":"text","Content":"\ud83d\udd25","MsgId":"6491875598409834567"}
把这个值接入菜单的字符串中生成菜单成功