manghe/app/common/helper/MiniprogramHelper.php
2025-04-25 00:16:04 +08:00

247 lines
7.4 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
}
/**
* 根据appid获取小程序配置
*
* @param string $appid 小程序appid
* @return array 小程序配置
*/
public static function getMiniprogramConfigByAppid($appid)
{
// 加载所有小程序配置
self::loadMiniprogramConfigs();
// 如果没有配置,返回空数组
if (empty(self::$cache) || empty(self::$cache['miniprograms'])) {
return self::getCompatibleConfig();
}
// 遍历所有小程序配置匹配appid
foreach (self::$cache['miniprograms'] as $miniprogram) {
if (isset($miniprogram['appid']) && $miniprogram['appid'] === $appid) {
return $miniprogram;
}
}
// 如果没有匹配的appid返回默认小程序配置
return self::getDefaultMiniprogramConfig();
}
/**
* 获取与商户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;
}
}