前后端分离获取微信网页授权

前端方法

function GetRequest()

  {

      var url = location.search;  //获取url中"?"符后的字串 

      var theRequest = new Object();

      if (url.indexOf("?") != -1)

      {

          var str = url.substr(1);

          strs = str.split("&");

          for (var i = 0; i < strs.length; i++)

          {

              theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);

          }

      }

      return theRequest;

  }


  if (!GetRequest().call) {

  $.ajax({

      url: 'http://api.lejia.com/api/test',

      type: "GET",

      success: function (data) {

        console.log(data)

        window.location.href = data;

      },

      error: function(xhr){

        console.log(xhr)

      }

            });

  }else{

  eval(GetRequest().call);

  }


  function callback(){

  $.ajax({

      url: 'http://api.lejia.com/api/userList',

      type: "GET",

      success: function (data) {

        console.log(JSON.parse(data))

      },

      error: function(xhr){

        console.log(xhr)

      }

            });

  return false;

  }

 



index控制器

namespace app\api\controller;


use app\BaseController;

use lib\Character;

use think\facade\Db;

use think\Request;

use \Firebase\JWT\JWT;

use app\repository\WxService;


class Index

{

    public function test(request $request){

        $code = $request->param();


        error_reporting(1);

        header('Content-type:text/html; Charset=utf-8');

        $appid  = 'wxd4bcd8b1ab028596';

        $appKey = '7db30a7bd9750e3d4c1be405ea37b919';

        $wxPay  = new WxService($appid, $appKey);

        $data  = $wxPay->GetOpenid();

        redis()->hSet('wechat', 'data', json_encode($data, true));

        if (array_key_exists('code', $code)) {

            // 获取openid

            $wechatInfo = redis()->hGet('wechat', 'data');

            $wechatInfo = json_decode($wechatInfo);

            // 获取用户信息

            $user = $wxPay->getUserInfo($data['openid'], $data['access_token']);


            redis()->hSet('wechat', 'user', json_encode($user, true));

            // 获取回调域名

            $url = redis()->hGet('wechat', 'callback');


            redis()->hSet('wechat', 'Juser', $res);

            $url = $url.'?code='.$code['code'].'&state='.$code['state']."&call=callback()";

            return "";

            exit;

        }else{

            $url = getallheaders()['Referer'];

            redis()->hSet('wechat', 'callback', $url);

            redis()->hSet('wechat', 'url', json_encode($data, true));

            return json($data);

        }

    }

}



curl

function geturl($url){

        $headerArray =array("Content-type:application/json;","Accept:application/json");

        $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_RETURNTRANSFER, 1);

        curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);

        $output = curl_exec($ch);

        curl_close($ch);

        $output = json_decode($output,true);

        return $output;

    }



获取微信信息方法

namespace app\repository;


use think\facade\Db;

class WxService

{

    protected $appid;

    protected $appKey;


    public $data = null;


    public function __construct($appid, $appKey)

    {

        $this->appid  = $appid; //微信支付申请对应的公众号的APPID

        $this->appKey = $appKey; //微信支付申请对应的公众号的APP Key

    }


    /**

    * 通过跳转获取用户的openid,跳转流程如下:

    * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize

    * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code

    *

    * @return 用户的openid

    */

    public function GetOpenid()

    {

        //通过code获得openid

        if (!isset($_GET['code'])) {

            //触发微信返回code码

            $baseUrl = $this->getCurrentUrl();

            $url    = $this->__CreateOauthUrlForCode($baseUrl);

            return $url;

            exit();

        } else {

            //获取code码,以获取openid

            $code  = $_GET['code'];

            $openid = $this->getOpenidFromMp($code);

            return $openid;

        }

    }


    public function getCurrentUrl()

    {

        $scheme = $_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://';

        $uri    = $_SERVER['PHP_SELF'] . $_SERVER['QUERY_STRING'];

        if ($_SERVER['REQUEST_URI']) {

            $uri = $_SERVER['REQUEST_URI'];

        }


        $baseUrl = urlencode($scheme . $_SERVER['HTTP_HOST'] . $uri);

        return $baseUrl;

    }


    /**

    * 通过code从工作平台获取openid机器access_token

    * @param string $code 微信跳转回来带上的code

    * @return openid

    */

    public function GetOpenidFromMp($code)

    {

        $url        = $this->__CreateOauthUrlForOpenid($code);

        $res        = self::curlGet($url);

        $data      = json_decode($res, true);

        $this->data = $data;

        return $data;

    }


    /**

    * 构造获取open和access_toke的url地址

    * @param string $code,微信跳转带回的code

    * @return 请求的url

    */

    private function __CreateOauthUrlForOpenid($code)

    {

        $urlObj["appid"]      = $this->appid;

        $urlObj["secret"]    = $this->appKey;

        $urlObj["code"]      = $code;

        $urlObj["grant_type"] = "authorization_code";

        $bizString            = $this->ToUrlParams($urlObj);

        return "https://api.weixin.qq.com/sns/oauth2/access_token?" . $bizString;

    }


    /**

    * 构造获取code的url连接

    * @param string $redirectUrl 微信服务器回跳的url,需要url编码

    * @return 返回构造好的url

    */

    private function __CreateOauthUrlForCode($redirectUrl)

    {

        $urlObj["appid"]        = $this->appid;

        $urlObj["redirect_uri"]  = "$redirectUrl";

        $urlObj["response_type"] = "code";

        $urlObj["scope"]        = "snsapi_userinfo";

        $urlObj["state"]        = "STATE";

        $bizString              = $this->ToUrlParams($urlObj);

        return "https://open.weixin.qq.com/connect/oauth2/authorize?" . $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;

    }


    /**

    * 获取用户信息

    * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid

    * @return string

    */

    public function getUserInfo($openid, $access_token)

    {


        $response = self::curlGet('https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN');

        return json_decode($response, true);


    }


    public static function curlGet($url = '', $options = array())

    {

        $ch = curl_init($url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        if (!empty($options)) {

            curl_setopt_array($ch, $options);

        }

        //https请求 不验证证书和host

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $data = curl_exec($ch);

        curl_close($ch);

        return $data;

    }


    public static function curlPost($url = '', $postData = '', $options = array())

    {

        if (is_array($postData)) {

            $postData = http_build_query($postData);

        }

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数

        if (!empty($options)) {

            curl_setopt_array($ch, $options);

        }

        //https请求 不验证证书和host

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $data = curl_exec($ch);

        curl_close($ch);

        return $data;

    }

}

你可能感兴趣的:(前后端分离获取微信网页授权)