food_server/FlyCube/Api/Controller/PublicController.class.php

103 lines
3.2 KiB
PHP
Raw Normal View History

2024-05-30 19:16:59 +08:00
<?php
namespace Api\Controller;
use Think\Controller;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
2024-05-30 19:16:59 +08:00
class PublicController extends Controller
{
protected $openid; // 用户openid
protected $session_key; // 用户session_key
2024-05-30 19:16:59 +08:00
//初始化
public function _initialize()
{
// 获取请求头中的 Token
$token = isset($_SERVER['HTTP_TOKEN']) ? $_SERVER['HTTP_TOKEN'] : null;
// 获取 jwt 密钥
$jwtKey = C('jwtKey');
try {
// 解码 JWT Token
$decoded = JWT::decode($token, new Key($jwtKey, 'HS256'));
// Token 没有过期,继续处理
$this->openid = $decoded->openid;
$this->session_key = $decoded->session_key;
} catch (\Firebase\JWT\ExpiredException $e) {
// Token 过期
echo json_encode(array('status' => -1, 'msg' => 'Token 已过期'));
exit();
} catch (\Exception $e) {
// 其他 JWT 解码错误
echo json_encode(array('status' => -1, 'msg' => 'Token 解码失败: ' . $e->getMessage()));
exit();
}
2024-05-30 19:16:59 +08:00
}
//远程调取页面 访问API
protected function apiUrl($url)
{
$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);
$output = curl_exec($ch);
curl_close($ch);
$jsoninfo = json_decode($output, true);
return $jsoninfo;
}
/**
* @description: 构建 用户订阅对应主题的前缀
* @param {*} openid 微信用户唯一凭证
* @return {*} topicPrefix 主题前缀
*/
protected function makeTopicPrefix($openid)
{
return substr(md5($openid . date("j")), 0, 8); //用户id+当天日 加密 截取前8位
}
/**
* @description: 构建token
* @param {*} openid 微信用户唯一凭证
* @return {*} token
*/
protected function makeToken($openid, $session_key)
{
// 定义密钥,应该使用安全的随机字符串并妥善保管
$jwtKey = C('jwtKey');
$currtime = time();
// 要存储在 JWT 中的数据
$data = [
'iat' => $currtime, // 签发时间(时间戳)
'iss' => 'jwt_admin', // 签发者
'nbf' => $currtime, // 在此时间之前不可用 (这里是2秒以内)
'exp' => 20, //过期时间 到第二天凌晨
2024-05-30 19:16:59 +08:00
'openid' => $openid,
'session_key' => $session_key,
];
// 使用密钥和 HS256 算法对数据进行编码生成 JWT
return JWT::encode($data, $jwtKey, 'HS256');
}
/**
* @description: 将手机号的倒数第 5 位到第 8 位替换成星号
* @param string $phoneNumber 完整的手机号
* @return string 处理后的手机号
*/
protected function maskPhoneNumber($phoneNumber)
{
// 去掉手机号中的+号以便处理
$cleanPhoneNumber = str_replace('+', '', $phoneNumber);
// 判断手机号长度(带国家区号和不带国家区号的情况)
if (strlen($cleanPhoneNumber) > 11) { // 带国家区号的手机号
$maskedPhoneNumber = substr_replace($cleanPhoneNumber, '****', -8, 4);
return '+' . $maskedPhoneNumber;
} elseif (strlen($cleanPhoneNumber) === 11) { // 不带国家区号的手机号
return substr_replace($cleanPhoneNumber, '****', -8, 4);
} else {
// 非法手机号长度,返回原始号码
return $phoneNumber;
}
}
}