php+laravel 扫码二维码签到功能


Posted in PHP onMay 15, 2021

简介

为满足公司签到业务场景 最终敲定使用微信二维码来实现

微信公众号相关配置
在微信公众平台登陆上去后,点开开发中的基本配置看到的基本信息

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二维码签到内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP SQLite类
May 07 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
简述php环境搭建与配置
Dec 05 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
解析laravel使用workerman用户交互、服务器交互
Apr 28 #PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 #PHP
如何使用php生成zip压缩包
Apr 21 #PHP
PHP使用非对称加密算法RSA
You might like
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
PHP中SESSION过期设置
2021/03/09 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
JS定时器实例
2013/04/17 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
python判断正负数方式
2020/06/03 Python
python入门教程之基本算术运算符
2020/11/13 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
母亲80寿诞答谢词
2014/01/16 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
工地标语大全
2014/06/18 职场文书