手记

PHP YII实现微信公众号授权

微信网页授权

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

关于网页授权的两种scope的区别说明

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。、

微信授权步骤

1 第一步:用户同意授权,获取code

2 第二步:通过code换取网页授权access_token

3 第三步:刷新access_token(如果需要)

4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

5 第五步:存入数据库

代码如下,默认给的授权是“snsapi_userinfo”,采用的框架为yii2.0。

<!--?php
/**
 * 微信商城系统
 * Copyright (c) 2018
 * Author:linhe
 */
namespace app\modules\m\controllers;
use app\common\components\HttpClient;
use app\common\services\UrlService;
use app\models\member\Member;
use app\models\oauth\OauthMemberBind;
use app\modules\m\controllers\common\BaseController;
use app\modules\m\controllers\common\MobileController;
use yii\web\controller;

/**
 * Class OauthController
 * @package app\modules\m\controllers
 * 微信授权class
 */
class OauthController extends BaseController
{
public function actionLogin(){
$scope = $this--->get("scope","snsapi_userinfo");
//获取code
$appid = \Yii::$app-&gt;params['weixin']['appid'];
//配置信息获取appid
$redirect_uri=UrlService::buildMurl('/oauth/callback');
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appid}&amp;redirect_uri={$redirect_uri}&amp;response_type=code&amp;scope={$scope}&amp;state=STATE#wechat_redirect";
return $this-&gt;redirect($url);
//跳转
}

/**
 * @return \yii\web\Response
 * 微信回调
 */
public function  actionCallback(){
$appid = \Yii::$app-&gt;params['weixin']['appid'];
//拉取appid
$sk = \Yii::$app-&gt;params['weixin']['sk'];
//获取sk
$code =$this-&gt;get("code","");
//获取code
if(!$code){
return $this-&gt;goHome();
}
$url ="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&amp;secret={$sk}&amp;code={$code}&amp;grant_type=authorization_code";
$ret = HttpClient::get($url);//curl的get请求
$ret = @json_decode($ret,true);//返回信息
$ret_token = isset($ret['access_token'])?$ret['access_token']:'';
if(!$ret_token){
return $this-&gt;goHome();
}
$openid = isset($ret['openid'])?$ret['openid']:'';
$scope = isset($ret['scope'])?$ret['scope']:'';
$this-&gt;setLoginStatus($openid);
if($scope == "snsapi_userinfo") {
$url = "https://api.weixin.qq.com/sns/userinfo?access_token={$ret_token}&amp;openid={$openid}&amp;lang=zh_CN";
$wechat_user_info = HttpClient::get($url);
$wechat_user_info=@json_decode($wechat_user_info,true);
$reg_bind = Member::find()-&gt;where(['openid'=&gt;$openid])-&gt;one();
 if(!$reg_bind){
   $member_info = new Member();
   $member_info -&gt;openid= $wechat_user_info['openid'];
   $member_info -&gt;nickname= $wechat_user_info['nickname'];
   $member_info -&gt;avatar= $wechat_user_info['headimgurl'];
   $member_info -&gt;sex= $wechat_user_info['sex'];
   $member_info-&gt;save(0);
   //存入数据库
   }
}
return $this-&gt;redirect(UrlService::buildMurl("/user/index"));
}
}
0人推荐
随时随地看视频
慕课网APP