微信公众号自定义菜单中加入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始终不能正常显示

1.jpg2.jpg

后来想到在自定义回复时,微信服务器会把接收到的数据返回给服务器,可以记录下发送的内容


    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"}


把这个值接入菜单的字符串中生成菜单成功

3.jpg

网站备案号:京ICP备11043289号-1 北京市公安局网络备案 海1101084571
版权所有 北京育灵童科技发展有限公司 Copyright © 2002-2017 www.elight.cn, All Rights Reserved