Easywechat公众号验证、模板消息、群发消息、登录验证

EasyWeChat 是一个开源的 微信 非官方 SDK。安装非常简单,因为它是一个标准的 Composer 包,这意味着任何满足下列安装条件的 PHP 项目支持 Composer 都可以使用它。

点击查看官方文档 查看时记得选择自己对应的EasyWechat版本

Easywechat是开发微信非常好用的轮子,文档也很详细,下面贴出自己开发模板消息时所使用过的源码,可以结合文档查看,希望可以给小伙伴一些帮助。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use EasyWeChat\Factory;
use Illuminate\Support\Facades\Auth;

class EasywechatController extends Controller
{
    public $config ;
    //初始化赋值
    public function __construct(){
        if(!Cache::get('wechats_config')){
            $wechat=\DB::table('wechats')->where('status',1)->first();
            Cache::set('wechats_config',$wechat);
        }
        $wechat=Cache::get('wechats_config');
        $this->config= [
            'app_id' => $wechat->app_id,
            'secret' => $wechat->secret,
            'token'    => $wechat->token,
            'aes_key'  => $wechat->aes_key,
            // 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
            'response_type' => 'array',
            //...
            'oauth' => [
                'scopes'   => ['snsapi_userinfo'],//snsapi_base不询问,snsapi_userinfo询问
                'callback' => '/wechat/oauth_callback',
            ],
        ];
    }
    
    //公众号开发者验证
    public function checkwechat(){
        $app = Factory::officialAccount($this->config);
        if(!Cache::get('wechats_config')){
            $wechat=\DB::table('wechats')->where('status',1)->first();
            Cache::set('wechats_config',$wechat);
        }
        $wechat=Cache::get('wechats_config');
        $buttons =json_decode($wechat->menu,true);
        //创建菜单
        $app->menu->create($buttons);
        //接收消息返回
        $app->server->push(function ($message) {
            
            if($message['MsgType']==="event"&&$message['Event']==="subscribe"){
                return '欢迎您关注我,我们给您准备了一份新人礼'."\n\n".'<a href="">同步教学微课</a>'."\n\n".'<a href="">免费领样书活动</a>';
            }elseif($message['MsgType']==="event"&&$message['Event']==="CLICK"&&$message['EventKey']==="hezuo"){
                $image = new Image("FTw2YfzOWmZN94iBTaFf6PR1FMn7BM6gdz1bGvhlPL4PaYx09mej-irKAKzSPWAT");
                return $image;
            }elseif($message['Content']==="电子书"){
                return '<a href="">电子书</a>';
            }elseif($message['Content']==="codeID"){
                return $message['FromUserName'];
            }else{
                return '猜您想找'."\n\n".'<a href="">同步教学微课</a>'."\n\n".'<a href="">免费领样书活动</a>'."\n\n".'点击上方蓝字即可获取↑↑↑';
            }
            
            
        });
        $response = $app->server->serve();
        return $response;
    }
    
    
    
    
   
    
    //模板消息通知
    public function mess_template($users,$count,$msg){
        $app = Factory::officialAccount($this->config);
        foreach ($users as $openid){
            $app->template_message->send([
                'touser' => $openid,
                'template_id' => '5rerc3MHYsYUDAOZ5ICE9BEv7jTx0aXnb-6hzcbB04s',
                'url' => 'http://xxx.com',
                'data' => [
                    'first' => '最新库存查询通知',
                    'keyword1' => '荣德基营销中心',
                    'keyword2'=>$count.'条数据被更新',
                    'keyword3'=>date("Y-m-d H:i:s"),
                    'remark'=>$msg
                ],
                // //跳小程序所需数据,不需跳小程序可不用传该数据
                // 'miniprogram' => [
                //         // 所需跳转到的小程序appid(该小程序 appid 必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
                //         'appid' => "appid",
                //         // 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏
                //         'pagepath' => 'pages/xxx',
                // ],
                
            ]);
        }
        
    }
    //模板删除
    public function deltemplatemass($templateId){
        $app = Factory::officialAccount($this->config);
        $res=$app->template_message->deletePrivateTemplate($templateId);
        if($res){
            return ['code'=>1,'msg'=>"删除模板成功"];
        }else{
            return ['code'=>404,'msg'=>"删除模板失败"];
        }
    } 
    //模板添加
    public function addtemplatemass($shortId){
        $app = Factory::officialAccount($this->config);
        $res = $app->template_message->addTemplate($form->shortId);
        if($res){
            return ['code'=>1,'msg'=>"添加模板成功"];
        }else{
            return ['code'=>404,'msg'=>"删除模板失败"];
        }
    }
    //模板列表
    public function listtemplatemass($shortId){
        $app = Factory::officialAccount($this->config);
        $list=$app->template_message->getPrivateTemplates();
        return $list;
    }
    
    
     //群发
    // 1、对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个分组;
    // 2、对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败;
    // 3、具备微信支付权限的公众号,在使用群发接口上传、群发图文消息类型时,可使用<a>标签加入外链;
    // 4、开发者可以使用预览接口校对消息样式和排版,通过预览接口可发送编辑好的消息给指定用户校验效果。
    public function mass_dispatch(){
        $book=\DB::table('books')->where('status',1)->first();
        $stockquejia=\DB::table('books')->where('stockque','>',0)->where('stockque','<',30)->count();
        $stockqueyi=\DB::table('books')->where('stockque','<=',0)->count();
        $msg="库存获取时间:".$book->updated_at."\n"."已经缺货书籍:".$stockqueyi."\n"."即将缺货书籍:".$stockquejia."\n"."详情请点击";
        $users=json_decode(json_encode(\DB::table('users')->pluck('openid')),true);
        // var_dump($msg);
        $app = Factory::officialAccount($this->config);
        //群发文本信息
        $app->broadcasting->sendText($msg, $users);
    }
    
    //用户授权登录
    public function  authorize_user(Request $request){
        $app = Factory::officialAccount($this->config);
        $oauth = $app->oauth;
        $callback_url=$request->input('callback_url');
        session(['callback_url'=>$callback_url]);
        return $oauth->redirect();
       
    }
    
    public function oauth_callback(){
        $app = Factory::officialAccount($this->config);
        //获取授权的用户
        $user = $app->oauth->user();
        $callback_url=session('callback_url');
        $data=array();
        $data['openid']=$user['original']['openid'];
        $data['nickname']=$user['original']['nickname'];
        $data['headimgurl']=$user['original']['headimgurl'];
        $data['status']=1;
        $data['created_at']=date("Y-m-d H:i:s");
        $data['updated_at']=date("Y-m-d H:i:s");
        $istrue=\DB::table('users')->where('openid',$data['openid'])->value('id');
        if(!$istrue){
            $user=\DB::table('users')->insert($data);
        }else{
            $user=0;
        }
        
        if($user){
            return "<script>alert('用户授权成功,可接收库存信息')</script>";
        }else{
            return "<script>alert('该用户已在授权列表内,请勿重复授权!!!')</script>";
        }
    }
    
    
    
}

日常微信开发基本不会有性能问题,但当粉丝数超百万时,大批量推送模板消息会遇见很多难以解决的问题,比如推送慢,推送超时,内存溢出等情况,大批量解决方法我会写在下一篇文章中,感兴趣的小伙伴可以看一下。

0 评论
内联反馈
查看所有评论