微信公众平台开发1-OAuth2.0网页授权(含源码)

微信公众平台支付-OAuth2.0网页授权接口、网页授权接口详解(含源码)
作者: 孟祥磊-《微信公众平台开发实例教程》

当微信支付的高档应用中,几乎都见面动用到该接口,因为经过该接口,可以博到用户的微信基础信息,其中的用户唯一标识OpenID是微信下中最长用到的参数有,近期时有发生好多学员一直问,所以我勾勒下这首文章。

 

1.网页授权接口的意

开发者通过网页授权接口,可取得到用户的主导信息,包括OpenID、昵称、用户资料填写的省、城市、国家及头像地址,以促成业务逻辑。

同平是赢得用户中心信息的用户管理受到之“获取用户信息”接口相比,网页授权接口无论用户是否关心了公众号,都得正常获取到用户信息,而用户管理面临之“获取用户信息”接口则必须关注群众号才可抱。

2.网页授权接口模式介绍

微信公众平台网页授权接口有少数种模式,分别是scope为snsapi_base和scope为snsapi_userinfo,根据微信下之两样需求,会动不同的模式,两栽模式各有利弊。

(1)以snsapi_base为scope发起的网页授权。

l  
优点:静默授权,直接跨越反到到回调页,不会见弹来“确认登陆”页面,用户感知较好

l   缺点:仅只是收获到用户的OpenID,在得取其他用户信息时莫适用

(2)以snsapi_userinfo为scope发起的网页授权。

l  
优点:除用户OpenID外,还足以得到到用户的,昵称、用户资料填写的省区、城市、国家以及头像地址

l  
缺点:用户进入页面时见面弹来“确认登陆”也就是同意授权的页面,单击“确认登陆”按钮后,才会超越反到回调页,用户感知较差

  注意:对于已经关注该群众号的用户,如果打公众号的对或者打定义菜单上本公众号的网页授权页,即使是为snsapi_userinfo为scope发起的网页授权,也是静默授权,不会见弹来“确认”登陆界面。

3.数据传流程解析
  以snsapi_base为scope发起的网页授权,当用户进入以网页授权的网页时,会带动达code参数,通过该参数,并调用接口,可落到一个非正规之access_token以及用户的OpenID,程序可因拖欠参数继续运行,流程如图所示。

图片 1

  以snsapi_userinfo为scope发起的网页授权,与因snsapi_base为scope发起的网页授权不同的凡,首先会见进来“确认登陆”,也就是授权页面,用户同意授权后,会跨反至回调页,并带达code参数,通过该参数,并调用接口,可得到一个与众不同的access_token以及用户之OpenID,此时,scope为snsapi_userinfo时,即可通过access_token和OpenID获取用户的主导信息了。

  

4.网页授权接口注意事项

(1)网页授权接口暂时只支持认证后底服务号调用。

(2)在微信公众号调用用户网页授权接口之前,开发者需要事先到民众平台官网被的“开发
→ 接口权限 → 网页服务 → 网页帐号 →
网页授权获取用户基本信息”的部署选中,配置授权回调域名,如图所示。请留心,这里填写的凡域名(是一个字符串),而不是URL,因此请求不加
http:// 等协议头。

 图片 2

(3)授权回调域名配置标准为全域名,比如用网页授权的域名为:www.qq.com,如图所示,配置以后此域名下面的页面http://www.qq.com/music.html
、 http://www.qq.com/login.html
都可以开展OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、
http://qq.com无法进行OAuth2.0鉴权。

(4)回调页面域名需使用假名、数字与“-”的结合,不支持IP地址、端口号及短链。填写的域名需与事实上回调URL中的域名相同。填写的域名须通过ICP备案的证实。

图片 3

5.scope参数为snsapi_base的网页授权接口调用实例

步骤

(1)获取code

(2)通过code换取access_token以及OpenID

(1)获取code

每当担保微信公众账号有授权作用域scope参数为snsapi_base的前提下,引导微信用户打开如下格式页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect\_uri=REDIRECT\_URI&response\_type=code&scope=snsapi\_base&state=STATE\#wechat\_redirect

假设提示“该链接无法访问”,请检查参数是否填写错误,是否具scope参数对应的授权作用域权限。

参数说明,如表所示:

scope为snsapi_base时接口调用参数说明

参数

是否必须

说明

appid

公众号的唯一标识

redirect_uri

授权后重定向的回调链接地址,请使用urlencode对链接进行处理

response_type

返回类型,请填写code

scope

应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid)

state

重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

#wechat_redirect

无论直接打开还是做页面302重定向时候,必须带此参数

 

走访该链接后,会跨反到回调页,即redirect_uri/?code=CODE&state=STATE,如果转调页是“http://www.xxx.qq/test.php”,code是微信自动分配的,也就是上面链接中获取到的response\_type的值,每次访问都不同,假设code为“031cEhnA1qGrf10uzzoA1n3jnA1cEhn1”回调页即为:

“http://www.xxx.qq/test.php/?code=031cEhnA1qGrf10uzzoA1n3jnA1cEhn1&state=STATE”。

 

(2)通过code换取access_token以及OpenID

扭曲调页带及之code参数可经过GET方式获得,即$_GET[‘code’];并经点名接口地址获取access_token以及OpenID。

接口调用地址:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

调用参数说明,如表所示:

获取access_token以及OpenID调用参数说明

参数

是否必须

说明

appid

公众号的唯一标识

secret

公众号的appsecret

code

填写第一步获取的code参数

grant_type

填写为authorization_code  

 

回到说明:

常规状态下,微信会返回JSON数据包给公众号:

