公众号认证授权的几种场景

上篇博文写过了,微信授权有UnionID和Oauth2.0两种机制及两者的差别,不清楚的详见微信授权

case 1: 推广营销活动

商家让利,会有对用户的各种优惠折扣,基于口碑拓展,KPI,用户数据? 这些猜测不重要, 关键希望公众号涨粉,至少是数据上。
而很多用户也确实愿意褥羊毛,趁机捡点便宜,反正也就在微信里面点几下,填几下~~
这种情况就需要用户关注了,因为很多统计的是关注的用户数~~ 这时候就需要UnionID机制的授权了,对没有关注的用户进行提示并跳转到一个可关注的页面。
UnionID授权机制 伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require_once(dirname(__FILE__). '../cls_oauth.php'); //引入cls
$Oauth = new Oauth($db);
$code = htmlspecialchars($_GET['code'])? htmlspecialchars($_GET['code']):'';
if ( !$code ){
$Oauth->basicOauth($curUrl);
}

$userinfo = $Oauth->getGlobalUserinfoByCode($code); // 全局token取用户基本信息, 可以取到是否用户关注公众号

//未关注公众号, 不能得到 用户其他信息
if ( $userinfo['subscribe'] != 1){
//todo code
header("Location: subscribe.html");
exit ;
}

//已关注公众号
//todo code

case 2: 各种不设门槛的投票活动

很多投票活动并不对用户设置投票条件,除了每人每天一票这种~~ 这种活动并不在意用户是否关注公众号,倒是希望更多的人参与。而关注公众号是一个”复杂”的操作,毕竟无利不起早~~
Oauth2.0授权机制 伪代码:

1
2
3
4
if ( !$code )
$Oauth->userinfoOauth($curUrl);

$userinfo = $Oauth->getUserinfoByCode($code); //网页授权取用户信息

囧, 好少!! oauth封装的class 在cls_oauth.php中,上篇博客有过程分析,地址https://github.com/chendongbupt/blog-example/blob/master/cls_oauth.php

case 3:微商城

比如微信入口某东, 第一次进入,点击授权确认,需要详细授权取到用户信息,免除了注册与登录, 之后直接凭借openid直接登录。
过程:
1 Oauth2.0 授权第一步,basic授权取到用户openid
2 openid在数据库、SESSION、localStroge、缓存==中,直接设置用户为登录状态, 结束 ~
3 openid第一次访问,重新进行snsapi_userinfo授权,取到详细数据,数据库注册、写入缓存、文件===

一开始用basic授权的原因是, basic属于静默授权,不会弹出绿色授权确认页面,只在链接状态栏上有显示”微信授权xxxx”,更多的用户会经常访问,多次出现授权确认不理想。
伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$code = htmlspecialchars($_GET['code'])? htmlspecialchars($_GET['code']):'';
$state = htmlspecialchars($_GET['state'])? htmlspecialchars($_GET['state']):'';

if (!$code && $state != 'reg'){
$Oauth->basicOauth($curUrl);
}
$userinfo = $Oauth->getOauthInfo($code); //取到 openid

if ( check($userinfo['openid']) ){
// 根据 openid 查询, 如果SESSION 或者 数据库 中有 该openid, 直接登录
//todo code
}
else{
// 该用户信息不存在
// 处理-- 可以提示 -- 也可以再次授权取到信息并插入数据
// $code需要新申请, 需要state变量避免陷入死循环
if ( !$code && $state == 'reg') // state 可以自己设置,cls.php 文件设置的为 'reg'
$Oauth->userinfoOauth($curUrl);

$userinfo = $Oauth->getUserinfoByCode($code);
}