php+laravel 掃碼二維碼簽到功能
簡介
為滿足公司簽到業務場景 最終敲定使用微信二維碼來實現
微信公眾號相關配置
在微信公眾平臺登陸上去後,點開開發中的基本配置看到的基本信息
框架及拓展包
laravel overtrue/laravel-wechat 安裝方式:composer require "overtrue/laravel-wechat:^6.0"
詳細瞭解請看:laravel-wechat
配置文件及對應信息
config/wechat.php /* * 公眾號 */ 'official_account' => [ 'default' => [ 'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', 'your-app-id'), // AppID 'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', 'your-app-secret'), // AppSecret 'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'your-token'), // Token 'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', ''), // EncodingAESKey ], ],
生成二維碼
<?php namespace App\Model\WeChat; use Illuminate\Database\Eloquent\Model; class Qrcode extends Model { private static $app; public function __construct(){ self::$app = app('wechat.official_account'); } /** * @title 生成臨時二維碼 * @param $action_info * @param float|int $expire_seconds * @return $result * @return $result[ticket] 獲取的二維碼ticket,憑借此ticket可以在有效時間內換取二維碼。 * @return $result[expire_seconds] 該二維碼有效時間,以秒為單位。 最大不超過2592000(即30天) * @return $result[url] 二維碼圖片解析後的地址,開發者可根據該地址自行生成需要的二維碼圖片 * @return $result[url1] 通過ticket換取二維碼後地址 */ public function temporary($action_info,$expire_seconds = 30*24*60*60){ $result = self::$app->qrcode->temporary($action_info, $expire_seconds); $ticket = $result['ticket']; $url = $this -> qrcode_url($ticket); $result['url1'] = $url; $result['action_info'] = $action_info; return $result; } /** * @title 生成永久二維碼 * @param $action_info * @return $result * @return $result[ticket] 獲取的二維碼ticket,憑借此ticket可以在有效時間內換取二維碼 * @return $result[expire_seconds] 該二維碼有效時間,以秒為單位。 最大不超過2592000(即30天) * @return $result[url] 二維碼圖片解析後的地址,開發者可根據該地址自行生成需要的二維碼圖片 * @return $result[url1] 通過ticket換取二維碼後地址 */ public function forever($action_info){ $result = self::$app->qrcode->forever($action_info); $ticket = $result['ticket']; $url = $this -> qrcode_url($ticket); $result['url1'] = $url; $result['action_info'] = $action_info; return $result; } /** * @title 獲取二維碼url * @param $ticket * @return $url 二維碼url */ public function qrcode_url($ticket){ $url = self::$app->qrcode->url($ticket); return $url; } }
實現一個簡單的推送
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Log; class WeChatController extends Controller { /** * 處理微信的請求消息 * * @return string */ public function serve() { Log::info('request arrived.'); # 註意:Log 為 Laravel 組件,所以它記的日志去 Laravel 日志看,而不是 EasyWeChat 日志 $app = app('wechat.official_account'); $app->server->push(function($message){ return "hello everyone!"; }); return $app->server->serve(); } }
處理事件
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Log; use Illuminate\Http\Request; use App\Model\SCAN; class WeChatController extends Controller { /** * 處理微信的請求消息 * * @return string */ public function serve() { Log::info('request arrived.'); # 註意:Log 為 Laravel 組件,所以它記的日志去 Laravel 日志看,而不是 EasyWeChat 日志 $app = app('wechat.official_account'); $app->server->push(function($message){ case 'event': switch ($message['Event']) { case 'subscribe': //關註事件, 掃描帶參數二維碼事件(用戶未關註時,進行關註後的事件推送) return "hello everyone!"; break; case 'unsubscribe': //取消關註事件 break; case 'SCAN': //掃描帶參數二維碼事件(用戶已關註時的事件推送) $obj = new SCAN(); //處理掃碼相關業務邏輯 $info = $obj -> index($message); Log::info($info); return $info; break; default: return $message['Event']; break; } break; }); return $app->server->serve(); } }
業務模塊並推送模版消息
<?php namespace App\Model; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; class SCAN extends Model { //掃碼 public function index($message){ $openid = $message['FromUserName']; $evenkey = $message['EventKey']; $preg = '/^aaa-/'; preg_match_all($preg,$evenkey,$evenkey_arr); if(!empty($evenkey_arr[0])){ $new_evenkey = $evenkey_arr[0][0]; $reg = "/^$new_evenkey/"; $evenkey = trim(preg_replace($reg, ' ', $evenkey)); if($new_evenkey == "aaa-"){ //生成二維碼時所傳人的參數 $this -> operation($evenkey,$openid); } }else{ return; } } /** * @param evenkey 參數 * @param openid 要向哪個用戶推送信息 */ public function operation($evenkey,$openid) { //此處省略業務邏輯 根據一個狀態判斷 大傢直接套用就好 $status = 1; if($status == 1){ $this->success($openid); }else{ $this->error($openid); } } /** * @title 掃碼成功 * @param openid 用戶openid */ public function success($openid){ $app = app('wechat.official_account'); //這裡可以填寫您選擇的公眾號中模版消息的模版id $template_id = ''; //$data是模版中的詳細內容 按照微信中的內容進行填寫 下面隻是一個例子 $data = array( "first" => '', "keyword1" => '', "keyword2" => '', "keyword3" => date('Y-m-d H:i'), "keyword4" => '', "remark" => '' ); //最後發送的信息 $info = [ 'touser' => $openid, 'template_id' => $template_id, 'url' => '', 'data' => $data, ]; return $app -> template_message ->send($info); } /** * @title 掃碼失敗 * @param openid 用戶openid */ public function error($openid){ $app = app('wechat.official_account'); //這裡可以填寫您選擇的公眾號中模版消息的模版id $template_id = ''; //$data是模版中的詳細內容 按照微信中的內容進行填寫 下面隻是一個例子 $data = array( "first" => '', "keyword1" => '', "keyword2" => '', "keyword3" => date('Y-m-d H:i'), "keyword4" => '', "remark" => '' ); //最後發送的信息 $info = [ 'touser' => $openid, 'template_id' => $template_id, 'url' => '', 'data' => $data, ]; return $app -> template_message ->send($info); } }
以上是我的使用心得 謝謝大傢!
到此這篇關於php+laravel 掃碼二維碼簽到功能的文章就介紹到這瞭,更多相關php二維碼簽到內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!