基于微擎-带参数 自定义接口回复

实现目标:生成带参数公众号二维码,用户扫码后根据参数回复不同链接,同时链接带上参数。同理也可用在用户发送公众号特定参数后自动回复。

举例:参数 type=1   fromUserId=123

           字段type表示回复不同图文链接,fromUserId表示邀请人id

           最后回复的链接是www.test.com?fromUserId=123

           文字说明是“李白邀请你”;

           这样可以根据二维码带的参数返回不同链接,同时再查询相关用户数据,链接再带上参数。

           上图

           

备注:微信公众号后台使用微擎管理,所以在此基础上开发。所以开发语言使用php,但本人擅长的是java,对php一知半解,如有不足或更好方法欢迎留言。

用户扫描带参数二维码后,微信服务器根据公众号后台填写的第三方服务器接口地址,发出数据请求,也就是请求到微擎的 api.php中,进入start()方法,跳转到analyze()方法,对于扫描二维码事件,会再跳转到analyzeqr(),在里面会查询qrcode表,比较其中的qrcid或者sceneid中的值是否与微信传过来的eventkey相等,如果没有,会再次查找ticket中是否有值与微信传过来的ticket相等。

关键表就是ims_qrcode

 

第一步、实现生成带参数微信二维码接口

           为方便接口我直接用php写的,同一放在微擎里。

           建表      

-- ----------------------------
-- Table structure for ims_qrcode_more
-- ----------------------------
DROP TABLE IF EXISTS `ims_qrcode_more`;
CREATE TABLE `ims_qrcode_more` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '链接',
  `image` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片地址',
  `title` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标题',
  `content` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '自定义字段',
  `descript` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '注释',
  `params` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '参数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO `ims_qrcode_more` VALUES ('1', 'http://www.test.com', 'http://www.test.com/attachment/img_3.jpg?time=1550852720', '邀请用户', '1老师邀请您加入2', '邀请链接', 'fromUserId,targetId');

          规定type对应这里主键id,查询出不同url和image 以及content 和title形成图文链接回复用户,params代表参数

   创建接口 createQrcode.php

   调用  192.168.1.1/we7/api/createQrcode.php?type=1&fromUserId=123&target=123   

<?php
    //重点 前端get请求传入参数  截取 type= 到后面所有参数作为二维码参数 长度限制64
    $params = strstr($_SERVER["QUERY_STRING"],'type=');
    $get_QR_Url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=";

    $appId = "wx12345678910";
    $secret = "123456789asdsafasdfgggdsg";
    //获取accesstoken
    $get_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$secret;

    $get_token = array (
        'http' => array (
        'method' => 'GET',
        'header'=> "Content-type: application/json;charset=utf-8"
        )
    );
    $context = stream_context_create($get_token);
    $str = file_get_contents($get_token_url, false, $context);
    $token = json_decode($str);

    $accesstoken = $token->access_token;
    
    $ssurl = $get_QR_Url . $accesstoken; 
    //生成二维码请求参数
    $param = array(
        'expire_seconds' => 3600,
        'action_name' => 'QR_STR_SCENE',
        'action_info' => array(
            'scene' =>array(
                'scene_str' => $params
            )
        )
    );

    $opts = array (
        'http' => array (
            'method' => 'POST',
            'header'=> "Content-type: application/json;charset=utf-8",
            'content' => json_encode($param)
        )
    );
    $context = stream_context_create($opts);
    $html = file_get_contents($ssurl, false, $context);
    //返回数据给前端 这里需要让前端去兑换二维码图片
    echo $html;

    $html = json_decode($html);
    
    $ticket = $html->ticket;
    $code_url = $html->url;
    $now_time_str = time();

    $servername = "192.168.1.1:3306";
    $username = "root";
    $password = "root";
    $dbname = "db";

    // 创建连接
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    // 检测连接
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }
    $sql = "DELETE FROM `ims_qrcode` WHERE `name` = '$params' AND `keyword` = '$params' ";
    mysqli_query($conn,$sql);
    //scene_str 和 keyword 必须等于参数
    $sql = "INSERT INTO `ims_qrcode` (`uniacid`, `acid`, `type`, `extra`, `qrcid`, `scene_str`, `name`, `keyword`, `model`, `ticket`, `url`, `expire`, `subnum`, `createtime`, `status`) VALUES ('1', '1', 'scene', '0', '0', '$params', '$params', '$params', '1', '$ticket', '$code_url', '3600', '0', '$now_time_str', '1')";

    if (mysqli_query($conn, $sql)) {
         //echo "新记录插入成功";
    } else {
         //echo "Error: " . $sql . "<br>" . mysqli_error($conn);
    }
    
    mysqli_close($conn);   

    exit;

说明:1 获取get请求上来的参数 params

           2 获取微信公众号accesstoken

           3 生成临时二维码请求,参数sence_str = params ,返回结果给前端

           4 储存数据到ims_qrcode  需要先删掉重复数据,scene_str 和 keyword 字段必须等于参数params,不插入数据微擎会因查不到相关信息,不进行自动回复,这点很坑。

 

第二步、设置自动回复接口

新建自动回复api文件 replay_fire.php

<?php
//二维码带的参数
$content = $this->message['content'];
//截取type
$type = 0;
$paramId_str = strstr($content,"type");
if($paramId_str != false){
    $paramId = strstr($paramId_str,"&",true);
    if($paramId != false){
        $type = intval(substr($paramId,5));    //截取长度为 参数加等号长度  type= 长度5
    }else{
        $type = intval(substr($paramId_str,5));
    }
} 

$servername = '192.168.1.1:3306';
$username = 'root';
$password = 'root';
$dbname = 'db'; 

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

