laravel中使用easywechat配置公众号 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 公众号相关 >

laravel中使用easywechat配置公众号

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:138

安装插件

# Laravel < 5.8
composer require "overtrue/laravel-wechat:~4.0"

# Laravel >= 5.8
composer require "overtrue/laravel-wechat:~5.0"

push配置

php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"

增加.env配置公众号设置

WECHAT_OFFICIAL_ACCOUNT_APPID=wx78ae5bb2XXXX
WECHAT_OFFICIAL_ACCOUNT_SECRET=214f1ce332XXXX
WECHAT_OFFICIAL_ACCOUNT_TOKEN=yishXXX
WECHAT_OFFICIAL_ACCOUNT_AES_KEY=6lwDoXXXXXFDFEEEEEEEEE

过滤CSRF

比如你的配置访问地址是
http://www.heibaiketang.com/api/weixin/server
那么就需要配置VerifyCsrfToken.php文件如下

api/weixin/*

定义路由

一定要定义get,post,因为他们验证get,post消息

Route::any('api/weixin/server', 'WeiXinController@server')->name('server');

简单例子

<?php

namespace App\Http\Controllers\Api;

use App\Services\weixin\ImageMessageHandler;
use App\Services\weixin\TextMessageHandler;
use EasyWeChat\Kernel\Messages\Message;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Log;
use EasyWeChat\Factory;

class WeiXinController extends BaseController
{
    //微信接口服务
    //https://www.yishanseo.com/api/h5/weixin/server?echostr=1410480958785089387&nonce=134704537&signature=7e6f50565319edc86585d06df0fb8539df46f305&timestamp=1557556841
    public function server()
    {
        Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志
        $config = config('wechat.official_account.default');
        $app = Factory::officialAccount($config);
       
       $app->server->push(function ($message) {
            // $message['FromUserName'] // 用户的 openid
            // $message['MsgType'] // 消息类型:event, text....
            switch ($message['MsgType']) {
                case 'event':
                    return '收到事件消息';
                    break;
                case 'text':
                    return '收到文字消息';
                    break;
                case 'image':
                    return '收到图片消息';
                    break;
                case 'voice':
                    return '收到语音消息';
                    break;
                case 'video':
                    return '收到视频消息';
                    break;
                case 'location':
                    return '收到坐标消息';
                    break;
                case 'link':
                    return '收到链接消息';
                    break;
                case 'file':
                    return '收到文件消息';
                // ... 其它消息
                default:
                    return '收到其它消息';
                    break;
            }
        });
        $response = $app->server->serve();
        return $response;
    }
}

上面为SDK写法,laravel写法还可以这样

public function serve()
    {
        Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志

        $app = app('wechat.official_account');
        $app->server->push(function($message){
            return "欢迎关注 overtrue!";
        });

        return $app->server->serve();
    }

这样就搞定了。
其他写法

$officialAccount = EasyWeChat::officialAccount(); // 公众号
  $work = EasyWeChat::work(); // 企业微信
  $payment = EasyWeChat::payment(); // 微信支付
  $openPlatform = EasyWeChat::openPlatform(); // 开放平台
  $miniProgram = EasyWeChat::miniProgram(); // 小程序
  
  // 均支持传入配置账号名称
  EasyWeChat::officialAccount('foo'); // `foo` 为配置文件中的名称,默认为 `default`
  //...

如果你有多个公众号,需要单独分开。那么修改下刚才那个配置引入

第一种是$config修改就可以切换不同的公众号
第二种就设置officialAccount(配置名字)

把用户发过来消息服务单独文件出来

比如我现在要单独文本和图片

 public function server()
    {
        Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志
        $config = config('wechat.official_account.default');
        $app = Factory::officialAccount($config);
       $app->server->push(ImageMessageHandler::class, Message::IMAGE); // 图片消息
        $app->server->push(TextMessageHandler::class, Message::TEXT); // 文本消息
        $response = $app->server->serve();
        return $response;
    }

文本

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/5/11
 * Time: 14:56
 */

namespace App\Services\weixin;

use \EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class TextMessageHandler implements  EventHandlerInterface
{
    public $message;

    public function handle($payload = null)
    {
        $this->message=$payload;
        // TODO: Implement handle() method.
        return $this->message['Content'].'TXT消息';
    }

}

以上所有的单独文件需要继承 \EasyWeChat\Kernel\Contracts\EventHandlerInterface;这个接口。
实现方法handle(payload),payload表示传递过来的对象消息。。
每个消息必须返回的消息有

