微信个性化菜单开发

扫码关注的技术步骤这里就不再一一论述,可参考http://www.cnblogs.com/txw1958/p/weixin-qrcode-with-parameters.html ,这里只是想说清一个问题,就是菜单加载机制

微信公众号进行开发时开启服务器配置,配置中填写了一个入口url,在这之前把自定义菜单的生成放在了这个入口url,以为每次进入公众号首页,都会重新生成一次自定义菜单,然后显示出来。这次进行扫码关注开发,需要生成特定标签下的个性化菜单,顺着之前逻辑开始理所当然地写代码,区分事件来生成2种不同的菜单:

1.自定义菜单;2.个性化菜单,

然后功能测试时,发现没反应,才去阅读结合,理清思路,重新修改代码,效果出现。

以下是错误思路代码截图,引以为戒:

正确的思路是:

1.生成自定义菜单

2.生成需要的个性化菜单

前提条件

步骤一.创建一个用户标签,获取tag_id

步骤二:使用上一步中的tag_id来调用下面接口

备注:这里特别注意微信公众号菜单机制【详情见官方文档】

理解以上规则后,就可以在推送事件中进行所需的处理了。

步骤三:给用户打标签

打标签函数:

对于已关注扫码类型 $ev == "SCAN"的也是一样的处理

这样就与以上菜单匹配规则对上了,不过扫码进去菜单可能不会立即更新为个性化菜单(还没找到解决方法),因为:

整体只是说了大概思路,开发过程还是需要自己好好琢磨。。。
————————————————
版权声明:本文为CSDN博主「Annie_冰荷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ice_load/article/details/52400188

https://www.cnblogs.com/lingxiukeji-wyj/p/13997407.html

问题描述:

继上一篇的《自定义微信公众号的个性化菜单栏》的文章,为了“根据不同用户标签显示不同的功能菜单并且点击菜单跳转到外网”这个功能需求,研究了一天的微信开发文档关于个性化菜单,消息接口事件推送,用户标签的问题,将自己在开发过程中遇到的问题分享出来,让更多的小伙伴少走弯路。

梳理问题:

其一 :接触过微信公众号开发的小伙伴都知道,微信公众号(认证服务号)的后台是给用户提供有自定义菜单设置,并且在那里可以设置菜单并且设置url连接来跳转到网页

其二:我们可以通过微信提供的自定义菜单创建接口,(如何获取AccessToken请参考上一篇文章)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

//生成自定义菜单(默认菜单)

    public function createMenu(){

        $access_token =$this->getAccessToken();

        $url ="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;

        //拼装要生成的菜单

        $array =array(

            'button'=>array(

                //第一个一级菜单

//                array(

//                    'type'=>'click',

//                    'name'=>'hello',

//                    'key' =>'front',

//

//                ),

                array(

                    "type"=>"view",

                    "name"=>'world',

                    "url"=>"http://www.baidu.com"

                ),

                //第二个一级菜单

//                array(

//                    'type'=>'click',

//                    'name' => urlencode($data['second_name']),

//                    'key' =>'behind',

//                ),

            ),

        );

        //转化成json的格式

        $arrayJson = urldecode(json_encode($array));

        $this->http_curl($url,'post','json',$arrayJson);

    }

  CURL请求:

复制代码

public function http_curl($url,$type='get',$res='json',$arr=''){
        //1.初始化
        $ch = curl_init();
        //2.设置参数
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        if( $type == 'post' ){
            //如果是post请求的话,设置post的一些参数
            curl_setopt($ch , CURLOPT_POST , 1);
            curl_setopt($ch , CURLOPT_POSTFIELDS, $arr);
        }
        //3.执行
        $result = curl_exec($ch);
        if( curl_errno($ch)){
            //打印错误日志
            var_dump(curl_error($ch));
        }
        if( $res == 'json' ){
            //将json转化成数组的形式
            $result = json_decode($result , TRUE);
        }
        //4.关闭
        curl_close($ch);
        return $result;
    }

复制代码

说明:这里的菜单是定义的二级菜单,定义二级菜单的作用是可以通过其url参数实现点击跳转(特别提示:官方文档中并没有说明在没有一级菜单的情况下不允许定义二级菜单,所以通过自定义接口我们可以直接创建二级菜单)

  小插曲:开始按照官方文档指示,并没有创建二级菜单,而是创建一级菜单,然而一级菜单的type事件跟二级的type事件不一样,一级菜单需要开启公众号后台的服务器配置,并且需要配置相关服务器接口,微信根据所配置的接口,将用户操作的内容发送到该接口,一级菜单的click事件绑定的EventKey参数可以用来在接口中识别是点击了哪个自定义菜单,可以根据EventKey的值来进行相关业务逻辑的处理。

其三:创建个性化菜单

根据微信官方文档说明:

个性化菜单匹配规则说明:

个性化菜单的更新是会被覆盖的。 例如公众号先后发布了默认菜单,个性化菜单1,个性化菜单2,个性化菜单3。那么当用户进入公众号页面时,将从个性化菜单3开始匹配,如果个性化菜单3匹配成功,则直接返回个性化菜单3,否则继续尝试匹配个性化菜单2,直到成功匹配到一个菜单。 根据上述匹配规则,为了避免菜单生效时间的混淆,决定不予提供个性化菜单编辑API,开发者需要更新菜单时,需将完整配置重新发布一轮。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

//创建个性化匹配菜单

    public function characterMenu()

    {

        $access_token =$this->getAccessToken();

        $url='https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token='.$access_token;

        $array =array(

            'button'=>array(

                array(

                    "type"=>"view",

                    "name"=>'hello',

                    "url"=>"要跳转的url"

                ),

                array(

                    "type"=>"view",

                    "name"=>'world',

                    "url"=>"要跳转的url"

                ),

            ),

            "matchrule"=>array(

                "tag_id"=>100//标签匹配,微信官方放回给你的标签id

            )

        );

        //转化成json的格式

        $arrayJson = urldecode(json_encode($array));

        $this->http_curl($url,'post','json',$arrayJson);

    }

  说明:个性化菜单的创建也是直接创建的二级菜单,如何创建标签id接下来说明(申请标签应在创建个性化菜单之前)

     matchrule的匹配规则项我们在这里只使用tag_id标签匹配,其他匹配项请参考微信开放文档(https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Personalized_menu_interface.html)

其四:创建用户标签

创建用户标签也非常简单,直接上代码

复制代码

 /**
     * 生成用户标签接口
     **/
    public function createTag()
    {
        $access_token = $this->getAccessToken();
        $url='https://api.weixin.qq.com/cgi-bin/tags/create?access_token='.$access_token;
        $data['tag']['name']=urlencode('管理员');
        $res=$this->http_curl($url,'post','json',json_encode($data));
        dump($res);
        //成功返回的参数包括tag_id
    }

复制代码

其五:为用户添加标签

该接口是批量为用户添加标签,参数为数组形式,里面只包含用户在该公众号下的唯一的openid值

复制代码

//批量为用户打上微信公众号的标签类型
    public function pasteTag($arr_openid)
    {
        $access_token=$this->getAccessToken();
        $url='https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token='.$access_token;
        $data['openid_list']=$arr_openid;
        $data['tagid']=你的标签id;
        $data=$this->http_curl($url,'post','json',json_encode($data));
        dump($data);
    }

复制代码

在此,当用户访问该公众号的时候,根据用户身上的标签,会显示不同的菜单栏内容,实现个性化菜单的展示功能

Additional:

为用户取消标签:

openid为数组形式,数组里面是你要取消的该公众号下的唯一的用户的openid

复制代码

//为用户取消标签
    public function cancelTag($openid,$tagid)
    {
        $access_token = $this->getAccessToken();
        $url='https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token='.$access_token;
        $data['openid_list']=$openid;
        $data['tagid']=$tagid;
        $res = $this->http_curl($url,'post','json',json_encode($data));
        wxlogging('cancel_user_tag',json_encode($res));
    }

复制代码

获取该公众号创建的标签:

复制代码

 //获取微信公众号所创建的标签
    public function getTag()
    {
        $access_token=$this->getAccessToken();
        $url='https://api.weixin.qq.com/cgi-bin/tags/get?access_token='.$access_token;
        $data=$this->http_curl($url);
        dump($data);
    }

复制代码

获取某个标签下的用户:

复制代码

//获取某个标签下面的粉丝openid
    public function getFans()
    {
        $access_token=$this->getAccessToken();
        $url='https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token='.$access_token;
        $data['tagid']=100;
        $data=$this->http_curl($url,'post','json',json_encode($data));
        dump($data);
    }

复制代码

删除所有菜单

复制代码

 public function delete()
    {
        $access_token=$this->getAccessToken();
        $url='https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$access_token;
        $res=$this->http_curl($url,'get','json');
        dump($res);

    }

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值