Files
littleTiger/application/mobile/controller/MobileBase.php
2019-02-28 19:48:21 +08:00

310 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* tpshop
* ============================================================================
* * 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 采用最新Thinkphp5助手函数特性实现单字母函数M D U等简写方式
* ============================================================================
* $Author: IT宇宙人 2016-08-10 $
*/
namespace app\mobile\controller;
use think\Controller;
use think\Db;
use app\common\logic\CartLogic;
use app\common\logic\UsersLogic;
use app\common\logic\wechat\WechatUtil;
class MobileBase extends Controller {
public $session_id;
public $weixin_config;
public $cateTrre = array();
public $tpshop_config = array();
/*
* 初始化操作
*/
public function _initialize() {
session('user'); //不用这个在忘记密码不能获取session('validate_code');
// Session::start();
header("Cache-control: private"); // history.back返回后输入框值丢失问题 参考文章 http://www.tp-shop.cn/article_id_1465.html http://blog.csdn.net/qinchaoguang123456/article/details/29852881
$this->session_id = session_id(); // 当前的 session_id
define('SESSION_ID',$this->session_id); //将当前的session_id保存为常量供其它方法调用
// 判断当前用户是否手机
if(isMobile())
cookie('is_mobile','1',3600);
else
cookie('is_mobile','0',3600);
//微信浏览器
if(strstr($_SERVER['HTTP_USER_AGENT'],'MicroMessenger')){
$this->weixin_config = M('wx_user')->find(); //取微获信配置
$this->assign('wechat_config', $this->weixin_config);
$user_temp = session('user');
if (isset($user_temp['user_id']) && $user_temp['user_id']) {
$user = M('users')->where("user_id", $user_temp['user_id'])->find();
if (!$user) {
$_SESSION['openid'] = 0;
session('user', null);
}
}
if (empty($_SESSION['openid'])){
if(is_array($this->weixin_config) && $this->weixin_config['wait_access'] == 1){
$wxuser = $this->GetOpenid(); //授权获取openid以及微信用户信息
//过滤特殊字符串
$wxuser['nickname'] && $wxuser['nickname'] = replaceSpecialStr($wxuser['nickname']);
session('subscribe', $wxuser['subscribe']);// 当前这个用户是否关注了微信公众号
setcookie('subscribe',$wxuser['subscribe']);
$logic = new UsersLogic();
$is_bind_account = tpCache('basic.is_bind_account');
if ($is_bind_account) {
if (CONTROLLER_NAME != 'User' || ACTION_NAME != 'bind_guide') {
$data = $logic->thirdLogin_new($wxuser);//微信自动登录
if ($data['status'] != 1 && $data['result'] === '100') {
session("third_oauth" , $wxuser);
$first_leader = I('first_leader');
$this->redirect(U('Mobile/User/bind_guide',['first_leader'=>$first_leader]));
}
}
} else {
$data = $logic->thirdLogin($wxuser);
}
if($data['status'] == 1){
session('user',$data['result']);
setcookie('user_id',$data['result']['user_id'],null,'/');
setcookie('is_distribut',$data['result']['is_distribut'],null,'/');
setcookie('uname',$data['result']['nickname'],null,'/');
// 登录后将购物车的商品的 user_id 改为当前登录的id
M('cart')->where("session_id" ,$this->session_id)->save(array('user_id'=>$data['result']['user_id']));
$cartLogic = new CartLogic();
$cartLogic->setUserId($data['result']['user_id']);
$cartLogic->doUserLoginHandle(); //用户登录后 需要对购物车 一些操作
}
}
}else{
setcookie('user_id',$user_temp['user_id'],null,'/');
setcookie('is_distribut',$user_temp['is_distribut'],null,'/');
}
}
$this->public_assign();
}
/**
* 保存公告变量到 smarty中 比如 导航
*/
public function public_assign()
{
$first_login = session('first_login');
$this->assign('first_login', $first_login);
if (!$first_login && ACTION_NAME == 'login') {
session('first_login', 1);
}
$tp_config = Db::name('config')->cache(true, TPSHOP_CACHE_TIME, 'config')->select();
foreach($tp_config as $k => $v)
{
if($v['name'] == 'hot_keywords'){
$this->tpshop_config['hot_keywords'] = explode('|', $v['value']);
}
$this->tpshop_config[$v['inc_type'].'_'.$v['name']] = $v['value'];
}
$goods_category_tree = get_goods_category_tree();
$this->cateTrre = $goods_category_tree;
$this->assign('goods_category_tree', $goods_category_tree);
$brand_list = M('brand')->cache(true,TPSHOP_CACHE_TIME)->field('id,cat_id,logo,is_hot')->where("cat_id>0")->select();
$this->assign('brand_list', $brand_list);
$this->assign('tpshop_config', $this->tpshop_config);
/** 修复首次进入微商城不显示用户昵称问题 **/
$user_id = cookie('user_id');
$uname = cookie('uname');
if(empty($user_id) && ($users = session('user')) ){
$user_id = $users['user_id'];
$uname = $users['nickname'];
}
$this->assign('user_id',$user_id);
$this->assign('uname',$uname);
}
// 网页授权登录获取 OpendId
public function GetOpenid()
{
if($_SESSION['openid'])
return $_SESSION['data'];
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
//$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
$baseUrl = urlencode($this->get_url());
$url = $this->__CreateOauthUrlForCode($baseUrl); // 获取 code地址
Header("Location: $url"); // 跳转到微信授权页面 需要用户确认登录的页面
exit();
} else {
//上面获取到code后这里跳转回来
$code = $_GET['code'];
$data = $this->getOpenidFromMp($code);//获取网页授权access_token和用户openid
$data2 = $this->GetUserInfo($data['access_token'],$data['openid']);//获取微信用户信息
$data['nickname'] = empty($data2['nickname']) ? '微信用户' : trim($data2['nickname']);
$data['sex'] = $data2['sex'];
$data['head_pic'] = $data2['headimgurl'];
$data['subscribe'] = $data2['subscribe'];
$data['oauth_child'] = 'mp';
$_SESSION['openid'] = $data['openid'];
$data['oauth'] = 'weixin';
if(isset($data2['unionid'])){
$data['unionid'] = $data2['unionid'];
}
$_SESSION['data'] =$data;
return $data;
}
}
/**
* 获取当前的url 地址
* @return type
*/
private function get_url() {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
$php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
/**
*
* 通过code从工作平台获取openid机器access_token
* @param string $code 微信跳转回来带上的code
*
* @return openid
*/
public function GetOpenidFromMp($code)
{
//通过code获取网页授权access_token 和 openid 。网页授权access_token是一次性的而基础支持的access_token的是有时间限制的7200s。
//1、微信网页授权是通过OAuth2.0机制实现的在用户授权给公众号后公众号可以获取到一个网页授权特有的接口调用凭证网页授权access_token通过网页授权access_token可以进行授权后接口调用如获取用户基本信息
//2、其他微信接口需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。
$url = $this->__CreateOauthUrlForOpenid($code);
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_TIMEOUT, 300);//设置超时
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$res = curl_exec($ch);//运行curl结果以jason形式返回
$data = json_decode($res,true);
curl_close($ch);
return $data;
}
/**
*
* 通过access_token openid 从工作平台获取UserInfo
* @return openid
*/
public function GetUserInfo($access_token,$openid)
{
// 获取用户 信息
$url = $this->__CreateOauthUrlForUserinfo($access_token,$openid);
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_TIMEOUT, 300);//设置超时
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$res = curl_exec($ch);//运行curl结果以jason形式返回
$data = json_decode($res,true);
curl_close($ch);
//获取用户是否关注了微信公众号, 再来判断是否提示用户 关注
//if(!isset($data['unionid'])){
$wechat = new WechatUtil($this->weixin_config);
$fan = $wechat->getFanInfo($openid);//获取基础支持的access_token
if ($fan !== false) {
$data['subscribe'] = $fan['subscribe'];
}
//}
return $data;
}
/**
*
* 构造获取code的url连接
* @param string $redirectUrl 微信服务器回跳的url需要url编码
*
* @return 返回构造好的url
*/
private function __CreateOauthUrlForCode($redirectUrl)
{
$urlObj["appid"] = $this->weixin_config['appid'];
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
// $urlObj["scope"] = "snsapi_base";
$urlObj["scope"] = "snsapi_userinfo";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this->ToUrlParams($urlObj);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
}
/**
*
* 构造获取open和access_toke的url地址
* @param string $code微信跳转带回的code
*
* @return 请求的url
*/
private function __CreateOauthUrlForOpenid($code)
{
$urlObj["appid"] = $this->weixin_config['appid'];
$urlObj["secret"] = $this->weixin_config['appsecret'];
$urlObj["code"] = $code;
$urlObj["grant_type"] = "authorization_code";
$bizString = $this->ToUrlParams($urlObj);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
}
/**
*
* 构造获取拉取用户信息(需scope为 snsapi_userinfo)的url地址
* @return 请求的url
*/
private function __CreateOauthUrlForUserinfo($access_token,$openid)
{
$urlObj["access_token"] = $access_token;
$urlObj["openid"] = $openid;
$urlObj["lang"] = 'zh_CN';
$bizString = $this->ToUrlParams($urlObj);
return "https://api.weixin.qq.com/sns/userinfo?".$bizString;
}
/**
*
* 拼接签名字符串
* @param array $urlObj
*
* @return 返回已经拼接好的字符串
*/
private function ToUrlParams($urlObj)
{
$buff = "";
foreach ($urlObj as $k => $v)
{
if($k != "sign"){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
public function ajaxReturn($data){
exit(json_encode($data));
}
}