$sql = "SELECT * FROM ims_qrcode_more WHERE id = $type";

$data = mysqli_query($conn,$sql);
$row = mysqli_fetch_assoc($data);

$descript = $row['content'];
//进行相关参数查询
if($type == 1){ //邀请

    $fromUserId= 0;
    $paramId_str = strstr($content,"fromUserId");
    if($paramId_str != false){
        $paramId = strstr($paramId_str,"&",true);
        if($paramId != false){
            $fromUserId= intval(substr($paramId,11));
        }else{
            $fromUserId= intval(substr($paramId_str,11));
        }
    } 
    
    $targetId= 0;
    $paramId_str = strstr($content,"targetId");
    if($paramId_str != false){
        $paramId = strstr($paramId_str,"&",true);
        if($paramId != false){
            $targetId= intval(substr($paramId,9));
        }else{
            $targetId= intval(substr($paramId_str,9));
        }
    } 

    $teacherName = '';
    if($teacherId > 0){
        $sql = "SELECT teacher_name FROM test_teacher WHERE teacher_id = $fromUserId";
        $teacher = mysqli_query($conn, $sql);
        $teacher = mysqli_fetch_assoc($teacher);
        $teacherName = $teacher['teacher_name'];
    }

    $targetName = '';
    if($curcheId > 0){
        $sql = "SELECT target_name FROM test_target WHERE target_id = $targetId";
        $target= mysqli_query($conn, $sql);
        $target= mysqli_fetch_assoc($curche);
        $targetName = $target['target_name'];
    }

    $descript = str_replace("1",$teacherName ,$descript);
    $descript = str_replace("2",$targetName ,$descript);

}else if($type == 2){

}

mysqli_close($conn);

//生成链接回复
return $this->respNews(array(
    'Title' => $row['title'],
    'Description' => $descript,
    'PicUrl' => tomedia($row['image']),
    'Url' => $row['url'] . "?" . $content
    
));

        

这个文件放在 微擎项目的 framework/builtin/userapi/api/ 目录下

使用需要在微擎设置

绑定好参数关键字带有  type=  时调用我们指定文件。

这样就可以在指定文件作相关处理。

扫码就可以进入指定接口。

同样,直接公众号输入 type=1&fromUserId=123 也能触发。

 

参考文章 :

        微擎模块处理用户扫描带参数二维码事件,以及代码实现方法    http://www.nidecun.cn/index.php/archives/7/

        微信官方生成带参数的二维码文档  https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微擎是一款基于PHP的开源微信公众号管理系统,可以帮助开发者快速搭建微信公众号应用。本篇将介绍微擎开发的基础知识,包括环境搭建、目录结构、配置文件、路由规则、模块开发等内容。 ### 环境搭建 微擎的开发需要先搭建好开发环境,包括PHP、MySQL、Apache或Nginx等。具体步骤可以参考微擎的官方文档,建议使用PHP7及以上版本。 ### 目录结构 微擎的目录结构如下: ``` addons/ // 存放插件 api/ // 存放接口文件 app/ // 存放前台模块 attachment/ // 存放上传的文件 framework/ // 存放框架核心文件 payment/ // 存放支付相关文件 static/ // 存放静态资源文件 template/ // 存放前台模板文件 upgrade/ // 存放升级相关文件 wap/ // 存放手机端模块 we7/ // 微擎的核心目录 favicon.ico // 网站图标 index.php // 入口文件 ``` ### 配置文件 微擎的配置文件主要有两个:config.php和database.php,前者用于配置微擎的基础信息,后者用于配置数据库连接信息。 config.php的配置项包括: - `setting`:微擎基础设置,如网站名称、网站域名、微信公众号AppID等; - `site`:网站设置,如首页模板、错误页面模板、静态资源路径等; - `wxapp`:小程序设置,如小程序名称、小程序AppID、小程序Secret等; - `oauth`:公众号设置,如公众号AppID、公众号Secret等; - `remote`:远程附件设置,如附件存储方式、FTP信息等; - `app`:应用设置,如开启模块、插件管理等; - `global`:全局设置,如错误处理方式、调试模式等。 database.php的配置项包括: - `master`:主数据库连接信息,如数据库类型、主机地址、数据库用户名、密码等; - `slave`:从数据库连接信息,可选; - `tablepre`:数据表前缀。 ### 路由规则 微擎的路由规则遵循MVC模式,每个请求都会依据路由规则被分配到相应的控制器和方法中。微擎的路由规则主要有两种: - URL规则:URL规则是通过URL中的参数来确定控制器和方法的,如`index.php?c=site&a=entry&m=my_module&do=my_page`; - Rewrite规则:Rewrite规则通过修改服务器配置文件,将URL中的参数转换为美观的URL,如`/my_module/my_page`。 ### 模块开发 微擎的模块开发主要包括前台模块和后台模块两种。前台模块用于展示内容,后台模块用于管理内容。 模块的目录结构如下: ``` my_module/ ├── controller/ │ ├── index.php │ └── my_page.php ├── model/ │ └── my_page.php ├── template/ │ ├── index.html │ └── my_page.html ├── module.php └── version.php ``` 其中,controller目录存放控制器文件,model目录存放模型文件,template目录存放模板文件,module.php是模块的基本信息,version.php是模块的版本信息。 控制器文件中定义了控制器和方法,模型文件中定义了数据操作方法,模板文件中定义了页面布局和样式。模块的基本信息包括模块名称、模块描述、模块图标等,版本信息包括版本号、升级文件等。 ### 小结 本篇介绍了微擎开发的基础知识,包括环境搭建、目录结构、配置文件、路由规则、模块开发等内容。掌握这些知识是进行微擎开发的基础,希望可以帮助到初学者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anciend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值