提交代码

This commit is contained in:
zpc 2024-08-25 15:46:39 +08:00
parent 1b5faa06ea
commit 436c24ea8c
16 changed files with 214 additions and 17 deletions

View File

@ -0,0 +1,36 @@
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HuanMeng.DotNetCore.Utility
{
public static class HttpContextExtensions
{
/// <summary>
/// 获取IP地址
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static string GetClientIpAddress(this HttpContext context)
{
// 尝试从X-Forwarded-For头部中获取IP地址
var forwardedFor = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (!string.IsNullOrEmpty(forwardedFor))
{
// 处理可能的多个IP地址通常第一个是客户端的真实IP
var ipAddresses = forwardedFor.Split(',');
if (ipAddresses.Length > 0)
{
return ipAddresses[0].Trim();
}
}
// 如果X-Forwarded-For头部不存在使用RemoteIpAddress
return context.Connection.RemoteIpAddress?.ToString();
}
}
}

View File

@ -269,7 +269,7 @@ public class ChatBLL : MiaoYuBase
#endregion
var claudeChatResponse = await Chat(charact, mess);
if (claudeChatResponse.Message.Contains("香港") || claudeChatResponse.Message.Contains("台湾")|||| claudeChatResponse.Message.Contains("摇头丸"))
if (claudeChatResponse.Message.Contains("香港") || claudeChatResponse.Message.Contains("台湾")|| claudeChatResponse.Message.Contains("摇头丸"))
{
var chatMessage = new ChatMessageDto()
{

View File

@ -27,6 +27,10 @@
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
<PackageReference Include="Senparc.Weixin" Version="6.19.1" />
<PackageReference Include="Senparc.Weixin.Cache.CsRedis" Version="1.0.0" />
<PackageReference Include="Senparc.Weixin.Cache.Redis" Version="2.19.1" />
<PackageReference Include="Senparc.Weixin.TenPay" Version="1.16.1" />
<PackageReference Include="StackExchange.Redis" Version="2.8.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.6.2" />
<PackageReference Include="TencentCloudSDK.Common" Version="3.0.1042" />

View File

@ -47,8 +47,9 @@ namespace HuanMeng.MiaoYu.Code.Order
//创建订单
try
{
var ip = HttpContextAccessor.HttpContext.GetClientIpAddress();
var payment = PaymentExtend.GetPayment(paymentMethod);
(var orderId, var order) = payment.CreateOrder(product.ProductName, product.Price.ToString(), product);
(var orderId, var order) = await payment.CreateOrder(product.ProductName, product.Price, product, ip);
var t = product.ToIntentOrder(paymentMethod, orderId);
t.UserId = _UserId;
Dao.daoDbMiaoYu.context.Add(t);

View File

@ -18,30 +18,31 @@ namespace HuanMeng.MiaoYu.Code.Payment.Alipay
/// </summary>
public class AlipayPayment : IPayment
{
public (string orderId, string order) CreateOrder(string productName, string price, params object[] args)
public Task<(string orderId, string order)> CreateOrder(string productName, decimal price, params object[] args)
{
if (string.IsNullOrEmpty(productName))
{
throw new ArgumentNullException($"产品名称不能为空!");
}
if (string.IsNullOrEmpty(price))
var priceStr = price.ToString();
if (string.IsNullOrEmpty(priceStr))
{
throw new ArgumentNullException($"价格不能为空!");
}
var orderId = GenerateTimestampIdWithOffset();
//.SetOptions(GetConfig());
var response = Factory.Payment.App().Optional("passback_params", "PaymentType%3Dzfb").Pay(productName, orderId, price);
var response = Factory.Payment.App().Optional("passback_params", "PaymentType%3Dzfb").Pay(productName, orderId, priceStr);
if (ResponseChecker.Success(response))
{
Console.WriteLine("调用成功");
}
else
{
throw new Exception("创建订单失败!");
throw new Exception("创建订单失败!" + response.Body);
}
//.PreCreate("Apple iPhone11 128G", "2234567234890", "5799.00");
var zfbOrderId = response.Body;
return (orderId, zfbOrderId);
return Task.FromResult((orderId, zfbOrderId));
}
private string GenerateTimestampIdWithOffset()
{

View File

@ -19,6 +19,6 @@ namespace HuanMeng.MiaoYu.Code.Payment.Contract
/// <param name="price">价格</param>
/// <param name="args">其它参数</param>
/// <returns></returns>
(string orderId,string order) CreateOrder(string productName, string price, params object[] args);
Task<(string orderId, string order)> CreateOrder(string productName, decimal price, params object[] args);
}
}

View File

@ -3,17 +3,12 @@ using Alipay.EasySDK.Kernel;
using HuanMeng.MiaoYu.Code.Payment.Alipay;
using HuanMeng.MiaoYu.Code.Payment.Contract;
using HuanMeng.MiaoYu.Code.Payment.WeChat;
using HuanMeng.MiaoYu.Model.Dto.Cache;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HuanMeng.MiaoYu.Code.Payment
{
@ -22,17 +17,27 @@ namespace HuanMeng.MiaoYu.Code.Payment
/// </summary>
public static class PaymentExtend
{
//public static WXPayTradeApi WxApi { get; set; }
/// <summary>
/// 支付
/// </su0mmary>
/// <param name="builder"></param>
/// <returns></returns>
public static IHostApplicationBuilder AddAlipay(this IHostApplicationBuilder builder)
public static IHostApplicationBuilder AddPayment(this IHostApplicationBuilder builder)
{
AddAlipay(builder.Configuration);
var weChatConfig = builder.Configuration.GetSection("Payment:WeChatConfig").Get<WeChatConfig>();
string key = Path.GetFullPath("DataStorage/1680394019/apiclient_key.pem");
string key1 = Path.GetFullPath("DataStorage/1680394019/apiclient_cert.pem");
return builder;
}
/// <summary>
/// 支付
/// </summary>
@ -71,11 +76,12 @@ namespace HuanMeng.MiaoYu.Code.Payment
/// <returns></returns>
public static IPayment GetPayment(string payment)
{
if (payment == "zfb")
{
return new AlipayPayment();
}
return new AlipayPayment();
return new WeChatPayment();
}
/// <summary>

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HuanMeng.MiaoYu.Code.Payment.WeChat
{
/// <summary>
///
/// </summary>
public class WeChatConfig
{
/// <summary>
///
/// </summary>
public string AppId { get; set; }
/// <summary>
///
/// </summary>
public string AppSecret { get; set; }
/// <summary>
///
/// </summary>
public string Key { get; set; }
public string MchId { get; set; }
public string NotifyUrl { get; set; }
}
}

View File

@ -0,0 +1,34 @@
using HuanMeng.MiaoYu.Code.Payment.Contract;
namespace HuanMeng.MiaoYu.Code.Payment.WeChat
{
/// <summary>
/// 微信支付
/// </summary>
public class WeChatPayment() : IPayment
{
public async Task<(string orderId, string order)> CreateOrder(string productName, decimal price, params object[] args)
{
// WechatPayHelper.pay_config = new WechatPayConfig()
// {
// app_id = "xxxxxx",
// mch_id = "xxxxxx",
// api_key = "xxxxxx",
// cert_path = "E:\\xxxxxx\\apiclient_cert.p12",
// cert_password = "xxxxxx"
// };
var orderId = GenerateTimestampIdWithOffset();
return new(orderId, null);
}
private string GenerateTimestampIdWithOffset()
{
var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 获取Unix时间戳毫秒
var random = new Random().Next(1000, 9999); // 生成四位随机数
return $"WX0{timestamp}J001Z{random}";
}
}
}

View File

@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIEKDCCAxCgAwIBAgIUHX+FwqWpjlJeDCLCPYNIqyDVfqYwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjQwODI1MDQyODU3WhcNMjkwODI0MDQyODU3WjCBgTETMBEGA1UEAwwK
MTY4MDM5NDAxOTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
DCTkuIrmtbflr7Dmoqbnp5HmioDlj5HlsZXmnInpmZDlhazlj7gxCzAJBgNVBAYT
AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAPP0Cx8Ttk72htBxRfFA05qPnxoW8zVQfWJaeMDIqcizBKglESGOnH5a
4FJUfr3NGtgwM61HZx2LiwI0fDY+1bq7iS2yCLtYDYLvAw9qUS5WIS5MMxqIMCEp
IThxqbRwFIe/G/fsf3unQovA7lr5WeNUVdY8dNx7AMnR6s+myuFZ6xaY43iYgfMh
RVSnH1ohAbWIiWxG+Ucg0KQ7Ipsv4pQ7oOBMXZL5zovHUB5ldKh2vZpp7lcnAQb6
Le2Y3i1RvJzeVg4Vd3jH/cpVabbkmwLJ3SN5l+Vjm+hZztjUvRo8hYipz/yYrSHt
W9ULBva9fZoabH/hDBBKCinKZtxe01cCAwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsG
A1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2Y2Eu
aXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRC
MDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdB
OUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQAA6OtZ
DGfquaAO1nJI0RkEgdJD1nXKlqOyCyIVpswIIqAeGQFMeOhXVVqbGhIh2nFmqQM/
4YypIlW0aduKIX51jS1HLiN2Yq7ad+TkbsbSFIQp7mOJX4mvmvHk+oovmOOsZspG
maAwlA2w0ParYWMWbXyi3euyNv9ne3M0CYpm+0UzcpqQC5Wq4DQV20+Q+Rcm+/qJ
sng9rkQdAOWQFrbGdaL5tXYhdLQPRo83NEYNZ6/4hNgnf6mvvtt+uKAhYcb0KhH2
a7cinPdnZEwe+UWuJPdrZDFQbaYJoKs8npzDTYkdIJnj1U/F5+DyPCWuyqNKg/qE
NvMO1RInLugUTK4W
-----END CERTIFICATE-----

View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDz9AsfE7ZO9obQ
cUXxQNOaj58aFvM1UH1iWnjAyKnIswSoJREhjpx+WuBSVH69zRrYMDOtR2cdi4sC
NHw2PtW6u4ktsgi7WA2C7wMPalEuViEuTDMaiDAhKSE4cam0cBSHvxv37H97p0KL
wO5a+VnjVFXWPHTcewDJ0erPpsrhWesWmON4mIHzIUVUpx9aIQG1iIlsRvlHINCk
OyKbL+KUO6DgTF2S+c6Lx1AeZXSodr2aae5XJwEG+i3tmN4tUbyc3lYOFXd4x/3K
VWm25JsCyd0jeZflY5voWc7Y1L0aPIWIqc/8mK0h7VvVCwb2vX2aGmx/4QwQSgop
ymbcXtNXAgMBAAECggEBAO27s2LTmOQWhoZ2/IwAerWypH+OQfCAwc+pDugAJMT6
/9zEUo97JLJV6SkSQnjAehqXzqRcYvZ92DeL4kgSr8HLpAEt8ChxxKkGNts85mPb
d3Zgt6Rxd0W5iTAyRAkc+ETZTm4qwIlGFCmRGDb7rEdHFmcyf0elbr0+ni9CAY/c
Y4xn/GEiFrQwIyo9Wtm5xbJ92zxk2Mkvvp7d+MrVLETc44apnTSL0s8Pr2r9Bghu
SWw1hk2S9FzesIIBPQMDImqMqfy05+nEvIPNijCS1pIqfqQLOuxx0NHsRVezM93i
Zj7gXooBHzwVlG0qs3ZE+unbUy/JA7eeqbRXxE6uoTECgYEA/LcoNanUiqdQxlES
0FknErK77WETObOSO7920xgF/kad8a8z7N7PvJS+CSxxc58ddlABTXYafJFeDksi
plaVlVn0rBiu+3nq8EcDZVQq8ZPIRXpKTbN3GJBUuSr1UZucCYPeDaBntYtKihJI
ZpWXp+gCcrXyuegaufv1Zj5xtOMCgYEA9x+7jXSZTSOG1yxNcaHKX1M1m0HR9n/P
OtCHtH8fkd3PKZHemYQ+b3YRd+ajwoxA6HVHVzdqrMCifcwHo3aQpgg1owbPKDOQ
L8xw9kJ2KfiBfztIe5Ja1cHmtDouKZmutrZnxKjRK2uM8ISoYION1vunm7kw6xlB
i8u7lisQ5f0CgYEA+2aJjbkBQ13nMSJ+AN5vzF4aLa+gnIpTMzTpVF5Vt/swLLoK
gd218vhVhHK9+jOT75rvcMvI1ZsXYkjEk40XCZiPmpSDnpBOc/FxI2BzyBcn6FYb
jOi31avfXMWrfh+7Pov8Xrnv8d47rNc7RzIRyGs55Du019RaoiJQogIEw9kCgYEA
3+o60KNTvJdyOEmGKm4EpncI3ZK4IngQVyRXse51tn+ak/n+Dm/K+seqcE/lFgRr
U7XgXGB0Ie+xy/Yw/aYSzr4li4BB+BUwkn7V4+y4kLMA8z3OIVmtQH4fAjKtXThJ
HHkOcRzd2k/rNouc3UaWILOJXQpiDsOlpnuFjz2aZCkCgYEAz8xngAopZlMSDhnE
TxfnunhHUPVgt3H5Bq6xO/nqbvYZCNHOrK0sf0Lkw4OitgAq/f3Z0gzoyb4axBTI
IP6H0BcEoKQsF/P+LRpjvK4Vvdi96vQbr6hASy01KLnpacXrwaOmfRMJZltoqwtj
+yGTmiLKK822oTfcBkEwiOnmBTw=
-----END PRIVATE KEY-----

View File

@ -0,0 +1,18 @@
欢迎使用微信支付!
附件中的三份文件证书pkcs12格式、证书pem格式、证书密钥pem格式,为接口中强制要求时需携带的证书文件。
证书属于敏感信息,请妥善保管不要泄露和被他人复制。
不同开发语言下的证书格式不同,以下为说明指引:
证书pkcs12格式apiclient_cert.p12
包含了私钥信息的证书文件为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
部分安全性要求较高的API需要使用该证书来确认您的调用身份
windows上可以直接双击导入系统导入过程中会提示输入证书密码证书密码默认为您的商户号1900006031
证书pem格式apiclient_cert.pem
从apiclient_cert.p12中导出证书部分的文件为pem格式请妥善保管不要泄漏和被他人复制
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
证书密钥pem格式apiclient_key.pem
从apiclient_cert.p12中导出密钥部分的文件为pem格式
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
备注说明:
由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书, 2018年3月6日后, 不再提供CA证书文件rootca.pem下载

View File

@ -31,6 +31,18 @@
</ItemGroup>
<ItemGroup>
<None Update="DataStorage\1680394019\apiclient_cert.p12">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="DataStorage\1680394019\apiclient_cert.pem">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="DataStorage\1680394019\apiclient_key.pem">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="DataStorage\1680394019\证书使用说明.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="DataStorage\TextCensor\屏蔽词库.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

View File

@ -132,7 +132,7 @@ builder.Services.AddSwaggerGen(c =>
});
//配置路由选项使URL全部小写
//builder.Services.AddRouting(options => options.LowercaseUrls = true);
builder.AddAlipay();
builder.AddPayment();
//添加多租户
builder.AddMultiTenantMiaoYu();
//添加腾讯云管理