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

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

举例:参数 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Anciend

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

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

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

打赏作者

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

抵扣说明:

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

余额充值