php微信关注公众号或扫码实现获取用户信息(内含简易框架搭建,可复用)

概述

用户可通过扫描二维码进行关注或单纯进行扫码操作,实现获取用户微信信息,提高公众号关注率

详细

流程

准备工作

准备公众号及配置

本文用测试公众号进行配置举例

相关接口文档

获取access_token

文档:获取access_token

生成临时带参二维码

临时带参二维码方式进行生成二维码,再采用微信事件回调进行用户信息获取。
带参二维码生成文档:生成带参二维码

用户事件回调

用户在进行扫码或其他事件,微信会进行事件回调。
微信事件回调文档:微信事件回调

获取用户详细信息

获取用户详细信息:获取用户详细信息

详细程序实现-仅供参考

<?php/*** Class WechatController** @package \\${NAMESPACE}*/
class WechatController extends BaseController
{private $_token = "onepie";private $appid = '******';private $secrect = '******';private $accessToken = '';static $qrcode_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?";static $token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";static $qrcode_get_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?";public function indexAction(){$fqid = rand(1000000, 99999999);$ACCESS_TOKEN = $this->getToken($this->appid, $this->secrect);$url = $this->getQrcodeurl($ACCESS_TOKEN, $fqid, 2);file_put_contents(LOG_PATH . '/wx.log', $fqid, FILE_APPEND);$img_url = $this->DownLoadQr($url, 'qrcode');$this->setData('qrcode_url', $img_url);$this->setView('index');}/*** 获取关注二维码ticket* @param     $ACCESS_TOKEN* @param     $fqid* @param int $type** @return bool|string*/protected function getQrcodeurl($ACCESS_TOKEN, $fqid, $type = 1){$url = self::$qrcode_url . 'access_token=' . $ACCESS_TOKEN;if ($type == 1) {//生成永久二维码$qrcode = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_str": ' . $fqid . '}}}';} else {//生成临时二维码$qrcode = '{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": ' . $fqid . '}}}';}$result = http_post_data($url, $qrcode);$oo = json_decode($result[1]);if (empty($oo->ticket)) {return false;}if (!$oo->ticket) {$this->ErrorLogger('getQrcodeurl falied. Error Info: getQrcodeurl get failed');exit();}$url = self::$qrcode_get_url . 'ticket=' . $oo->ticket . '';echo $oo->ticket;return $url;}/*** 保存二维码到服务器* 可直接进行展示不进行存储,看业务需求** @param $url* @param $filestring** @return bool|string*/protected function DownLoadQr($url, $filestring){if ($url == "") {return false;}$filename = $filestring . rand(0, 99999999999) . '.jpg';ob_start();readfile($url);$img = ob_get_contents();ob_end_clean();/*if (!file_exists('/public/qrcode/' . $filename)) {touch('/public/qrcode/' . $filename);}*/$file = PUBLIC_PATH . 'qrcode/' . $filename;$fp2 = fopen($file, "a");if (fwrite($fp2, $img) === false) {$this->ErrorLogger('dolwload image falied. Error Info: 无法写入图片');exit();}fclose($fp2);return '/public/qrcode/' . $filename;}/*** @param $appid* @param $appsecret** @return mixed* 获取token*/protected function getToken($appid, $appsecret){$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $appsecret;$token = request_get($url);$token = json_decode(stripslashes($token));$arr = json_decode(json_encode($token), true);$access_token = $arr['access_token'];return $access_token;}public function serviceAction(){$this->showPage = false;$echoStr = @$_GET["echostr"];if (!isset($echoStr)) {$this->responseMsg();} else {$this->valid();}}public function valid(){$nonce = $_GET['nonce'];$token = $this->_token;$timestamp = $_GET['timestamp'];$echostr = $_GET['echostr'];$signature = $_GET['signature'];//形成数组,然后按字典序排序$array = array($nonce, $timestamp, $token);sort($array);//拼接成字符串,sha1加密 ,然后与signature进行校验$str = sha1(implode($array));if ($str == $signature) {echo $echostr;exit;}}/*** 微信事件推送接收方法*/public function responseMsg(){$postStr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");if (!empty($postStr)) {$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);// 微信消息类型$RX_TYPE = trim($postObj->MsgType);switch ($RX_TYPE) {case "text":// 文本消息$resultStr = $this->handleText($postObj);break;case "event":// 事件推送$resultStr = $this->handleEvent($postObj);break;default:$resultStr = "Unknow msg type: " . $RX_TYPE;break;}echo $resultStr;} else {echo "";exit;}}/*** 微信文本消息* @param $postObj*/public function handleText($postObj){$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><FuncFlag>0</FuncFlag></xml>";if (!empty($keyword)) {$msgType = "text";$contentStr = "欢迎您关注";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;} else {echo "lalala";}}/*** 获取时间消息并解析相应参数* 提供数据简单推送(自动回复)* @param $object** @return string*/public function handleEvent($object){$contentStr = "";switch ($object->Event) {case "subscribe":$contentStr = "感谢您关注【测试账号】";$openid = (string)$object->FromUserName; //数据类型转换为字符串,mmp这个问题找了好久$refer_id = explode('_', $object->EventKey); //$object->EventKey返回的是qrsence_123这种类型$this->createuserinfo($openid, $refer_id[1]);//获取用户信息break;case "SCAN":$contentStr = "您已关注过,谢谢!";$openid = (string)$object->FromUserName; //数据类型转换为字符串,mmp这个问题找了好久$refer_id = explode('_', $object->EventKey); //$object->EventKey返回的是qrsence_123这种类型$this->createuserinfo($openid, $refer_id[0]);//获取用户信息break;}$resultStr = $this->responseText($object, $contentStr);return $resultStr;}/*** 消息回复模板* @param     $object* @param     $content* @param int $flag** @return string*/public function responseText($object, $content, $flag = 0){$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>%d</FuncFlag></xml>";$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);return $resultStr;}/*** 获取用户详细信息* @param $openid* @param $refer_id*/public function createuserinfo($openid, $refer_id){$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" . $this->getToken($this->appid, $this->secrect) . "&openid=" . $openid;$user = request_get($url);$user = json_decode($user, true);$users = array('openid' => $openid,'nickname' => $user['nickname'],'avatar' => $user['headimgurl'],'sex' => $user['sex'],'unionid' => $user['unionid'],'status' => 1,'reg_time' => $user['subscribe_time'],//关注公众号的时间'bind_user' => $refer_id);$user_str = date('Y-m-d H:i:s') . "\t";foreach ($users as $key => $value) {$user_str .= $key . '=' . $value . "\t";}$user_str .= "\n";file_put_contents(LOG_PATH . "wx.log", $user_str, FILE_APPEND);}}

