前端方法
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;
}
}