提交代码
This commit is contained in:
parent
1b5faa06ea
commit
436c24ea8c
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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}";
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
|
@ -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-----
|
||||
|
|
@ -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-----
|
||||
|
|
@ -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)下载
|
||||
Binary file not shown.
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ builder.Services.AddSwaggerGen(c =>
|
|||
});
|
||||
//配置路由选项,使URL全部小写
|
||||
//builder.Services.AddRouting(options => options.LowercaseUrls = true);
|
||||
builder.AddAlipay();
|
||||
builder.AddPayment();
|
||||
//添加多租户
|
||||
builder.AddMultiTenantMiaoYu();
|
||||
//添加腾讯云管理
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user