PHP 实现微信关注公众号或扫码实现获取用户信息相关推荐

  1. 小白专用微信公众号网页授权通过code获取用户信息

    新手小编 本人已入坑2年也是通过在哈尔滨图灵云培训学习的Java,且年龄也比较大的码农 目前在北京也是刚刚才接触微信公众号的网页开发所得经验进行跟大家分享 因为代码写的少大多都是无用的重复代码,请大家 ...

  2. 关于微信(公众号)扫码登录

    ** 思路: ** 每个用户都拥有一个唯一的openid,一个用户对应一个session_id. (公众号扫码推事件)扫码,将这两个信息通过微信服务器发送到开发者服务器. 开发者服务器将信息存入缓存或 ...

  3. Java微信公众号开发微信网页授权之前端传递code方式获取用户信息

    本片博客讲解的网页授权分为两步,前端先传递backUrl(回调地址)到后台网页授权接口,该接口拿到回调地址后组装授权连接,重定向到前端页面,前端页面截取Code,传入后端获取用户信息方法,获取用户信息 ...

  4. 手机短信直接跳转到微信关注公众号或者添加好友的方案

    近期有发现越来越多的广告行业的同仁在寻找如何提升在公众号/个人微信吸粉的通道,因为成本暴涨,各个广告渠道又不是很稳定,所以很多人都在咨询如何降低成本,在微信的广告渠道是有限的并且非常贵,所以只能通过外 ...

  5. 微信跳转,wxtz,跳转微信关注公众号

    微信跳转,wxtz,跳转微信关注公众号,从app或者网页浏览器跳转到微信打开公众号关注界面或者添加好友! 通过weixin://dl/business/?ticket=XXX,能够打开微信并且打开指定 ...

  6. 实现手机浏览器跳转微信关注公众号

    今天讲讲微信跳转的那些事情,这项技术最早出现在在线广告上面,可以从外部引流到微信并打开微信内置浏览器然后打开一个指定的网页地址,在这个网页里面可以放任何想推广的内容,可以是引导文案.活动内容,或者是一 ...

  7. 微信小程序如何进行登录授权和获取用户信息

    微信小程序如何进行登录授权和获取用户信息

  8. 微信公众号免扫码登录的方法

    一.常规操作 每次登录公众号时,掏出手机扫一扫方能登录公众号,而且这个扫码动作只能是使用摄像头扫,不能是扫二维码图片. 如果在同一电脑上登陆过一次,后续登录时,只需要点下登录就可以,如下: 这样貌似也 ...

  9. 微信关注公众号获取用户信息

    原本以为,获取用户信息,只能通过微信授权,后来才知道在关注公众号的时候,也可以获取到用户信息,而且这两种获取用户信息的方式是不同的,也没有什么交集 关注公众号,是通过接收事件推送,事件推送:关注成功, ...

