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