Separe el front-end y el back-end y obtenga la autorización de la página web de WeChat.
Función GetRequest()
? {
? var url = ubicación.búsqueda? //Obtener "?" en la URL. ¿Cadena tras operador?
? var la solicitud = nuevo Objeto();
? if (url.indexOf("?) != -1)
?{
?var str = URL . substr(1);
?strs = str . dividir(amp;);
? para(var I = 0; i ltstrs . longitud; i) ? ]]= unescape(strs[I]). split(" = "[1]);
?}
?} p>
?Solicitud de devolución;
?}
Si (!GetRequest().call){
? p>
? URL: "/API/test",
? Escriba: "obtener",
? Éxito: función(datos){
console.log(datos)
ventana. ubicación .href = datos;
},
Error: función (xhr) {
console.log(xhr)
? }
});
} En caso contrario {
?
llamar);
? }
Devolución de llamada de función(){
? $.ajax({
?URL: "/API/UserList",
?Tipo: "Obtener",
?Éxito: Función(datos) {
console.log(JSON.parse(data))
},
Error: función (xhr){
console.log(xhr)
? }
});
? ¿Devolver falso
? }
?
Controlador de índice
lt? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)
Espacio de nombres app\api\controller
Usando app\BaseController
Usando lib\Character
Usar think\facade\Db
Usar think\request;
Usar \Firebase\JWT\JWT;
Usar app\repository\WxService
Índice de clase
{
Prueba de función pública(solicitud $solicitud){
$ código = $solicitud-gt;param( );
Error (1);
encabezado(' Tipo de contenido: texto/html; conjunto de caracteres = utf-8 ');
$appid? = ' wxd 4 BCD 8 b 1ab 028596 ';
$ appKey = ' 7 db 30 a 7 BD 9750 E3 D4 c 1be 405 ea 37 b 919 ';
$wxPay? = nuevo WxService($appid,$appKey);
$datos? = $ wx pay- gt; obtener OpenID();
redis()- gt('WeChat', 'data', json_encode($data, true)); >if (array_key_exists('código ', $código)) {
//Obtener openid
$ wechatInfo = redis()- gt;'WeChat', 'datos' );
$WeChat info = JSON_decode($WeChat info);
//Obtener información del usuario
$ usuario = $ wx pay- gt; $datos['openid'], $datos['access_token']);
redis()-gt('WeChat', 'usuario', json_encode($usuario, true ));
//Obtener el nombre del dominio de devolución de llamada
$ URL = redis()- gt('WeChat', 'Callback');
redis(); ->hSet('WeChat', 'Juser', $RES);
$url = $url. ? código = '. $código['código']. estado del amplificador = '.
$código['estado']. " ampcall = callback()"
return " ltscript gtwindow . ubicación . href = ' { $ URL } ' lt; /script >
Salir;
} De lo contrario {
$ URL = getall headers()['Referer'];
redis()-gt; hSet('WeChat', 'Callback', $URL);
redis()-gt; hSet('WeChat', 'URL', json_encode($data, true));
Devuelve JSON($data);
}
}
}
curl
Función geturl($url){
$ header array = array("Tipo de contenido: aplicación/JSON;", "Aceptar: aplicación/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, $matriz de encabezados
$ salida = curl _ exec($ ch);
curl_close($ch);
$salida = json_decode($salida, verdadero);
devuelve $salida
}
Una forma de obtener información de WeChat
Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)
Aplicación de espacio de nombres \ repositorio
Usando think\facade \Db
Clase WxService
{
protected$appid
protected$ appKey
public $data = null
Función pública_ _construct($appid, $appKey)
{
$ this- gt;appid? = $ appid // El APPID de la cuenta oficial de WeChat correspondiente a la aplicación de pago de WeChat.
$ this- gt; appKey = $ appKey// La clave de aplicación de la cuenta oficial de WeChat correspondiente a la aplicación de pago de WeChat.
}
/**
*Obtiene el openid del usuario mediante jump. El proceso de salto es el siguiente:
* 1. Establezca parámetros como la URL a la que se debe devolver la llamada y salte al servidor WeChat/connect/oauth2/authorize.
* 2. Una vez procesado el servicio WeChat, volverá a la dirección de redirección_uri del usuario, lo que traerá algunos parámetros, como el código.
*
* @Devuelve el openid del usuario.
*/
Función pública GetOpenid()
{
//Obtener openid a través del código
Si (!isset($ _ GET[' code ']){
//Activar código de retorno de WeChat.
$ URL base = $ this- gt; getCurrentUrl();
$URL = $this-gt;_ _ CreateOauthUrlForCode($base URL);
Devolver $url
exit();
} De lo contrario {
//Obtener código para obtener openid
$code? = $_GET[' code '];
$ OpenID = $ this- gt;getopenidfromp($code);
Devolver $openid
}
}
Función pública getCurrentUrl() p>
{
$ esquema = $ _ SERVIDOR[' HTTPS ']= 'on'? " .$ bizString
} p>
/* *
* Construya una conexión URL para obtener el código
* @param string $redirectUrl Servidor WeChat, la codificación de la URL debe perderse
* @. return devuelve la URL construida
*/
Función privada_ _ CreateOauthUrlForCode($ redirigirUrl)
{
$ URL obj[" appid "]= $this- gt;appid
$urlObj["redirect_uri"]? = " $ redirigirUrl
$ URL obj[" Response_type "] = " código ";
$ URL obj[" alcance "]= " snsapi _ userinfo ";
$ URL obj[" ESTADO "]= " ESTADO ";
$bizString ? = $this->ToUrlParams($URL obj);
return "/connect/oauth 2/authorize? ".$ bizString
}
/**
*Cadena de firma de puntada
* @ param array$URL obj p >
* @return devuelve la cadena concatenada
*/
Función privada ToUrlParams($urlObj)
{
$ buff =
foreach($ URL obj as $ k = gt; $v) {
if ($k!= "signo") {
$ pulir. = $k "=".
"amp;;
}
}
$buff = trim($buff, "amp);
return $buff
}
/**
*Obtener información del usuario
* @param string $openid llama a la interfaz de información del usuario de acceso de autorización de la página web para Obtenga el openid del usuario en la cuenta oficial de WeChat.
* @return string
*/
Función pública getUserInfo($openid, $access_token)
{
$ respuesta = self::curl get('/SNS/userinfo?access_token= '.$access_token.ampopenid= '.$openid.amplang=zh_CN');
Devuelve json_decode( $respuesta, true);
}
Función estática pública 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 La solicitud no se verifica el certificado y el host.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, falso);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, falso
$ datos = curl _ exec($ ch); );
curl_close($ch);
Devolver $datos
}
Función estática pública curlPost($url = ' ' , $postData = ' ', $opciones = 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, $ datos de publicación);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //Establece el número máximo de segundos permitidos para la ejecución de cURL.
if (!empty($opciones)) {
curl_setopt_array($ch, $opciones
}
// Las solicitudes https no verifican el certificado ni el host.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, falso);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, falso
$ datos = curl _ exec($ ch); );
curl _ close($ ch);
Devolver $ datos
}
}