微信开发
版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/u012279647/article/details/79268033,未经博主允许不得转载。
class HomeBaseController extends BaseController
{
private $appId;
private $appSecret;
public function _initialize()
{
$this->appId = '';
$this->appSecret = '';
Session::set('openid_session','');
$openid_ss = Session::get('openid_session');
if(!$openid_ss){
$openid_s = $this -> GetOpenid();
Session::set('openid_session',$openid_s['openid']);
Session::set('userinfo_session',$openid_s);
}
}
/**
* 微信
*/
public function GetOpenid()
{
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
// $baseUrl = urlencode('http://bbsd.yllfbaobao.cn/portal/wechat/GetOpenid');
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
// print_r($baseUrl);die();
$url = $this->__CreateOauthUrlForCode($baseUrl,1);
Header("Location: $url");
exit();
} else {
//获取code码 ,以获取openid
$code = $_GET['code'];
$data = $this->GetOpenidFromMp($code);
$urlObj = [];
$urlObj["access_token"] = $data['access_token'];
$urlObj["openid"] = $data['openid'];
// $urlObj["lang"] = 'zh_CN';
$bizString = $this->ToUrlParams($urlObj);
$url = 'https://api.weixin.qq.com/sns/userinfo?'.$bizString;
//获取用户信息,openid,昵称,头像。
$userinfo = json_decode($this->httpGet($url),true);
//查取数据库信息,核对openid是否存在 存数据库
// $user = new UserModel;
// $openid = $user->where('openid',$userinfo['openid'])->find();
if(empty($openid)){
//存数据库
}
}
// return $userinfo['openid'];
return $userinfo;
// Session::set('openid_s',$userinfo['openid']);
// return redirect('Index/index');
}
/**
*
* 通过code从工作平台获取openid机器access_token
* @param string $code 微信跳转回来带上的code
*
* @return openid
*/
public function GetOpenidFromMp($code)
{
$url = $this->__CreateOauthUrlForOpenid($code);
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 500);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
// if(WechatConfig::CURL_PROXY_HOST != "0.0.0.0"
// && WechatConfig::CURL_PROXY_PORT != 0){
// curl_setopt($ch,CURLOPT_PROXY, WechatConfig::CURL_PROXY_HOST);
// curl_setopt($ch,CURLOPT_PROXYPORT, WechatConfig::CURL_PROXY_PORT);
// }
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
return $data;
}
public function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
//dump($res);
curl_close($curl);
return $res;
}
/**
*
* 拼接签名字符串
* @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;
}
/**
*
* 构造获取code的url连接
* @param string $redirectUrl 微信服务器回跳的url,需要url编码
*
* @return 返回构造好的url
*/
private function __CreateOauthUrlForCode($redirectUrl,$state)
{
$urlObj["appid"] = $this->appId;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
if($state == 1){
$urlObj["scope"] = "snsapi_userinfo";
}else if($state == 2){
$urlObj["scope"] = "snsapi_base";
}
$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->appId;
$urlObj["secret"] = $this->appSecret;
$urlObj["code"] = $code;
$urlObj["grant_type"] = "authorization_code";
$bizString = $this->ToUrlParams($urlObj);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
}
public function curlPost($url,$data=""){
$ch = curl_init();
$opt = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => 0,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $data,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 20
);
$ssl = substr($url,0,8) == "https://" ? TRUE : FALSE;
if ($ssl){
$opt[CURLOPT_SSL_VERIFYHOST] = 1;
$opt[CURLOPT_SSL_VERIFYPEER] = FALSE;
}
curl_setopt_array($ch,$opt);
$data = curl_exec($ch);
//dump($data);
curl_close($ch);
return $data;
}
/**
* @return code
*/
public function code(){
$host = $_SERVER['HTTP_HOST'];
$code = $this ->httpGet($host.'/api/home/Index/index');
print_r($code);
$aa = \session('token');
$this->pr($aa);
$code = json_decode($code,true);
$token = $code['data']['token'];
$token = (int)$token;
session('token',$token);
return $token;
}
}