218 lines
6.5 KiB
PHP
218 lines
6.5 KiB
PHP
<?php
|
||
|
||
namespace app\common\helper;
|
||
|
||
use think\facade\Request;
|
||
|
||
/**
|
||
* 微信小程序配置助手类
|
||
*/
|
||
class MiniprogramHelper
|
||
{
|
||
/**
|
||
* 缓存的小程序配置
|
||
*/
|
||
private static $cache = null;
|
||
|
||
/**
|
||
* 获取当前请求域名对应的小程序配置
|
||
*
|
||
* @return array 小程序配置
|
||
*/
|
||
public static function getMiniprogramConfig()
|
||
{
|
||
// 获取当前请求的域名
|
||
$domain = Request::domain();
|
||
$host = parse_url($domain, PHP_URL_HOST);
|
||
|
||
// 根据域名获取小程序配置
|
||
return self::getMiniprogramConfigByDomain($host);
|
||
}
|
||
|
||
/**
|
||
* 根据域名获取小程序配置
|
||
*
|
||
* @param string $domain 域名
|
||
* @return array 小程序配置
|
||
*/
|
||
public static function getMiniprogramConfigByDomain($domain)
|
||
{
|
||
// 加载所有小程序配置
|
||
self::loadMiniprogramConfigs();
|
||
|
||
// 如果没有配置,返回空数组
|
||
if (empty(self::$cache) || empty(self::$cache['miniprograms'])) {
|
||
return self::getCompatibleConfig();
|
||
}
|
||
|
||
// 遍历所有小程序配置,匹配域名
|
||
foreach (self::$cache['miniprograms'] as $miniprogram) {
|
||
if (empty($miniprogram['domain'])) {
|
||
continue;
|
||
}
|
||
|
||
// 分割多个域名
|
||
$domains = explode(',', $miniprogram['domain']);
|
||
|
||
// 检查域名是否匹配
|
||
foreach ($domains as $d) {
|
||
$d = trim($d);
|
||
if (!empty($d) && (strtolower($d) === strtolower($domain) || self::domainMatch($d, $domain))) {
|
||
return $miniprogram;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 如果没有匹配的域名,返回默认小程序配置
|
||
return self::getDefaultMiniprogramConfig();
|
||
}
|
||
|
||
/**
|
||
* 检查域名是否匹配
|
||
*
|
||
* @param string $pattern 配置中的域名模式
|
||
* @param string $domain 当前请求的域名
|
||
* @return bool 是否匹配
|
||
*/
|
||
private static function domainMatch($pattern, $domain)
|
||
{
|
||
// 简单的域名匹配,支持通配符 * (例如: *.example.com)
|
||
if (strpos($pattern, '*') !== false) {
|
||
$pattern = str_replace('*', '.*', $pattern);
|
||
$pattern = '/^' . str_replace('.', '\.', $pattern) . '$/i';
|
||
return preg_match($pattern, $domain);
|
||
}
|
||
|
||
return strtolower($pattern) === strtolower($domain);
|
||
}
|
||
|
||
/**
|
||
* 获取默认小程序配置
|
||
*
|
||
* @return array 默认小程序配置
|
||
*/
|
||
public static function getDefaultMiniprogramConfig()
|
||
{
|
||
// 加载所有小程序配置
|
||
self::loadMiniprogramConfigs();
|
||
|
||
// 如果没有配置,返回空数组
|
||
if (empty(self::$cache) || empty(self::$cache['miniprograms'])) {
|
||
return self::getCompatibleConfig();
|
||
}
|
||
|
||
// 查找默认小程序配置
|
||
foreach (self::$cache['miniprograms'] as $miniprogram) {
|
||
if (isset($miniprogram['is_default']) && $miniprogram['is_default'] == 1) {
|
||
return $miniprogram;
|
||
}
|
||
}
|
||
|
||
// 如果没有设置默认配置,返回第一个配置
|
||
if (!empty(self::$cache['miniprograms'])) {
|
||
return self::$cache['miniprograms'][0];
|
||
}
|
||
|
||
// 如果还是没有配置,返回兼容配置
|
||
return self::getCompatibleConfig();
|
||
}
|
||
|
||
/**
|
||
* 获取与商户ID关联的小程序配置
|
||
*
|
||
* @param string $merchantId 商户ID
|
||
* @return array|null 小程序配置或null
|
||
*/
|
||
public static function getMiniprogramConfigByMerchantId($merchantId)
|
||
{
|
||
// 加载所有小程序配置
|
||
self::loadMiniprogramConfigs();
|
||
|
||
// 如果没有配置,返回null
|
||
if (empty(self::$cache) || empty(self::$cache['miniprograms'])) {
|
||
return null;
|
||
}
|
||
|
||
// 遍历所有小程序配置,查找关联该商户ID的配置
|
||
foreach (self::$cache['miniprograms'] as $miniprogram) {
|
||
if (isset($miniprogram['merchants']) && is_array($miniprogram['merchants']) && in_array($merchantId, $miniprogram['merchants'])) {
|
||
return $miniprogram;
|
||
}
|
||
}
|
||
|
||
// 如果没有找到关联的小程序配置,返回默认配置
|
||
return self::getDefaultMiniprogramConfig();
|
||
}
|
||
|
||
/**
|
||
* 通过订单前缀获取小程序配置
|
||
*
|
||
* @param string $orderPrefix 订单前缀
|
||
* @return array|null 小程序配置或null
|
||
*/
|
||
public static function getMiniprogramConfigByOrderPrefix($orderPrefix)
|
||
{
|
||
// 如果订单前缀为空,返回默认配置
|
||
if (empty($orderPrefix)) {
|
||
return self::getDefaultMiniprogramConfig();
|
||
}
|
||
|
||
// 加载所有小程序配置
|
||
self::loadMiniprogramConfigs();
|
||
|
||
// 如果没有配置,返回null
|
||
if (empty(self::$cache) || empty(self::$cache['miniprograms'])) {
|
||
return self::getCompatibleConfig();
|
||
}
|
||
|
||
// 遍历所有小程序配置,查找匹配订单前缀的配置
|
||
foreach (self::$cache['miniprograms'] as $miniprogram) {
|
||
if (isset($miniprogram['order_prefix']) && $miniprogram['order_prefix'] === $orderPrefix) {
|
||
return $miniprogram;
|
||
}
|
||
}
|
||
|
||
// 如果没有找到匹配的小程序配置,返回默认配置
|
||
return self::getDefaultMiniprogramConfig();
|
||
}
|
||
|
||
/**
|
||
* 加载所有小程序配置
|
||
*/
|
||
private static function loadMiniprogramConfigs()
|
||
{
|
||
// 如果已经加载过配置,直接返回
|
||
if (self::$cache !== null) {
|
||
return;
|
||
}
|
||
|
||
// 从配置中获取小程序配置
|
||
self::$cache = getConfig('miniprogram_setting');
|
||
}
|
||
|
||
/**
|
||
* 获取兼容旧版的微信小程序配置
|
||
*
|
||
* @return array 兼容的小程序配置
|
||
*/
|
||
private static function getCompatibleConfig()
|
||
{
|
||
// 微信小程序设置已移除,直接返回空配置
|
||
return [
|
||
'name' => '默认小程序',
|
||
'appid' => '',
|
||
'app_secret' => '',
|
||
'is_default' => 1,
|
||
'domain' => '',
|
||
'merchants' => []
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 清除小程序配置缓存
|
||
*/
|
||
public static function clearCache()
|
||
{
|
||
self::$cache = null;
|
||
}
|
||
}
|