LaravelWechat的使用
簡介
laravelwechat是easywechat封裝的一個包,用法比較簡單
附連結:
先簡單介紹以下功能:
微信公眾號
文件: 微信公眾號
- 公眾號授權登入(需要配置授權目錄)
- 服務訊息推送(需要配置推送連結)
- 微信推送 (透過openid進行推送)
安裝
composer require "overtrue/laravel-wechat:^6.0" // 建立配置檔案 php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"
以下是用法:
// 授權登入公共方法fun_common.php
function wechat()
{
$app = app('wechat.official_account');
return $app;
}
// 公眾號授權登入方法(這個方法會接收一個code,授權登入配置頁面到前端,前端拿到code後訪問此介面)
public function wechatLogin(LoginRequest $request) {
$code = $request->input('code');
if (blank($code)){
dd('code不能為空');
}
$app = wechat();
$user = $app->oauth->user();
$wechat_user = $user->getOriginal();
// 登入邏輯。。。
}
// 微信配置伺服器地址路由到這個控制器
public function serve(Request $request)
{
$this->wechat = wechat();
if(isset($_GET['echostr']) && !empty($_GET['echostr'])){
$this->wechat->server->push(function($message){
return $message->echostr;// 第一次繫結要用這個
});
}else{
$message = $server->getMessage();// 在閉包外呼叫$message
$this->wechat->server->push(function($message){
// $message['FromUserName'] // 使用者的 openid
// $message['MsgType'] // 訊息型別:event, text....
return '';// 什麼都不返回
return 'SUCCESS';// 或者什麼都不返回
return '你好啊'; // 或者返回文字訊息
return new Image('media-id'); // 或者返回圖片訊息
$news = new NewsItem(...);
return new News([$news]); // 或者返回多圖文訊息
// or something else
});
}
//return response.
return $this->wechat->server->serve();
}
// 微信模板訊息推送
$app->template_message->send([
'touser' => 'user-openid',
'template_id' => 'template-id',
'url' => 'https://easywechat.org',
'miniprogram' => [
'appid' => 'xxxxxxx',
'pagepath' => 'pages/xxx',
],
'data' => [
'key1' => 'VALUE',
'key2' => 'VALUE2',
...
],
]);
微信開放平臺
簡介
微信文件官網 微信官方文件
微信開放平臺文件 微信開放平臺第三方平臺(公眾號小程式等)
// 公共方法
function platFormWithRedis($name = '')
{
$openPlatform_with_redis = app('wechat.open_platform');
$cache = new RedisAdapter(app('redis')->connection()->client());
$openPlatform_with_redis->rebind('cache', $cache);// 原本使用檔案快取,換成laravel快取
return $openPlatform_with_redis;
}
// 控制器class - 方法
$this->openPlatform = platFormWithRedis();
// 微信授權事件接收 測試是否授權了,其它也可以這麼用,參考公眾號事件
public function wx_post_open_platform(){
Log::info("微信開放平臺授權事件(什麼都不做)");
return $this->openPlatform->server->serve();
}
// 授權頁面跳轉
// 點選這個連結,掃碼後跳轉到授權頁進行授權
public function get_wx_preAuthorizationUrl(){
$url = $this->openPlatform->getPreAuthorizationUrl('http://'.$_SERVER['SERVER_NAME'].'/api-ih/api/get_wx_pre_authorization_url/callback');
return view("platform_get_auth",[
'url' => $url
]);
}
// 就是上面那個方法的回撥地址處理授權,把一些資訊記錄到資料庫
public function get_wx_preAuthorizationUrl_callback(){
$auth_result = $this->openPlatform->handleAuthorize();
// 獲取掃碼授權後的回撥資料
$data['platform_authorizer_appid'] = $auth_result['authorization_info']['authorizer_appid'];
$data['platform_authorizer_access_token'] = $auth_result['authorization_info']['authorizer_access_token'];
$data['platform_expires_in'] = $auth_result['authorization_info']['expires_in'];
$data['platform_authorizer_refresh_token'] = $auth_result['authorization_info']['authorizer_refresh_token'];
$info_result = $this->openPlatform->getAuthorizer($data['platform_authorizer_appid']);
$data['platform_user_name'] = $info_result['authorizer_info']['user_name'];
// 插入或者更新資料庫的授權資料,以appid為主鍵
if (!WxPlatform::where('platform_authorizer_appid', $data['platform_authorizer_appid'])->exists()) {
$wx_platform = new WxPlatform($data);
$wx_platform->save();
}else{
WxPlatform::where('platform_authorizer_appid', $data['platform_authorizer_appid'])->update([
'platform_authorizer_access_token'=>$data['platform_authorizer_access_token'],
'platform_authorizer_refresh_token'=>$data['platform_authorizer_refresh_token']
]);
}
return "授權成功,關閉頁面即可";
}
// ...不解釋了$appid表示開放平臺變數有些業務在開放平臺處理(事件等)
// 這個方法很奇怪
function wechat($name = '', $appid = '')
{
$status = env('WECHAT_OFFICIAL_ACCOUNT_USED', false);
if ($status && $appid == '') {
// 開啟伺服器配置
Log::info("初始化伺服器配置");
$name = empty($name) ? 'wechat.official_account' : 'wechat.official_account.' . $name;
$app = app($name);
} else {
// 使用開放平臺
Log::info("初始化開放平臺");
$openPlatform_with_redis = app('wechat.open_platform');
$cache = new RedisAdapter(app('redis')->connection()->client());
$openPlatform_with_redis->rebind('cache', $cache);// 給它一個快取(原來使用php檔案快取)
$openPlatform = $openPlatform_with_redis;
$appid = env('WECHAT_OFFICIAL_ACCOUNT_APPID', ''); // 獲取後臺繫結的公眾號
$appid_account = WxPlatform::where('platform_authorizer_appid', $appid)->first(); // 透過appid,獲取公眾號的refresh_token
$app = $openPlatform->officialAccount($appid, $appid_account['platform_authorizer_refresh_token']); // 代公眾號實現業務
}
return $app;
}
// 改造後的serve
public function serve(Request $request)
{
Log::channel('wechatLog')->info('環境:'.env('DB_DATABASE')."微信事件開始執行--------");
if($request->has('appid')){ // 開放平臺事件會攜帶這個引數。。。
$appid = ltrim ($request->input('appid'),'/');
}else{
$appid = '';
}
if($appid == ''){
$this->app = wechat();
}else{
$this->app = wechat($name = '',$appid);
}
if(isset($_GET['echostr']) && !empty($_GET['echostr'])){
// 第一次繫結
$this->wechat->push(function($message){
return $message->echostr;
});
}else{
// 處理訊息
$this->wechat->push(function($message){
return '';
});
}
//return response.
return $this->app->server->serve();
}
到這裡一些東西已經結束了,以後想到什麼再補充
本作品採用《CC 協議》,轉載必須註明作者和本文連結