ToUserName 接收方帐号(该公众号 ID)
FromUserName 发送方帐号(OpenID, 代表用户的唯一标识)
CreateTime 消息创建时间(时间戳)
MsgId 消息 ID(64位整型)
微信公众号的菜单设置:
 /**
     * 添加菜单
     */
//    public  function  menu_add(){
//        $app = app('wechat');
//        $menu = $app->menu;
//        $buttons = [
//            [
//                "type"=>"view",
//                "name"=>"进入课堂",
//                "url"=>BASE_URL."/wx_student#/main"
//            ],
//        ];
//        $menu->add($buttons);
//    }


   /**
     * 删除菜单
     */
//    public  function  menu_destroy(){
//        $app = app('wechat');
//        $menu = $app->menu;
//        $menu->destroy();
//    }

/**
 * 查看微信公众号当前的菜单
 */
public  function  menu_current(){
    $app = app('wechat');
    $menu = $app->menu;
    $menus = $menu->all();
    var_dump($menus);
}
这个具体文档上面都有,将这些方法加到一个控制器中,注册路由,上传到云服务器上,然后使用浏览器访问一下这些方法,就会出相应的结果


微信网页授权:
注:使用微信网页授权之前,一定要检查一下你所使用的微信公众号是否有网页授权接口的权限
在laravel版的easywechat中自带一个微信授权的中间件,使用非常简单
只需要在配置文件将有关授权的配置填写完整,然后在laravel 

中注册一下

然后在 路由中使用该中间件(注:使用web中间件是为了防止出现session不共享的情况)

例:

就可以在session中获取授权用户的信息

例:这是一个关于检测登录的中间件

public function handle($request,Closure $next, $guard = null)
{
    if (empty(session("id"))){
        $user = session('wechat.oauth_user');
        $openid = $user['id'];
      //检测数据库中用户账号和微信号是否绑定
        $result = WxStudent::check_boundwechat($openid);
        if ($result=='200'){
            return $next($request);
        }else{
            return response("请登录", 403)->header("X-CSRF-TOKEN", csrf_token());
        }
    } else if(!empty(session("id"))) {
        return $next($request);
    }
}


注:如果报redirect_uri错误,这时候极有可能是网页授权的链接没有更改成现在需要授权的网址,这时候只需要去公众号后台改一下要授权的网址即可
例:

这样授权部分的就介绍完了,下面来说一下微信公众号向已关注的用户推送模板消息

模板消息
ps:要先看一下微信公众号是否支持模板消息接口,然后要先把该模板消息的摸板添加到你的微信公众号上(通过公众号后台),然后要知道你要使用模板消息的模板id
如:$template_id = 'XQ3uJilYd5elz-TUHzkvKF4-nfB6Yu3WBm0B45dRtbY';
    
示例:    
      $app = app('wechat');
      $notice = $app->notice;
          $template_id = 'XQ3uJilYd5elz-TUHzkvKF4-nfB6Yu3WBm0B45dRtbY';  //消息模板的id

      $url = BASE_URL.'/wx_student#/bulletininfo/'.$course_id.'/'.$bu_id;   //点击模板消息的跳转的地址
            //循环给多个用户发送消息
//                foreach ($users as $user){
//                    if ($user['openid']!=""&&$user['openid']!='0'&&!empty($user['openid'])){
//                        $open_id = $user['openid'];

//              注:不同的模板,$data的内容可能不太一样,具体要看你微信公众号后台所使用的模板,上面都有示例的
//                        $data = array(
//                            "first"=>$user['name']."同学你好,你的".$course_nam.'课教师'.$create_name.'发布了一个新的班级公告',
//                            "keyword1"=>'',
//                            "keyword2"=>'',
//                            "remark"=>'请及时查看班级公告',
//                        );
//                        $notice->uses($template_id)->withUrl($url)->andData($data)->andReceiver($open_id)->send();
//                    }
//                }
模板消息如果发不出去的话,你要检查一下微信公众号是否有该接口的权限,这个接口的调用次数好像是有限制


下面来说一下调用微信的扫码接口
这个是微信的jssdk
后台jssdk的域名不要填写http://
直接写就行。如ydjx.gm365.cc   要不然可能jssdk就无法调


1.先在html里面引入
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
    wx.config(<?php echo app('wechat')->js->config(array('scanQRCode'), false) ?>);
</script>
然后在js中加上这个方法
scan_code(){
    wx.scanQRCode({
        needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
        success: function (res) {
            var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果

        }
    });
}

其他查看官方文档文档
https://www.easywechat.com/docs/4.1/official-account/server

相关案例查看更多