微信授权

 //唤起扫码页面
	public function componentloginpageOp()
	{
		$param = model('parameter')->getval();
		$this->grant = new grant($param->token, $param->encodingAesKey, $param->appid, $param->appsecret);
		$getctoken = model('parameter')->getctoken();
		if ($getctoken['code'] == '0') {
			return callbackfun('error', $getctoken['msg']);
		} else {
			$component_access_token = $getctoken['component_access_token'];
		}
		return $this->redirect($this->grant->rqcode($component_access_token)); //重定向
	}



	//回调页面
	public function callbackOp()
	{
		$param = model('parameter')->getval();
		$this->grant = new grant($param->token, $param->encodingAesKey, $param->appid, $param->appsecret);
		$auth_code = input('auth_code');  //微信授权码
		$getctoken = model('parameter')->getctoken();
		if ($getctoken['code'] == '0') {
			return callbackfun('error', $getctoken['msg']);
		} else {
			$component_access_token = $getctoken['component_access_token'];
		}
		//4,使用授权码换取公众号或小程序的接口调用凭据和授权信息
		$authInfo = $this->grant->apiQueryAuth($component_access_token, $auth_code);
		if (!array_key_exists('authorization_info', $authInfo)) {
			return callbackfun('error', '使用授权码换取公众号信息失败', url('togrant'));
		}
		$authInfo = $authInfo['authorization_info'];
        //6 .获取授权方的帐号基本信息
		$account_information = $this->grant->apiGetAuthorizerInfo($component_access_token, $authInfo);
		$authorizer_info = $account_information['authorizer_info'];
		$authorization_info = $account_information['authorization_info'];
		$id = model('wx_authorization_information')->where(['authorizer_appid' => $authorization_info['authorizer_appid'], 'uid' => $this->userinfo['uid'], 'user_name' => $authorizer_info['user_name']])->value('id');
		foreach ($authorization_info['func_info'] as $k => $v) {
			$func_info[] = $v['funcscope_category']['id'];
		}
		$data = [
			'authorizer_appid' => $authorization_info['authorizer_appid'],
			'nick_name' => $authorizer_info['nick_name'],
			'uid' => $this->userinfo['uid'],
			'kefuid' => $this->userinfo['rulerid'],
			'head_img' => $authorizer_info['head_img'],
			'user_name' => $authorizer_info['user_name'],//原始id
			'service_type_info' => $authorizer_info['service_type_info']['id'], //授权方公众号类型
			'verify_type_info' => $authorizer_info['verify_type_info']['id'],//授权方认证类型
			'business_info' => json_encode($authorizer_info['business_info']),
			'func_info' => json_encode($func_info),
			'datetime' => time(),//授权时间
		];
		if ($id == null) {
			$type = false;
		} else {
			$type = true;
			$data['id'] = $id;
		}
		$result = model('wx_authorization_information')->allowField(true)->isUpdate($type)->save($data);
		$authInfo['to_user_name'] = $authorizer_info['user_name'];
		//5.获取(刷新)授权公众号或小程序的接口调用凭据(令牌)
		$tokenArr = $this->grant->apiAuthorizerToken($component_access_token, $authInfo, $this->userinfo['uid']);
        //7.获取授权方的选项设置信息
		$option_gettings_information = $this->grant->apiGetAuthorizerOption($component_access_token, $account_information);
      	// 8、设置授权方的选项信息
		$option_settings_information = $this->grant->apiSetAuthorizerOption($component_access_token, $option_gettings_information);
		return $this->redirect("/kefu/wechat/toGrant"); //重定向
        //
        //令牌未缓存。

	}
class grant {
	private $token;
	private $encodingAesKey;
	private $appid;
	private $appsecret;
	/**
	 * 构造函数
	 * @param $token string 公众平台上,开发者设置的token
	 * @param $encodingAesKey string 公众平台上,开发者设置的EncodingAESKey
	 * @param $appId string 公众平台的appId
	 */
	public function __construct($token, $encodingAesKey, $appid, $appsecret)
	{
		$this->token = $token;
		$this->encodingAesKey = $encodingAesKey;
		$this->appid = $appid;
		$this->appsecret = $appsecret;
	}
	public function rqcode($component_access_token)
	{
	    $preAuthCode = $this->preAuthCode($component_access_token);
		$redirect_uri = "http://chat.wenidc.com/kefu/wechat/callback";    //回调地址
		$url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=$this->appid&pre_auth_code=${preAuthCode}&redirect_uri=${redirect_uri}";
		return $url;

	}
	//2,获取第三方平台component_access_token
	public function componentAccessToken($component_verify_ticket)
	{
		$url = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
		$data = array(
			"component_appid" => $this->appid,
			"component_appsecret" => $this->appsecret,
			"component_verify_ticket" => $component_verify_ticket
		);
		return json_decode($this->https_request($url, json_encode($data)), true);

	}
	//3,获取预授权码pre_auth_code
	public function preAuthCode($component_access_token)
	{
		$url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=$component_access_token";
		$data = array(
			"component_appid" => $this->appid,
		);
		$send_result = $this->https_request($url, json_encode($data));
		$send_result = json_decode($send_result, true);
		if (!array_key_exists('errcode', $send_result)) {
			return $send_result['pre_auth_code'];// 微信预授权码
		} else {
			return '';
		}
	}
	//4,使用授权码换取公众号或小程序的接口调用凭据和授权信息
	public function apiQueryAuth($component_access_token, $auth_code)
	{
		$url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=$component_access_token";
		$data = array(
			"component_appid" => $this->appid,
			"authorization_code" => $auth_code,
		);
		$send_result = json_decode($this->https_request($url, json_encode($data)), true);
		return $send_result;
	}

 

上一篇:基于PySimpleGUI实现图片转文字并翻译至剪切板


下一篇:开发Web版一对一远程直播教室只需30分钟 - 使用face2face网络教室