{ “access_token”:”ACCESS_TOKEN”,

 “expires_in”:7200,

 “refresh_token”:”REFRESH_TOKEN”,

 “openid”:”OPENID”,

 “scope”:”SCOPE” }

 

回来参数说明:

返参数说明

参数

描述

access_token

网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

expires_in

access_token接口调用凭证超时时间,单位(秒)

refresh_token

用户刷新access_token

openid

用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID

scope

用户授权的作用域,使用逗号(,)分隔

 

荒唐时微信会返回JSON数据包如下(示例为Code无效错误):

{“errcode”:40029,”errmsg”:”invalid code”} 

5.程序

<?php
/*
    以snsapi_base为scope发起的网页授权
    获取access_token,openid
*/
require('wei_function.php');
$appid="wx78478e595939c538";
$secret="5540e8ccab4f71dfad752f73cfb85780";
$code=$_GET['code'];
$OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$OAuthinfo=json_decode(getdata($OAuthurl),true);
//print_r($OAuthinfo);
$access_token=$OAuthinfo['access_token'];
$openid=$OAuthinfo['openid'];

echo "获取到的access_token:<br />".$access_token."<br />";
echo "获取到的用户openid:<br />".$openid;
?>

 

代码解析

require(‘wei_function.php’);该函数文件可以买《微信公众平台支付实例教程》,在该书被第95页有详尽讲解。

$appid=”xxx”;

$secret=”xxx”;

个别以大众号的AppID和AppSecret赋值给变量$appid和$secret;

$OAuthurl=”https://api.weixin.qq.com/sns/oauth2/access\_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant\_type=authorization\_code”;

$OAuthinfo=json_decode(getdata($OAuthurl),true);

$access_token=$OAuthinfo[‘access_token’];

$openid=$OAuthinfo[‘openid’];

用接口地址被的appid、secret和code参数替换,并经getdata()函数(该函数以wei_function.php文件中,可径直叫应用)请求该接口地址,并将赶回的JSON数据经过json_decode()函数处理也数组,之后单独输出access_token和openid。

看该次的网址为:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx78478e595939c538&redirect\_uri=http://www.xxx.com/OAuth2.0.php&response\_type=code&scope=snsapi\_base&state=STATE\#wechat\_redirect

appid为民众号的appid,且待和地方的$appid的价相同,否则会唤起{“errcode”:40029,”errmsg”:”invalid
code, hints: [ req_id: z3H9UA0717ns83
]”}这样的错误信息,其代表的意是不合法的oauth_code。

OAuth2.0.php为该次文件。

运作效果如图所示。

图片 4

6.scope参数为snsapi_userinfo的网页授权接口调用实例

步骤

(1)获取code

(2)通过code换取access_token以及OpenID

(3)刷新access_token(如果需要)

(4)拉取用户信息

(1)获取code

于保管微信公众账号有授权作用域scope参数为snsapi_userinfo的前提下,引导微信用户打开如下格式页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect\_uri=REDIRECT\_URI&response\_type=code&scope=snsapi\_userinfo&state=STATE\#wechat\_redirect

假若提示“该链接无法访问”,请检查参数是否填写错误,是否持有scope参数对应的授权作用域权限。

拖欠链接格式与坐snsapi_userinfo为scope发起的网页授权不同之才是scope不同,其余一律。

 

调用参数说明,如所示:

scope为snsapi_userinfo时接口调用参数说明

参数

是否必须

说明

appid

公众号的唯一标识

redirect_uri

授权后重定向的回调链接地址,请使用urlencode对链接进行处理

response_type

返回类型,请填写code

scope

应用授权作用域,snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)

state

重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

#wechat_redirect

无论直接打开还是做页面302重定向时候,必须带此参数

 

(2)通过code换取access_token以及OpenID

  该手续及为snsapi_userinfo为scope发起的网页授权流程同样,参考该调用方法即可。

(3)刷新access_token(如果急需)

由于access_token拥有比较短的有效期,当access_token超时晚,可以采取refresh_token进行刷新,refresh_token有效期为30龙,当refresh_token失效后,需要用户还授权。

refresh_token在(2)通过code换取access_token以及OpenID中与access_token和OpenID一同获得,获取代码为$refresh_token=$OAuthinfo[‘refresh_token’];。

(4)拉取用户信息

<?php
/*
    以snsapi_base为scope发起的网页授权
    获取access_token,openid
*/
require('wei_function.php');
$appid="wx78478e595939c538";
$secret="5540e8ccab4f71dfad752f73cfb85780";
$code=$_GET['code'];
$OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$OAuthinfo=json_decode(getdata($OAuthurl),true);
//print_r($OAuthinfo);
$access_token=$OAuthinfo['access_token'];
$openid=$OAuthinfo['openid'];

$user_url="https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
$user_info=json_decode(getdata($user_url),true);
//print_r($user_info);
echo "OpenID:".$user_info['openid'];
echo "<br />";
echo "昵称:".$user_info['nickname'];
echo "<br />";
echo "性别:".$user_info['sex'];
echo "<br />";
echo "资料填写城市:".$user_info['city'];
echo "<br />";
echo "资料填写省份:".$user_info['province'];
echo "<br />";
echo "资料填写国家:".$user_info['country'];
echo "<br />";
echo "用户头像地址:".$user_info['headimgurl'];
echo "<br />";
echo "unionid:".$user_info['unionid'];
?>

 

功效如图所示:

图片 5

 5.本课内容都录制为视频教程,视频已经在《微信公众平台开发实例教程》同样写被公布,欢迎购买。

点此购买《微信公众平台支付实例教程》

相关文章