提交代码
This commit is contained in:
parent
9140db4e33
commit
c8796befe6
|
|
@ -10,13 +10,14 @@ using Alipay.EasySDK.Kernel;
|
||||||
using Alipay.EasySDK.Kernel.Util;
|
using Alipay.EasySDK.Kernel.Util;
|
||||||
using Alipay.EasySDK.Payment.FaceToFace.Models;
|
using Alipay.EasySDK.Payment.FaceToFace.Models;
|
||||||
using StackExchange.Redis;
|
using StackExchange.Redis;
|
||||||
|
using HuanMeng.DotNetCore.MultiTenant.Contract;
|
||||||
|
|
||||||
namespace HuanMeng.MiaoYu.Code.Payment.Alipay
|
namespace HuanMeng.MiaoYu.Code.Payment.Alipay
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AlipayPayment : IPayment
|
public class AlipayPayment(Config config, ITenantInfo tenantInfo) : IPayment
|
||||||
{
|
{
|
||||||
public Task<(string orderId, string order)> CreateOrder(string productName, decimal price, params object[] args)
|
public Task<(string orderId, string order)> CreateOrder(string productName, decimal price, params object[] args)
|
||||||
{
|
{
|
||||||
|
|
@ -31,12 +32,11 @@ namespace HuanMeng.MiaoYu.Code.Payment.Alipay
|
||||||
}
|
}
|
||||||
var orderId = GenerateTimestampIdWithOffset();
|
var orderId = GenerateTimestampIdWithOffset();
|
||||||
//.SetOptions(GetConfig());
|
//.SetOptions(GetConfig());
|
||||||
var response = Factory.Payment.App().Optional("passback_params", "PaymentType%3Dzfb").Pay(productName, orderId, priceStr);
|
//AsyncNotify
|
||||||
if (ResponseChecker.Success(response))
|
//https://pay.shhuanmeng.com/api/${tenant}/zfb/${orderId}
|
||||||
{
|
var notifyUrl = config.NotifyUrl.Replace("${pay}", "zfb").Replace("${orderId}", orderId).Replace("${tenant}", tenantInfo.Identifier); ;
|
||||||
Console.WriteLine("调用成功");
|
var response = Factory.Payment.App().AsyncNotify(notifyUrl).Optional("passback_params", "PaymentType%3Dzfb").Pay(productName, orderId, priceStr);
|
||||||
}
|
if (!ResponseChecker.Success(response))
|
||||||
else
|
|
||||||
{
|
{
|
||||||
throw new Exception("创建订单失败!" + response.Body);
|
throw new Exception("创建订单失败!" + response.Body);
|
||||||
}
|
}
|
||||||
|
|
@ -44,6 +44,10 @@ namespace HuanMeng.MiaoYu.Code.Payment.Alipay
|
||||||
var zfbOrderId = response.Body;
|
var zfbOrderId = response.Body;
|
||||||
return Task.FromResult((orderId, zfbOrderId));
|
return Task.FromResult((orderId, zfbOrderId));
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
private string GenerateTimestampIdWithOffset()
|
private string GenerateTimestampIdWithOffset()
|
||||||
{
|
{
|
||||||
var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 获取Unix时间戳(毫秒)
|
var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 获取Unix时间戳(毫秒)
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ namespace HuanMeng.MiaoYu.Code.Payment
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Config AlipayConfig { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 支付
|
/// 支付
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -80,7 +80,9 @@ namespace HuanMeng.MiaoYu.Code.Payment
|
||||||
//可设置异步通知接收服务地址(可选)
|
//可设置异步通知接收服务地址(可选)
|
||||||
NotifyUrl = x.NotifyUrl,
|
NotifyUrl = x.NotifyUrl,
|
||||||
};
|
};
|
||||||
|
AlipayConfig = config;
|
||||||
Factory.SetOptions(config);
|
Factory.SetOptions(config);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -93,14 +95,14 @@ namespace HuanMeng.MiaoYu.Code.Payment
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="payment"></param>
|
/// <param name="payment"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static IPayment GetPayment(string payment)
|
public static IPayment GetPayment(string payment, MiaoYuBase miaoYuBase)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (payment == "zfb")
|
if (payment == "zfb")
|
||||||
{
|
{
|
||||||
return new AlipayPayment();
|
return new AlipayPayment(AlipayConfig, miaoYuBase.TenantInfo);
|
||||||
}
|
}
|
||||||
return new WeChatPayment(wxClient, weChatConfig);
|
return new WeChatPayment(wxClient, weChatConfig, miaoYuBase.TenantInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -3,26 +3,28 @@ using HuanMeng.MiaoYu.Code.Payment.Contract;
|
||||||
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
|
||||||
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using HuanMeng.DotNetCore.MultiTenant.Contract;
|
||||||
|
|
||||||
namespace HuanMeng.MiaoYu.Code.Payment.WeChat
|
namespace HuanMeng.MiaoYu.Code.Payment.WeChat
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 微信支付
|
/// 微信支付
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WeChatPayment(WechatTenpayClient client, WeChatConfig weChatConfig) : IPayment
|
public class WeChatPayment(WechatTenpayClient client, WeChatConfig weChatConfig, ITenantInfo tenantInfo) : IPayment
|
||||||
{
|
{
|
||||||
public async Task<(string orderId, string order)> CreateOrder(string productName, decimal price, params object[] args)
|
public async Task<(string orderId, string order)> CreateOrder(string productName, decimal price, params object[] args)
|
||||||
{
|
{
|
||||||
var orderId = GenerateTimestampIdWithOffset();
|
var orderId = GenerateTimestampIdWithOffset();
|
||||||
//var client = new WechatTenpayClient(wechatTenpayClientOptions);
|
//var client = new WechatTenpayClient(wechatTenpayClientOptions);
|
||||||
/* 以 JSAPI 统一下单接口为例 */
|
/* 以 JSAPI 统一下单接口为例 */
|
||||||
|
var notifyUrl = weChatConfig.NotifyUrl.Replace("${pay}", "wx").Replace("${orderId}", orderId).Replace("${tenant}", tenantInfo.Identifier);
|
||||||
var request = new CreatePayTransactionAppRequest()
|
var request = new CreatePayTransactionAppRequest()
|
||||||
{
|
{
|
||||||
OutTradeNumber = orderId,
|
OutTradeNumber = orderId,
|
||||||
AppId = weChatConfig.AppId,
|
AppId = weChatConfig.AppId,
|
||||||
Description = productName,
|
Description = productName,
|
||||||
ExpireTime = DateTimeOffset.Now.AddMinutes(20),
|
ExpireTime = DateTimeOffset.Now.AddMinutes(20),
|
||||||
NotifyUrl = weChatConfig.NotifyUrl,
|
NotifyUrl = notifyUrl,
|
||||||
Amount = new CreatePayTransactionJsapiRequest.Types.Amount()
|
Amount = new CreatePayTransactionJsapiRequest.Types.Amount()
|
||||||
{
|
{
|
||||||
Total = (int)(price * 100)
|
Total = (int)(price * 100)
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,10 @@ namespace HuanMeng.MiaoYu.Code.SysDictionary.DictionaryNetwork
|
||||||
{
|
{
|
||||||
dictionaryUrl = configuration.GetSection("SystemConfig:DictionaryUrl").Get<string>() ?? "";
|
dictionaryUrl = configuration.GetSection("SystemConfig:DictionaryUrl").Get<string>() ?? "";
|
||||||
}
|
}
|
||||||
|
if (string.IsNullOrEmpty(dictionaryUrl))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
using var client = httpClientFactory.CreateClient();
|
using var client = httpClientFactory.CreateClient();
|
||||||
var request = await client.GetAsync(dictionaryUrl);
|
var request = await client.GetAsync(dictionaryUrl);
|
||||||
if (request.IsSuccessStatusCode)
|
if (request.IsSuccessStatusCode)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
namespace HuanMeng.MiaoYu.WebPayApi.Controllers
|
||||||
|
{
|
||||||
|
[Route("api/[controller]/")]
|
||||||
|
[ApiController]
|
||||||
|
public class PayController : ControllerBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("{tenant?}/{pay?}/{orderId?}")]
|
||||||
|
public string Get(string? tenant, string? pay, string? orderId)
|
||||||
|
{
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ${tenant}/zfb/${orderId}
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("{tenant?}/{pay?}/{orderId?}")]
|
||||||
|
public string Post(string? tenant, string? pay,string? orderId)
|
||||||
|
{
|
||||||
|
return $"ok;{pay},{orderId}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,15 @@
|
||||||
<PackageReference Include="AutoMapper" Version="13.0.1" />
|
<PackageReference Include="AutoMapper" Version="13.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.6" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
|
||||||
|
<PackageReference Include="Serilog" Version="4.0.0" />
|
||||||
|
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\0-core\HuanMeng.DotNetCore\HuanMeng.DotNetCore.csproj" />
|
||||||
|
<ProjectReference Include="..\..\0-core\HuanMeng.MiaoYu.Code\HuanMeng.MiaoYu.Code.csproj" />
|
||||||
|
<ProjectReference Include="..\..\0-core\HuanMeng.MiaoYu.Model\HuanMeng.MiaoYu.Model.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,126 @@
|
||||||
|
using AgileConfig.Client;
|
||||||
|
|
||||||
|
using HuanMeng.DotNetCore.CustomExtension;
|
||||||
|
using HuanMeng.DotNetCore.MiddlewareExtend;
|
||||||
|
using HuanMeng.DotNetCore.Utility.AssemblyHelper;
|
||||||
|
using HuanMeng.MiaoYu.Code.Base;
|
||||||
|
using HuanMeng.MiaoYu.Code.JwtUtil;
|
||||||
|
using HuanMeng.MiaoYu.Code.MultiTenantUtil;
|
||||||
|
using HuanMeng.MiaoYu.Code.Other;
|
||||||
|
using HuanMeng.MiaoYu.Code.Payment;
|
||||||
|
using HuanMeng.MiaoYu.Code.SysDictionary;
|
||||||
|
using HuanMeng.MiaoYu.Code.TencentUtile;
|
||||||
|
using HuanMeng.MiaoYu.Code.Users.UserAccount.VerificationCodeManager;
|
||||||
|
using HuanMeng.MiaoYu.Model.Dto;
|
||||||
|
using HuanMeng.MiaoYu.Code.AppExtend;
|
||||||
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using Microsoft.OpenApi.Models;
|
||||||
|
|
||||||
|
using Newtonsoft.Json.Serialization;
|
||||||
|
|
||||||
|
using Serilog;
|
||||||
|
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Reflection;
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
builder.Host.UseSerilog((context, services, configuration) => configuration
|
||||||
|
.ReadFrom.Configuration(context.Configuration)
|
||||||
|
.ReadFrom.Services(services)
|
||||||
|
.Enrich.FromLogContext());
|
||||||
|
builder.AddAppConfigClient();
|
||||||
|
builder.Services.AddSingleton(typeof(ILogger<MiaoYuBase>), serviceProvider =>
|
||||||
|
{
|
||||||
|
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
|
||||||
|
return loggerFactory.CreateLogger<MiaoYuBase>();
|
||||||
|
});
|
||||||
|
// 检索程序集信息
|
||||||
|
AssemblyInfo assemblyInfo = AssemblyInfoHelper.GetAssemblyInfo();
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
|
builder.Services.AddHttpClient();
|
||||||
|
builder.Services.AddHttpContextAccessor(); //添加httpContext注入访问
|
||||||
|
#region 添加跨域
|
||||||
|
var _myAllowSpecificOrigins = "_myAllowSpecificOrigins";
|
||||||
|
builder.Services.AddCustomCors(_myAllowSpecificOrigins);
|
||||||
|
#endregion
|
||||||
|
#region automap
|
||||||
|
var mapperDomain = AppDomain.CurrentDomain.GetAssemblies().Where(it => it.FullName.Contains("HuanMeng") || it.FullName.Contains("XLib.")).ToList();
|
||||||
|
Type type = typeof(ResponseUserInfo);
|
||||||
|
if (type != null)
|
||||||
|
{
|
||||||
|
Assembly assembly = Assembly.GetAssembly(type);
|
||||||
|
if (!mapperDomain.Any(it => it.FullName == assembly.FullName))
|
||||||
|
{
|
||||||
|
mapperDomain.Add(assembly);
|
||||||
|
}
|
||||||
|
}
|
||||||
builder.Services.AddControllers();
|
builder.Services.AddControllers();
|
||||||
|
builder.Services.AddSwaggerGen();
|
||||||
|
builder.Services.AddAutoMapper(mapperDomain);
|
||||||
|
#endregion
|
||||||
|
|
||||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
builder.Services.AddSwaggerGen();
|
builder.AddDictionaryInfo();
|
||||||
|
//配置路由选项,使URL全部小写
|
||||||
|
//builder.Services.AddRouting(options => options.LowercaseUrls = true);
|
||||||
|
builder.AddPayment();
|
||||||
|
//添加多租户
|
||||||
|
builder.AddMultiTenantMiaoYu();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
// Configure the HTTP request pipeline.
|
// Configure the HTTP request pipeline.
|
||||||
if (app.Environment.IsDevelopment())
|
//if (app.Environment.IsDevelopment())
|
||||||
|
//{
|
||||||
|
app.UseSwagger();
|
||||||
|
app.UseSwaggerUI(c =>
|
||||||
{
|
{
|
||||||
app.UseSwagger();
|
|
||||||
app.UseSwaggerUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
c.EnableDeepLinking();
|
||||||
|
c.DefaultModelsExpandDepth(3);
|
||||||
|
c.DefaultModelExpandDepth(3);
|
||||||
|
c.EnableFilter("true");
|
||||||
|
//c.RoutePrefix = string.Empty;
|
||||||
|
c.SwaggerEndpoint("/swagger/v1/swagger.json", "寰梦支付API V1");
|
||||||
|
});
|
||||||
|
//}
|
||||||
|
app.UseSerilogRequestLogging();
|
||||||
app.UseAuthorization();
|
app.UseAuthorization();
|
||||||
|
//自定义初始化
|
||||||
|
//使用跨域
|
||||||
|
app.UseCors(_myAllowSpecificOrigins);
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|
||||||
|
app.UseStaticFiles();//静态文件访问配置
|
||||||
|
|
||||||
|
//执行扩展中间件
|
||||||
|
app.UseExceptionMiddleware()
|
||||||
|
.UseExecutionTimeMiddleware();
|
||||||
|
|
||||||
|
#region 默认请求
|
||||||
|
app.MapGet("/", () => "请求成功").WithName("默认请求");
|
||||||
|
|
||||||
|
var startDateTime = DateTime.Now;
|
||||||
|
var InformationalVersion = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
|
||||||
|
Console.WriteLine($"version:{InformationalVersion}");
|
||||||
|
app.MapGet("/system", () =>
|
||||||
|
{
|
||||||
|
|
||||||
|
using Process currentProcess = Process.GetCurrentProcess();
|
||||||
|
// CPU使用率 (一般是一个0-100之间的值,但实际是时间占比,需要转换)
|
||||||
|
double cpuUsage = currentProcess.TotalProcessorTime.TotalMilliseconds / Environment.TickCount * 100;
|
||||||
|
// 已用内存 (字节)
|
||||||
|
long memoryUsage = currentProcess.WorkingSet64;
|
||||||
|
return new
|
||||||
|
{
|
||||||
|
msg = $"系统信息:{assemblyInfo.InformationalVersion},启动时间:{startDateTime.ToString("yyyy-MM-dd HH:mm:ss")},已安全运行时间:{DateTime.Now.Subtract(startDateTime).TotalMinutes.ToString("0.##")}分钟",
|
||||||
|
assemblyInfo,
|
||||||
|
startDateTime,
|
||||||
|
MemoryUsage = $"{memoryUsage / (1024.0 * 1024.0):F2}MB",
|
||||||
|
CPUUsage = $"{cpuUsage:F2}%"
|
||||||
|
|
||||||
|
};
|
||||||
|
}).WithName("获取系统数据");
|
||||||
|
#endregion
|
||||||
app.Run();
|
app.Run();
|
||||||
|
|
|
||||||
|
|
@ -4,5 +4,12 @@
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"AgileConfig": {
|
||||||
|
"appId": "huanmeng",
|
||||||
|
"secret": "dfa47997-fb5c-b644-3770-880f5e7fb403",
|
||||||
|
"nodes": "http://124.220.55.158:94", //多个节点使用逗号分隔
|
||||||
|
"env": "DEV",
|
||||||
|
"name": "PayClient"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,5 +5,56 @@
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*",
|
||||||
|
"Serilog": {
|
||||||
|
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
|
||||||
|
"MinimumLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Override": {
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"System": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"WriteTo": [
|
||||||
|
{ "Name": "Console" },
|
||||||
|
{
|
||||||
|
"Name": "File",
|
||||||
|
"Args": {
|
||||||
|
"path": "../output/logs/info/log-.txt",
|
||||||
|
"rollingInterval": "Day",
|
||||||
|
"restrictedToMinimumLevel": "Information", //写入日志的级别
|
||||||
|
"shared": true
|
||||||
|
//"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "File",
|
||||||
|
"Args": {
|
||||||
|
"path": "../output/logs/error/log-.txt",
|
||||||
|
"rollingInterval": "Day", //日志文件按天滚动生成。
|
||||||
|
"restrictedToMinimumLevel": "Error", //写入日志的级别 //包括 Verbose、Debug、Information、Warning、Error 和 Fatal
|
||||||
|
"shared": true //不占用文件
|
||||||
|
// "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "File",
|
||||||
|
"Args": {
|
||||||
|
"path": "../output/logs/debug/log-.txt",
|
||||||
|
"rollingInterval": "Day", //日志文件按天滚动生成。
|
||||||
|
"restrictedToMinimumLevel": "Debug", //写入日志的级别 //包括 Verbose、Debug、Information、Warning、Error 和 Fatal
|
||||||
|
"shared": true //不占用文件
|
||||||
|
// "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
|
||||||
|
},
|
||||||
|
"AgileConfig": {
|
||||||
|
"appId": "huanmeng",
|
||||||
|
"secret": "dfa47997-fb5c-b644-3770-880f5e7fb403",
|
||||||
|
"nodes": "http://10.0.12.5:94", //多个节点使用逗号分隔
|
||||||
|
"env": "PROD",
|
||||||
|
"name": "PayClient"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user