增加微信支付
This commit is contained in:
parent
436c24ea8c
commit
90e4e32b22
|
|
@ -27,10 +27,7 @@
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
|
||||||
<PackageReference Include="Senparc.Weixin" Version="6.19.1" />
|
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.7.0" />
|
||||||
<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="StackExchange.Redis" Version="2.8.0" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.6.2" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.6.2" />
|
||||||
<PackageReference Include="TencentCloudSDK.Common" Version="3.0.1042" />
|
<PackageReference Include="TencentCloudSDK.Common" Version="3.0.1042" />
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,12 @@ using HuanMeng.MiaoYu.Model.Dto.Cache;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
|
|
||||||
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
|
||||||
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
|
||||||
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Utilities;
|
||||||
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace HuanMeng.MiaoYu.Code.Payment
|
namespace HuanMeng.MiaoYu.Code.Payment
|
||||||
{
|
{
|
||||||
|
|
@ -17,7 +23,8 @@ namespace HuanMeng.MiaoYu.Code.Payment
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class PaymentExtend
|
public static class PaymentExtend
|
||||||
{
|
{
|
||||||
//public static WXPayTradeApi WxApi { get; set; }
|
private static WechatTenpayClientOptions wechatTenpayClientOptions { get; set; } = new WechatTenpayClientOptions();
|
||||||
|
private static WeChatConfig weChatConfig { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 支付
|
/// 支付
|
||||||
/// </su0mmary>
|
/// </su0mmary>
|
||||||
|
|
@ -27,13 +34,24 @@ namespace HuanMeng.MiaoYu.Code.Payment
|
||||||
{
|
{
|
||||||
|
|
||||||
AddAlipay(builder.Configuration);
|
AddAlipay(builder.Configuration);
|
||||||
|
weChatConfig = builder.Configuration.GetSection("Payment:WeChatConfig").Get<WeChatConfig>();
|
||||||
|
if (weChatConfig == null)
|
||||||
|
{
|
||||||
|
throw new Exception("微信支付失败");
|
||||||
|
}
|
||||||
|
var manager = new InMemoryCertificateManager();
|
||||||
|
/* 仅列出必须配置项。也包含一些诸如超时时间、UserAgent 等的配置项 */
|
||||||
|
wechatTenpayClientOptions = new WechatTenpayClientOptions()
|
||||||
|
{
|
||||||
|
|
||||||
|
MerchantId = weChatConfig.MchId,
|
||||||
|
MerchantV3Secret = weChatConfig.Key,
|
||||||
|
MerchantCertificateSerialNumber = weChatConfig.MerchantCertificateSerialNumber,
|
||||||
|
MerchantCertificatePrivateKey = weChatConfig.MerchantCertificatePrivateKey,
|
||||||
|
PlatformCertificateManager = manager
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -81,7 +99,7 @@ namespace HuanMeng.MiaoYu.Code.Payment
|
||||||
{
|
{
|
||||||
return new AlipayPayment();
|
return new AlipayPayment();
|
||||||
}
|
}
|
||||||
return new WeChatPayment();
|
return new WeChatPayment(wechatTenpayClientOptions, weChatConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -23,10 +23,26 @@ namespace HuanMeng.MiaoYu.Code.Payment.WeChat
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
public string MchId { get; set; }
|
public string MchId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
public string NotifyUrl { get; set; }
|
public string NotifyUrl { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public string MerchantCertificateSerialNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public string MerchantCertificatePrivateKey { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,47 @@
|
||||||
using HuanMeng.MiaoYu.Code.Payment.Contract;
|
using HuanMeng.MiaoYu.Code.Payment.Contract;
|
||||||
|
|
||||||
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
|
||||||
|
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace HuanMeng.MiaoYu.Code.Payment.WeChat
|
namespace HuanMeng.MiaoYu.Code.Payment.WeChat
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 微信支付
|
/// 微信支付
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WeChatPayment() : IPayment
|
public class WeChatPayment(WechatTenpayClientOptions wechatTenpayClientOptions, WeChatConfig weChatConfig) : 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)
|
||||||
{
|
{
|
||||||
|
|
||||||
// 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();
|
var orderId = GenerateTimestampIdWithOffset();
|
||||||
|
var client = new WechatTenpayClient(wechatTenpayClientOptions);
|
||||||
return new(orderId, null);
|
/* 以 JSAPI 统一下单接口为例 */
|
||||||
|
var request = new CreatePayTransactionAppRequest()
|
||||||
|
{
|
||||||
|
OutTradeNumber = orderId,
|
||||||
|
AppId = weChatConfig.AppId,
|
||||||
|
Description = productName,
|
||||||
|
ExpireTime = DateTimeOffset.Now.AddMinutes(20),
|
||||||
|
NotifyUrl = weChatConfig.NotifyUrl,
|
||||||
|
Amount = new CreatePayTransactionJsapiRequest.Types.Amount()
|
||||||
|
{
|
||||||
|
Total = (int)(price * 100)
|
||||||
|
},
|
||||||
|
};
|
||||||
|
var response = client.ExecuteCreatePayTransactionAppAsync(request).Result;
|
||||||
|
if (response.IsSuccessful())
|
||||||
|
{
|
||||||
|
var paramMap = client.GenerateParametersForAppPayRequest(request.AppId, response.PrepayId);
|
||||||
|
Console.WriteLine("PrepayId:" + response.PrepayId);
|
||||||
|
return new(orderId, JsonConvert.SerializeObject(paramMap));
|
||||||
|
}
|
||||||
|
throw new Exception("微信下单失败");
|
||||||
}
|
}
|
||||||
private string GenerateTimestampIdWithOffset()
|
private string GenerateTimestampIdWithOffset()
|
||||||
{
|
{
|
||||||
var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 获取Unix时间戳(毫秒)
|
var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 获取Unix时间戳(毫秒)
|
||||||
var random = new Random().Next(1000, 9999); // 生成四位随机数
|
var random = new Random().Next(1000, 9999); // 生成四位随机数
|
||||||
return $"WX0{timestamp}J001Z{random}";
|
return $"WX0{timestamp}J001C{random}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user