微信公众号点击菜单即可打开并登录微站的实现方法


Posted in PHP onNovember 14, 2014

本文实例讲述了微信公众号点击菜单即可打开并登录微站的实现方法。分享给大家供大家参考。具体分析如下:

总体来说,微信公众号点击菜单即可打开并登录微站实现步骤比较复杂,但很多微站在己用上了,本文对此进行整理归纳,相信可以给大家带来一定的参考借鉴价值。

现在大部分微站都通过用户的微信openid来实现自动登录。在我之前的开发中,用户通过点击一个菜单,公众号返回一个图文,用户点击这个图文才可以自动登录微站。但是如果你拥有高级接口,就可以实现点击菜单,打开网页就能获取这个openid,实现自动登录。
这里已经提到,必须要拥有高级接口的权限(服务号、企业号),开启了开发者模式。

1.设置回调地址

在微信公众平台后台“开发者中心”中找到“高级接口”下的“OAuth2.0网页授权”,后面有一个“修改”,点击之后就会弹出填写回调地址的对话框。具体如何授权,请点击这里学习。只有获得高级接口权限后,才能出现这个地方的“修改”。
注意,这里填写的是域名,不是带的网址,而且解释中很清楚,“授权回调域名配置规范为全域名”,也就是说带www和不带是不同的两个域名。因此我这里要填写如下图中的域名。

微信公众号点击菜单即可打开并登录微站的实现方法

2. 创建菜单

创建菜单可以通过你的微站后台创建,如果没有开启开发者模式,也可以通过微信公众平台后台创建。
菜单使用点击打开链接的模式,也就是view模式。如果你是使用开发者模式,通过向微信提交如下代码,即可创建公众号菜单(开发者文档):

{

     "button":[

     { 

          "type":"view",

          "name":"登录微站",

          "url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid={在微信公众平台后台获取这个APPID}&redirect_uri={你填写的回调域名下的地址}&response_type=code&scope=snsapi_base&state=1#wechat_redirect"

      }]

}

代码1 要提交的菜单代码,下面要用到
APPID的获取位置就是上面你填写回调地址的那个“开发者中心”。下面我们用PHP来实现一下菜单提交:
<?php

function curl_info($appid,$secret) {

  $ch = curl_init(); 

  curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret);

  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");

  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 

  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');

  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

  curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 

  // curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

  $tmpInfo = curl_exec($ch); 

  if (curl_errno($ch)) {  

    echo 'Errno'.curl_error($ch);

  }

  curl_close($ch); 

  $arr= json_decode($tmpInfo,true);

  return $arr;

}

function curl_menu($ACCESS_TOKEN,$data) {

  $ch = curl_init(); 

  curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$ACCESS_TOKEN); 

  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");

  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 

  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');

  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

  curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 

  curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

  $tmpInfo = curl_exec($ch); 

  if (curl_errno($ch)) {

    echo 'Errno'.curl_error($ch);

  }

  curl_close($ch); 

  $arr= json_decode($tmpInfo,true);

  return $arr;

}

function creat_menu() {

  $ACCESS_LIST= curl_info(APP_ID,APP_SCR);//获取到的凭证,你需要自己define APP_ID和APP_SCR(应用密钥),这个也是在微信公众平台后台开发者中心找

  if($ACCESS_LIST['access_token']!='') {

    $access_token = $ACCESS_LIST['access_token'];//获取到ACCESS_TOKEN

    $data = '把上面代码1拷贝黏贴在这里';

    $msg = curl_menu($access_token,preg_replace("#u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '1'))", $data));

    if($msg['errmsg']=='ok') {

      die('创建自定义菜单成功!');

    }

    else {

      die('创建自定义菜单失败!');

    }

  }

  else {

    die('创建失败,微信AppId或微信AppSecret填写错误');

  }

}

create_menu();

?>

代码2 用PHP来创建微信公众号菜单

代码2其实有点冗余了,核心部分用红色标出来了。就这样,你的微信公众号中应该很快就可以看到创建了一个“登录微站”的菜单。点击这个菜单就可以实现登录微站了。
如果你不需要PHP,可以直接在微信公众平台后台的菜单自定义中写链接就可以了。

微信公众号点击菜单即可打开并登录微站的实现方法

在上图中的这个地方,选择打开链接的方式创建菜单。OK,接下来把上面那个链接放进去:

https://open.weixin.qq.com/connect/oauth2/authorize?appid={在微信公众平台后台获取这个APPID}&redirect_uri={你填写的回调域名下的地址}&response_type=code&scope=snsapi_base&state=1#wechat_redirect

创建菜单就可以了。
当然,你也有可能只需要在你自己的微信管理后台加入这个链接就可以了。

3.在回调页获取openid

细心的你可能已经发现了,上面的链接地址中含有参数scope=snsapi_base,而非scope=snsapi_userinfo,因为使用前者不需要用户点击一个授权按钮,直接跳转到回调页面,而后者需要点击授权按钮,不过点击授权按钮有好处,一是可以在没有关注公众号的情况下也可以授权,二是授权后可以获得用户的一些信息,如昵称、性别、所在地。但是我们是为了利用openid进行登录,所以直接选择前者就可以了。

点击菜单之后,经过微信authorize的处理,会跳转到你提交的回调地址(这里需要提醒,回调地址最好不要带参数,例如xxx/?callback=from_weixin,因为微信跳转到你的回调地址也要带参数,而这个参数就你需要的)。微信跳转到如下URL:
回调地址/?code=CODE&state=1

上面代码可以通过$_GET['code']获得一个CODE值,利用这个CODE值和appid,可以获得openid和access_token。
下面再用PHP来实现以下:

if($_GET['code']) {

  $code = $_GET['code'];

  $data = get_by_curl('https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSRC&code='.$code.'&grant_type=authorization_code');

  $data = json_decode($data);

  $openid = $data->openid;

  $access_token = $data->access_token;

}

function get_by_curl($url,$post = false){

    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$url);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    if($post){

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_POSTFIELDS,$post);

    }

    $result = curl_exec($ch);

    curl_close($ch);

    return $result;

}

这样可以就可以获得openid和access_token,利用这些值,我们还可以利用微信公众平台的获取用户基本信息api接口获取用户基本信息。

希望本文所述对大家基于PHP的微信公众号开发有所帮助。

PHP 相关文章推荐
社区(php&amp;&amp;mysql)三
Oct 09 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
几款免费开源的不用数据库的php的cms
Dec 19 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
PHP调用wsdl文件类型的接口代码分享
Nov 19 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
php制作动态随机验证码
Feb 12 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
php+curl 发送图片处理代码分享
Jul 09 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 PHP
php异步多线程swoole用法实例
Nov 14 #PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 #PHP
PHP合并静态文件详解
Nov 14 #PHP
php判断类是否存在函数class_exists用法分析
Nov 14 #PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
Nov 14 #PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 #PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 #PHP
You might like
php UTF8 文件的签名问题
2009/10/30 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python引用DLL文件的方法
2015/05/11 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python之django母板页面的使用
2018/07/03 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
详解Python 函数如何重载?
2019/04/23 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
理工类毕业自我鉴定
2014/02/20 职场文书
监察建议书范文
2014/03/12 职场文书
运动会标语
2014/06/21 职场文书
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers