php二维码签到 php+laravel 扫码二维码签到功能
phper-wgy 人气:0想了解php+laravel 扫码二维码签到功能的相关内容吗,phper-wgy在本文为您仔细讲解php二维码签到的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:php二维码签到,php微信二维码,下面大家一起来学习吧。
简介
为满足公司签到业务场景 最终敲定使用微信二维码来实现
微信公众号相关配置
在微信公众平台登陆上去后,点开开发中的基本配置看到的基本信息
框架及拓展包
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); } }
以上是我的使用心得 谢谢大家!
加载全部内容