微信扫描二维码统计来源对每个公司市场分析有很大作用。而且微信为开发者提供了一个生成带参数的二维码的接口。我 研究了好久,终于搞定。现写成文档分享出来。希望对大家有帮助。
首先是创建二维码,(现在创建出来的二维码还不能实现分组,只是实现一个关注订阅号的作用)下面为亲们提供代码
public function qrcodeAdd()
{
if (IS_GET) {
$this->display('qrcode_add');
}else{
$mp = $this->mp;
$arr = I('post.');//使用post方式提交
$arr['mpid'] = $mp['id'];//获取mpid
$id = M('qrcode')->add($arr);
//$this->createTag($arr['scene_str']);//调用创建标签的方法
include APP_PATH .'LaneWeChat/lanewechat.php';//引用文件LaneWeChat目录下的lanewechat.php文件
$ret = Popularize::createTicket($arr['qr_type'],$arr['expire'],$arr['scene_str']);
//引用静态方法createTicket
if (isset($ret['ticket'])) {//获取Ticket
$qrcodefile = Popularize::getQrcode($ret['ticket']);
$ret['src'] = $qrcodefile;
$ret['create_time'] = time();
M('qrcode')->where("id=$id")->save($ret);//数据存入数据库
$this->ajaxReturn(array('status'=>1,'msg'=>'ok','url'=>U('index')));//创建成功
}else{
$this->ajaxReturn(array('status'=>0,'msg'=>$ret));//创建失败
}
}
静态方法createTicket(此静态方法在文件Popularized文件内)
public static function createTicket($type, $expireSeconds, $sceneStr){
$accessToken = getAccess_token();
$queryUrl = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$accessToken;
$queryAction = 'POST';
$template = array();
if($type == 1){
//创建临时二维码
$template['expire_seconds'] = $expireSeconds;
$template['action_name'] = 'QR_STR_SCENE';//带字符串的形式
}else{
//创建永久二维码
$template['action_name'] = 'QR_LIMIT_STR_SCENE';
}
$template['action_info']['scene']['scene_str'] = $sceneStr;
$template = json_encode($template);
// echo $template;
// exit;
return Curl::callWebServer($queryUrl, $template, $queryAction);
}
创建标签的方法 示例代码如下:(调用此方法会自动创建名为“标签”的标签,并加入名为tag的数据表中,如果有不会重复创建)
public function createTag($tagname='')
{
$mp = $this->mp;
$tagname = "标签";
$where['mpid'] = $mp['id'];
$where['tag'] = $tagname;
$data = M("tags")->where($where)->find();
if(empty($data)){
$api = "https://api.weixin.qq.com/cgi-bin/tags/create?access_token=".getAccess_token();
$arr = array();
$arr['tag']['name'] = $tagname;
$json = json_encode($arr,JSON_UNESCAPED_UNICODE);
include APP_PATH .'LaneWeChat/lanewechat.php';
$ret=Curl::callWebServer($api,$json,'POST');
if($ret['tag']){
$row['mpid'] = $mp['id'];
$row['tag_id'] = $ret['tag']['id'];
$row['tag'] = $ret['tag']['name'];
M('tags')->add($row);
}
}
}
在创建二维码的代码中加入此行代码会调用创建标签代码
$this->createTag($arr['scene_str']);//调用创建标签的方法
下面为分组代码
public static function eventQrsceneSubscribe(&$request){
/*
*用户扫描带参数二维码进行自动分组
*此处添加此代码是大多数需求是在扫描完带参数二维码之后对用户自动分组
*/
$scene_str = str_replace("qrscene_","",$request['eventkey']);
//移动用户到相应分组中去,此处的$sceneid依赖于之前创建时带的参数
$ret = self::fansGroup($request['fromusername'],$scene_str);
if($ret===true){
$content = '欢迎关注,你被分配到:' . $scene_str;
}else{
$content = '失败了,' .json_encode($ret);
}
return ResponsePassive::text($request['fromusername'],$request['tousername'],$content);
}
/**
* @descrpition 扫描二维码(已关注时)
* @param $request
* @return array
*/
public static function eventScan(&$request){
if(isset($request['eventkey']) && isset($request['ticket'])){
$scene_str = $request['eventkey'];
$ret = self::fansGroup($request['fromusername'],$scene_str);
if($ret===true){
$content = '分配到:' . $scene_str;
}else{
$content = '失败了,' .json_encode($ret);
}
}
return ResponsePassive::text($request['fromusername'],$request['tousername'],$content);
}
private static function fansGroup($openid,$tagname){
include APP_PATH . 'LaneWeChat/lanewechat.php';
$id = $_GET['id'];
$where['mpid']=$id;
$where['tag'] = $tagname;
$data = M("tags")->where($where)->find();
if(!empty($data)){
$api = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=".getAccess_token();
$arr = array();
$arr = ['openid_list'=>array($openid),'tagid'=>(int)$data['tag_id']];
$json = json_encode($arr);
$ret=\LaneWeChat\Core\Curl::callWebServer($api,$json,'POST');
if(isset($ret['errcode']) && $ret['errcode']==0){
return true;
}else{
return $ret;
}
}else{
return '无此标签' . $tagname;
}
}
让用户扫描生成的带标签的二维码,会关注并自动分组。
感谢您的观看。