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