最新文章

  1. ICRA 2021| 聚焦距离的Camera-IMU-UWB融合定位方法
  2. 数据蒋堂 | 倍增分段技术
  3. 面试官绝杀:系统是如何支撑高并发的?
  4. Winform中在FastReport的PreviewControl预览控件中对report控件模板中控件值进行修改
  5. HTTP请求报文和响应报文中的实体数据
  6. RocketMQ集群知识介绍
  7. Unity3D面试ABC
  8. 揭秘!信息检索技术高端玩法
  9. udp模拟tcp java_Java简单实现UDP和TCP
  10. bapi sap 创建物料_DEMO: MIRO 根据物料创建贷项凭证BAPI_INCOMINGINVOICE_CREATE
  11. JavaWeb一些常用操作
  12. 计算机端口连接失败,电脑Telnet命令提示在端口23连接失败的解决办法
  13. 2022年ICASSP说话人日志(Speaker Diarization)方向论文泛读总结
  14. Pandas:利用Styler对象设置Series、Dataframe在Jupyter Notebook中的输出样式(3)——格式化显示值、内置显示值格式化方法、表格外观、样式复用
  15. 深恶痛绝!关闭win10自动更新的办法
  16. 第二次·2020-09-21
  17. android 帧动画监听,Android 动画(View动画,帧动画,属性动画)详细介绍
  18. 华为m3现在还能用吗_现在买二手华为平板m3还能用吗?
  19. Beyond Compare 的开源替代工具meld
  20. python如何爬有道翻译_如何利用Python网络爬虫来获取有道翻译翻译接口--手机版的哦!...

热门文章

  1. Android linux adb安装操作命令图解
  2. 计算机认识键盘的教案,《认识键盘》的教学设计
  3. 阿里云机器学习平台PAI与华东师范大学论文入选SIGIR 2022
  4. 【愚公系列】2022年12月 .NET CORE工具案例-滑块验证码和拼图验证功能实现
  5. teradata 查看 表定义_teradata建表DDL
  6. 帆软多个报表合并成一个excel 下载
  7. Android WiFi文件共享实现
  8. IMEI是什么? 怎样查手机串号IMEI
  9. php定界符格式输出变量,php定界符和几种输出方式
  10. 根目录扩容(红帽系列,版本1)