thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现
thinkphp5微信公众号二维码扫码关注推广二维码事件实现,
给出实现的全部方法:
获取二维码,让微信公众号跳转到以下代码的code方法即可,用户点击二维码后,通过二维码获取关注用户信息及二维码推广者信息,以及判断用户是否关注,具体代码逻辑在以下代码responseMsg方法,但需要在公众平台url配置接入到以下代码的index方法,用户关注后,则通过index方法访问responseMsg方法。
<?phpnamespace app\home\controller;define("TOKEN", "xieqianghui1234");use think\Controller;
use app\home\model\reIndex;class Index extends Controller{private $appId;private $appSecret;public function __construct(){$this->appId = 'wx17aaa90e1f107245'; $this->appSecret= '8bd13c549f07c6e365f818e113dee821'; }// 获取codepublic function code(){$appid = 'wx17aaa90e1f107245';$redirecturl = urlencode("http://www.neophiledesign.com/kfgzh/public/index.php/home/index/member");$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$redirecturl.'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';header('location:'.$url);}// 通过ticket换取二维码public function wechatcode($ticket){$url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.urlencode($ticket);return $this->getjson($url);}// 二维码呈现public function member(){$code = $_GET['code']; $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->appId.'&secret='.$this->appSecret.'&code='.$code.'&grant_type=authorization_code';$res = $this->curl_post($url);// 用户openid$openid = $res['openid'];$recode = (new reIndex)->reselect($openid); header("Content-Type: image/jpeg;text/html; charset=utf-8");if(!$recode){$rand = mt_rand(0,9).mt_rand(0,9).mt_rand(0,9).mt_rand(0,9);$arr = array();$arr = array('openid' => $openid,'code' => $rand,);(new reIndex)->readd($arr); $res = $this->reindex();$access_token = $res['access_token'];// 获取ticket$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$access_token;$list = array();$list = array('action_name' => 'QR_LIMIT_SCENE','action_info' => array('scene' => array('scene_id' => $rand,),), );// 获取ticket$res = $this->curl_post($url,json_encode($list),'POST');// 通过ticket换取二维码$res = $this->wechatcode($res['ticket']);$file = fopen(dirname(dirname(dirname(__DIR__)))."/image/".$rand."upload.jpg","w");fwrite($file,$res);//写入fclose($file);//关闭$img = "http://www.neophiledesign.com/kfgzh/image/".$rand."upload.jpg";}else{$img = "http://www.neophiledesign.com/kfgzh/image/".$recode."upload.jpg";}echo "<img src=$img />";}// 获取access_tokenpublic function reindex(){$appid = 'wx17aaa90e1f107245';$secret = '8bd13c549f07c6e365f818e113dee821';$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;$res = $this->curl_post($url);return $res;}// 获取用户信息及openidpublic function retest($access_token){$url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid=OPENID&lang=zh_CN';return $this->getJson($url);}// token验证public function index(){if ($this->checkSignature()==false) {die('非法请求');}if (isset($_GET["echostr"])) {$echostr = $_GET["echostr"];echo $echostr;exit();} else {$this->responseMsg();}}public function responseMsg(){//get post data, May be due to the different environments$postStr = file_get_contents("php://input");if (!empty($postStr)){libxml_disable_entity_loader(true);$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;// $keyword = trim($postObj->Content);$time = time();$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>"; if($postObj->MsgType == 'event'){$res = $this->reindex();// 获取access_token$access_token = $res['access_token'];$msgType = "text";// 通过二维码进入if(isset($postObj->EventKey) && $postObj->EventKey != ''){$tgzid = $postObj->EventKey;if(substr($tgzid,8)){$retgzid = substr($tgzid,8);$openid = (new reIndex)->rereselect($retgzid);if($openid != $fromUsername){$sharesum = (new reIndex)->reupdate($openid);$url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$fromUsername.'&lang=zh_CN';$re = json_decode($this->getjson($url),true);$contentStr = '你好,'.$re['nickname'].'欢迎关注香港葵芳!'; $url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;$data = array();$data = array("touser" => $openid,"msgtype" => "text","text" =>array("content" => "已成功分享给用户".$re['nickname']."已成功分享".$sharesum.'次'));$res = $this->getjson($url,json_encode($data,JSON_UNESCAPED_UNICODE));var_dump($res);}}else{$url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$fromUsername.'&lang=zh_CN';$re = json_decode($this->getjson($url),true);$contentStr = '你好,'.$re['nickname'].'欢迎关注香港葵芳!'; }}else{if($postObj->Event == 'subscribe'){$url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$fromUsername.'&lang=zh_CN';$re = json_decode($this->getjson($url),true);$contentStr = '你好,'.$re['nickname'].'欢迎关注香港葵芳!'; } }$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;}}else {exit;}}// public function curl_post($url, $data=null,$method='GET', $https=true){// 创建一个新cURL资源 $ch = curl_init(); // 设置URL和相应的选项 curl_setopt($ch, CURLOPT_URL, $url); //要访问的网站 //启用时会将头文件的信息作为数据流输出。curl_setopt($ch, CURLOPT_HEADER, false); //将curl_exec()获取的信息以字符串返回,而不是直接输出。 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if($https){ //FALSE 禁止 cURL 验证对等证书(peer's certificate)。 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //验证主机 } if($method == 'POST'){ curl_setopt($ch, CURLOPT_POST, true); //发送 POST 请求 //全部数据使用HTTP协议中的 "POST" 操作来发送。 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } // 抓取URL并把它传递给浏览器 $content = curl_exec($ch); //关闭cURL资源,并且释放系统资源 curl_close($ch); return json_decode($content,true);}}public function getjson($url,$data=null){$curl = curl_init();curl_setopt($curl,CURLOPT_URL,$url);curl_setopt($curl, CURLOPT_HEADER,false); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);//不为空,使用post传参数,否则使用getif($data){curl_setopt($curl,CURLOPT_POST,1);curl_setopt($curl,CURLOPT_POSTFIELDS,$data);}curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);$output = curl_exec($curl);curl_close($curl);return $output;}private function checkSignature(){$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"]; $token = TOKEN;$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){return true;}else{return false;}}}
thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现相关推荐
- PHP curl模拟表单上传文件 微信公众号素材管理接口crul文件上传核心源码
PHP curl模拟表单上传文件 微信公众号素材管理接口crul文件上传核心源码 /*** curl 上传文件* @param $url* @param $filePath* @param stri ...
- ThinkPHP5.0微信公众号开发之 微信公众号接入
ThinkPHP5.0 微信公众号接入 第一步:准备工作 首先,要有自己的公众号(这句是废话),个人可以申请微信公众号的订阅号,企业才可以申请服务号,其次要有云空间或者服务器,并且将服务器IP添加至微 ...
- 关注微信公众号使其自动发送欢迎你关注消息
关注微信公众号使其自动发送欢迎你关注消息 一般我们关注微信公众号时.他都会自动推送一条消息.欢迎您关注了某公众号.而今天我们所做的就是这个功能. 关注公众号时我们需要获取到用户的一些个人基本信息. 而 ...
- 微信公众号页面如何跳转至关注公众号页面
微信公众号页面如何跳转至关注公众号页面 1.获取微信公众号biz字段 a.点击公众号 历史文章,在浏览器中打开 b.鼠标右键,查看网页源代码 c.复制红框的字段 即为biz字段 2.拼接biz字段成完 ...
- wechat-0051,微信公众号,第三方登录—扫码绑定
声明:这边所谓的第三方登录,不是通过网页授权的方式,而是利用生成带参数的二维码,将微信号和平台账号绑定实现.如果你要做的是授权登录,请查看 https://blog.csdn.net/wrongyao ...
- 微信公众号如何配置关键词自动回复小程序链接和太阳码?
一.如何配置微信公众号关键词回复小程序链接? 1. 首先登录想要配置的公众号,找到关键词回复,点击添加回复. 2. 填写规则名称.填写关键词按需求选择全匹配或半匹配,点击文字 3. 填写如下代码,确认 ...
- 微信公众号开发中遇到的问题——支付(二)
第一次开发微信公众号,也是第一次接触微信公众号的支付,我使用的是jssdk,用h5页面调用的支付,后台使用的是java.首先声明,我不是一个愤世嫉俗的人,也不喜欢吐槽,我认为别人提供接口就已经很不错了 ...
- 基于Spring Boo微信公众号授权登录获取用户信息(附带完整源码)
简介 微信公众号开发中,必不少可少的一环:公众号授权登录.获取微信用户信息. 本地完整运行环境准备 内网渗透=>生成本地指定端口映射的外网域名 传送门:内网渗透工具Natapp使用详解 域名生成 ...
- java微信公众平台接口封装源码_微信公众号对接第三方平台(全网发布 java)源码 含 jar...
[实例简介] 微信公众号对接第三方平台(全网发布 java)源码+jar 里面有完成全网发布的源码直接tomcat部署运行和所需的jar 具体对接流程,关注我们的博客 http://blog.csdn ...
最新文章
- HDU-1789-Doing Homework again
- 特斯联再获20亿元融资,跻身AIoT独角兽,光大京东讯飞万达入股
- Web前端开发css基础样式总结
- Py之pyquery:pyquery的简介、安装、使用方法之详细攻略
- Thinkphp 逻辑与,逻辑或的复合查询
- nyoj 1216 整理图书(dp)
- 27岁博士毕业,32岁成清华博导!黄高助理教授:DenseNet发明者
- 关于三星某些系列笔记本电脑无法安装Windows10的原因及解决办法
- java 蓝桥杯算法训练 筛选号码(题解)
- 费纸箱手工制作机器人_环保手工:怎么把纸箱废物利用制作立体小猫(步骤图解)...
- linux用命令行运行matlab的.mat文件
- 如何在前端中使用protobuf(vue篇)
- Spring MVC @JsonView注解使用
- 服务器显示A40故障码,奔驰E400L仪表显示“主动车道保持系统停止运作”
- lycos搜索引擎_Lycos中国推出全新搜索引擎
- linux系统打开m3u8文件,Linux下载m3u8流视频并合并ts文件
- gma 教程 | 气候气象 | 基于 彭曼-蒙提斯法(Penman-Monteith)计算日作物参考蒸散量(ET0)
- 放弃了灰色轨迹的人,放弃了木马帝国的人(ALLyeSNO)
- 「机密计算-隐私计算」科普
- Linux命令卸载谷歌浏览器,linux系统安装和卸载google浏览器
热门文章
- dns提供商主机名_Android Pie 私人 DNS 使用教程
- 【mssql】SQL Server2012编程入门经典(第四版)(上) 读书笔记
- python搭建微信小程序卖货要收费用吗_开发一个微信小程序需要多少钱?
- 取消pycharm双击shift出现搜索框,但新版找不到ide.suppress.double.click.handler的问题解决
- 光阴似锦,关于身体保养的那些事
- MySQL性能优化(三)Buffer Pool实现原理
- 理解网络交换机的原理
- image失败 安装scikit_安装SciKitImage错误127
- Windows下的扩展文件名
- Not an managed type