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


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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
Aug 19 PHP
通用PHP动态生成静态HTML网页的代码
Mar 04 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
php将金额数字转化为中文大写
Jul 09 PHP
PHP实现获取并生成数据库字典的方法
May 04 PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP通过文件保存和更新信息的方法分析
Sep 12 PHP
tp5框架的增删改查操作示例
Oct 31 PHP
laravel框架创建授权策略实例分析
Nov 22 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
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
在PHP中利用XML技术构造远程服务(上)
2006/10/09 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
javascript import css实例代码
2008/07/18 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
js表单验证实例讲解
2016/03/31 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
用pycharm开发django项目示例代码
2019/06/13 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
大专生的学习自我评价
2013/12/04 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
年度考核评语
2014/01/19 职场文书
经典婚礼主持词
2014/03/13 职场文书
活动倡议书范文
2014/05/13 职场文书
学生上课说话检讨书
2014/10/25 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
幼师求职自荐信
2015/03/26 职场文书