Laravel5.6结合EasyWechat实现微信菜单管理

关于微信公众号开发,网上的教程也有很多,但是针对于功能模块的开发,没有具体的操作步骤,很难理解别人写的是什么,所以我根据自己的经验来总结一下针对微信菜单管理的具体实现步骤。微信原生实现我就不说了,看看微信官方文档,基本是看不懂的。我们这里以微信测试号为例,使用的是Laravel + EasyWechat 去实现此功能。注:本次开发,项目无需上线,本地即可。

一、在后台模块中增加微信菜单管理,先把页面做出来。
1、配置微信菜单管理相关路由,直接上代码:

Route::prefix('menu')->group(function () {
        $this->get('edit', 'MenuController@edit')->name('menu.edit');
        $this->put('update', 'MenuController@update')->name('menu.update');
        $this->delete('destroy', 'MenuController@destroy')->name('menu.destroy');
 });

2、创建对应的控制器和方法,并加载模板。本次模板使用的是amazeui前端框架,由于模板代码较为复杂,此处省去模板代码,需要参考模板代码的朋友可以到我的码云上下载即可。https://gitee.com/canonforever/canon4ever

二、安装EasyWechat第三方包,配置微信所需信息
1、页面做好后,打开 EasyWechat官网,找到Laravel安装包,终端进入项目,执行命令:composer require “overtrue/laravel-wechat:~4.0”,创建配置文件: php artisan vendor:publish --provider=“Overtrue\LaravelWeChat\ServiceProvider”
2、打开微信公众平台测试号,https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,用自己的微信扫码登录即可。
3、在.env文件中配置微信公众号APPID和秘钥,代码如下:

 WECHAT_DEBUG=true
 WECHAT_OFFICIAL_ACCOUNT_APPID=wxe846b6db8a21a631
 WECHAT_OFFICIAL_ACCOUNT_SECRET=6cc667bfd763d2cf9e19bd6de65a519a

三、实现微信菜单编辑操作
1、在控制器中调用EasyWechat的SDK获取实例,代码如下:

private $menu;
public function __construct()
{
   //$app = EasyWeChat::officialAccount(); // 公众号
   $app = app('wechat.official_account');
   $this->menu = $app->menu;
 }

2、编辑微信菜单。由于微信菜单设置后,一般无需经常更新,所以我这里使用了laravel自带的缓存处理,提高读取速度。代码如下:

 function edit()
 {
      //尝试去获取当前微信里面的菜单,如果菜单存在,那么就调用SDK里面的list方法获取到,然后返回给前端显示,如果没有菜单,那么就返回一个空数组。
      $buttons = Cache::rememberForever('wechat_config_menus', function () {
         $list = $this->menu->list(); //获取所有菜单
         if (isset($list['menu'])) {
             return $list['menu']['button'];
         }
         return [];
      });
      return view('admin.wechat.menu.edit', compact('buttons'));
   }

3、自定义函数。由于微信表单提交后不允许有空值,所以我们要自定义辅助函数删除空数组。在辅助函数中添加代码如下:

/**
    * 微信菜单, 删除空数组
    * @param $buttons
    * break 用来跳出目前执行的循环,并不再继续执行循环了。
    * continue 立即停止目前执行循环,并回到循环的条件判断处,继续下一个循环。
    */
function wechat_menus($request_buttons)
{
    $buttons = [];
    foreach ($request_buttons as $key => $value) {
        if ($value['name'] == "") {
               continue;//终止本次循环而进入到下一次循环中,
        }

        $buttons["$key"] = wechat_key_url($value);

        foreach ($value["sub_button"] as $k => $v) {
             if ($v['name'] == "") {
                   continue;
             }
             $buttons["$key"]["sub_button"][] = wechat_key_url($v);
         }
     }
    return $buttons;
}
   /**
    * 根据类型,返回url或者key
    * @param $value
    * @return array
    */
function wechat_key_url($value)
{
    $result = [];
    $result['type'] = $value['type'];
    $result['name'] = $value['name'];
    if ($value['type'] == "click") {
        $result['key'] = $value['value'];
    } else {
        $result['url'] = $value['value'];
    }
    return $result;
}

4、执行更新。获取前端传过来的所有菜单,调用自定义函数去处理空数组得到我们想要的值,然后再调用EasyWechat里面的create方法执行更新即可。代码如下:

function update(Request $request)
{
    $buttons = wechat_menus($request->buttons);
    $this->menu->create($buttons);
    Cache::forget('wechat_config_menus');
    return back()->with('success', '您已成功设置菜单,请取消关注后,再重新关注~');
}
四、实现微信菜单删除操作
删除菜单。直接调用EasyWechat里面的delete方法即可删除。代码如下:

function destroy()
{
    $this->menu->delete();
    Cache::forget('wechat_config_menus');
    return back()->with('success', '您已成功删除菜单,请取消关注后,再重新关注~');
}

注意:如果菜单修改提交超时,或者提示curl等错误,在view类型下,后面对应的值一定要带有http://开头,否则提交失败!
至此,微信自定义菜单功能完成。当然还有其他细节功能可以查阅 EasyWechat 文档。

猜你喜欢

转载自blog.csdn.net/weixin_43674113/article/details/84822434