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警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
php中file_get_contents与curl性能比较分析
Nov 08 PHP
php中动态调用函数的方法
Mar 16 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
PHP6新特性分析
Mar 03 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
php批量删除操作(数据访问)
May 23 PHP
php curl操作API接口类完整示例
May 21 PHP
PHP字符串和十六进制如何实现互相转换
Jul 16 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实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
Maps Javascript
2007/01/22 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
javascript数组常用方法汇总
2016/09/10 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
通过cmd进入python的实例操作
2019/06/26 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
会计系毕业个人自荐信格式
2013/09/23 职场文书
前台文员岗位职责及工作流程
2013/11/19 职场文书
一名女生的自荐信
2013/12/08 职场文书
医药工作岗位求职信分享
2013/12/31 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
常务副总经理任命书
2014/06/05 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
2014年保管员工作总结
2014/11/18 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
初中历史教学反思
2016/02/19 职场文书
浅谈Java父子类加载顺序
2021/08/04 Java/Android