using System; using System.Collections.Generic; using System.Threading.Tasks; using Alipay.AopSdk.Core; using Alipay.AopSdk.Core.Request; using Alipay.AopSdk.Core.Response; using AlipaySDKNet.OpenAPI.Api; using AlipaySDKNet.OpenAPI.Client; using AlipaySDKNet.OpenAPI.Model; using AlipaySDKNet.OpenAPI.Util; using AlipaySDKNet.OpenAPI.Util.Model; using Google.Protobuf.WellKnownTypes; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using NCC.Common.Configuration; using NCC.Common.Core.Manager; using NCC.Common.Extension; using NCC.Common.Helper; using NCC.Dependency; using NCC.DynamicApiController; using NCC.Extend.Entitys; using NCC.Extend.Interfaces.AliPay; using NCC.System.Entitys.Permission; using NCC.System.Entitys.System; using Newtonsoft.Json.Linq; using SqlSugar; using NCC.DataEncryption; using NCC.Common.Const; using Microsoft.AspNetCore.Http; using Yitter.IdGenerator; using NCC.Common.Extensions; using Aop.Api.Util; using Microsoft.AspNetCore.Components.Forms; using Serilog; using NCC.Localization; using NCC.Extend.Entitys.Dto.UavFeeRule; using Mapster; using NCC.Code.QrCode; using System.IO; using QRCoder; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using System.Net.Http; using NCC.Extend.Entitys.Enums; namespace NCC.Extend.AliPay { /// /// 支付宝支付服务 /// [ApiDescriptionSettings(Tag = "支付宝支付服务", Name = "AliPay", Order = 200)] [Route("api/Extend/[controller]")] public class AliPayService : IAliPayService, IDynamicApiController, ITransient { private readonly SqlSugarScope _db; private readonly IUserManager _userManager; private readonly IHttpContextAccessor _httpContextAccessor; private static readonly HttpClient httpClient = new HttpClient(); private static AlipayOptions _AlipayOptions; /// /// 初始化一个类型的新实例 /// public AliPayService(ISqlSugarClient db, IUserManager userManager, IHttpContextAccessor httpContextAccessor) { _db = (SqlSugarScope)db; _userManager = userManager; _httpContextAccessor = httpContextAccessor; } #region 支付宝基本信息 [NonAction] private static AlipayConfig GetAlipayConfig() { return new AlipayConfig { ServerUrl = "https://openapi.alipay.com", // AppId = "2021005150691832", AppId = App.Configuration["PaymentSettings:AlipayConfig:APPLETE_APPID"], PrivateKey = App.Configuration["PaymentSettings:AlipayConfig:ALIPay_RSA_PRIVATEKEY"], AlipayPublicKey = App.Configuration["PaymentSettings:AlipayConfig:ALIPay_RSA_ALI_PUBLICKEY"], }; } [NonAction] private static Aop.Api.AlipayConfig GetAlipayConfig_V2() { Aop.Api.AlipayConfig alipayConfig = new Aop.Api.AlipayConfig(); alipayConfig.ServerUrl = "https://openapi.alipay.com/gateway.do"; alipayConfig.AppId = App.Configuration["PaymentSettings:AlipayConfig:APPLETE_APPID"]; alipayConfig.PrivateKey = App.Configuration["PaymentSettings:AlipayConfig:ALIPay_RSA_PRIVATEKEY"]; alipayConfig.Format = "json"; alipayConfig.AlipayPublicKey = App.Configuration["PaymentSettings:AlipayConfig:ALIPay_RSA_ALI_PUBLICKEY"]; alipayConfig.Charset = "UTF-8"; alipayConfig.SignType = "RSA2"; return alipayConfig; } #endregion #region 生成支付宝小程序的二维码 /// /// 生成支付宝小程序的二维码 /// /// /// [HttpPost("CreateQrCode")] [AllowAnonymous] public async Task CreateQrCode(string queryParams) { //alipayqr://platformapi/startapp?appId=2021005150691832&page=pages/projectClockin/projectClockin&query=deviceCode=Sa123784932 queryParams = queryParams.Replace("id=", ""); string serverUrl = "https://openapi.alipay.com/gateway.do"; string appId = GetAlipayConfig().AppId; string privateKey = GetAlipayConfig().PrivateKey; string alipayPublicKey = GetAlipayConfig().AlipayPublicKey; IAopClient client = new DefaultAopClient(serverUrl, appId, privateKey, "json", "1.0", "RSA2", alipayPublicKey, "UTF-8", false); var request = new AlipayOpenAppQrcodeCreateRequest(); request.BizContent = $@"{{ ""url_param"": ""pages/projectClockin/projectClockin"", ""query_param"": ""{queryParams}"", ""describe"": ""跳转首页"", ""page"": ""pages/projectClockin/projectClockin"" }}"; AlipayOpenAppQrcodeCreateResponse response = client.Execute(request); if (response.IsError) return (false, "", response.Msg); var content = await ReadQrCodeAsync(response.QrCodeUrl, queryParams); var QrCodeUrl = GenerateQrCodeToFile($"{content}?deviceCode={queryParams}", "DeviceQrCode"); return (true, QrCodeUrl, "success", content); // return (true, response.QrCodeUrl, "success"); } /// /// 创建二维码 /// /// /// /// /// [NonAction] public static string GenerateQrCodeToFile(string content, string dir) { if (string.IsNullOrWhiteSpace(content)) throw new ArgumentNullException(nameof(content)); if (string.IsNullOrWhiteSpace(dir)) throw new ArgumentNullException(nameof(dir)); string fileName = Guid.NewGuid().ToString("N") + ".png"; // 拼接跨平台路径 string basePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "image", "qr", dir); if (!Directory.Exists(basePath)) Directory.CreateDirectory(basePath); string fullPath = Path.Combine(basePath, fileName); try { // 创建二维码 using (QRCodeGenerator qrGenerator = new QRCodeGenerator()) using (QRCodeData qrCodeData = qrGenerator.CreateQrCode(content, QRCodeGenerator.ECCLevel.Q)) using (PngByteQRCode qrCode = new PngByteQRCode(qrCodeData)) { byte[] qrCodeAsPng = qrCode.GetGraphic(20); File.WriteAllBytes(fullPath, qrCodeAsPng); } // 返回相对路径 return $"/image/qr/{dir}/{fileName}"; } catch (Exception ex) { Console.WriteLine($"二维码生成失败: {ex.Message}"); return null; } } [NonAction] public static async Task ReadQrCodeAsync(string pathOrUrl, string queryParams) { try { using Image image = await DownloadImageAsync(pathOrUrl, queryParams); var reader = new ZXing.ImageSharp.BarcodeReader { AutoRotate = true, TryInverted = true }; var result = reader.Decode(image); return result?.Text ?? "未识别出二维码内容"; } catch (Exception ex) { return $"识别失败:{ex.Message}"; } } public static async Task> DownloadImageAsync(string url, string queryParams) { try { var savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "/wwwroot/image/qr/DeviceQrCode", $"{queryParams}.png"); var directory = Path.GetDirectoryName(savePath); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } var response = await httpClient.GetAsync(url); response.EnsureSuccessStatusCode(); await using var stream = await response.Content.ReadAsStreamAsync(); await using var fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write); await stream.CopyToAsync(fileStream); return await SixLabors.ImageSharp.Image.LoadAsync(savePath); } catch (Exception ex) { Console.WriteLine("下载图片失败: " + ex.Message); return null; } } #endregion #region 创建普通支付订单 /// /// 创建支付订单 /// /// /// [HttpPost("CreatePay")] [AllowAnonymous] public async Task CreatePay(AliPayEntity input) { // return input.ToJson(); // 初始化SDK AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); // 构造请求参数以调用接口 AlipayTradeApi instance = new AlipayTradeApi(); instance.Client.SetAlipayConfigUtil(alipayConfigUtil); AlipayTradeCreateModel data = new AlipayTradeCreateModel(); // 设置商户订单号 data.OutTradeNo = input.OutTradeNo; // 设置产品码 data.ProductCode = "JSAPI_PAY"; // 设置小程序支付中 data.OpAppId = alipayConfigUtil.AppId; // 设置订单总金额 data.TotalAmount = input.TotalAmount.ToString(); // 设置业务扩展参数 // ExtendParams extendParams = new ExtendParams(); // extendParams.TradeComponentOrderId = "2023060801502300000008810000005657"; // data.ExtendParams = extendParams; // 设置可打折金额 data.DiscountableAmount = input.DiscountableAmount.ToString(); // 设置订单标题 data.Subject = input.Subject; // 设置订单附加信息 data.Body = input.Body; // uid参数未来计划废弃,存量商户可继续使用,新商户请使用openid。请根据应用-开发配置-openid配置选择支持的字段。 // data.BuyerId = "2088102146225135"; // 设置买家支付宝用户唯一标识 data.BuyerOpenId = input.BuyerOpenId; // 设置商户门店编号(暂时不用) // data.StoreId = "NJ_001"; // 第三方代调用模式下请设置app_auth_token CustomizedParams customizedParams = new CustomizedParams(); // customizedParams.AppAuthToken = "<-- 请填写应用授权令牌 -->"; try { var response = instance.Create(data, 0, customizedParams); return response; } catch (Exception e) { // AlipayTradeCreateDefaultResponse errorObject = (AlipayTradeCreateDefaultResponse)e.ErrorObject; // Console.WriteLine("调用失败:" + errorObject); return e.ToJson(); } } #endregion #region 线上资金授权冻结接口 /// /// 线上资金授权冻结接口 /// /// /// [HttpPost("Appfreeze")] public async Task Appfreeze(AliPayAppFreezeEntity input) { //获取订单的基本信息 var orderinfo = _db.Queryable().Where(x => x.OrderNo == input.OutOrderNo).First(); //从订单中获取计费规则的快照 UavFeeRuleEntity uavFee = orderinfo.FeeRuleSnapshot.ToObject().Adapt();//获取快照中的费用规则 // 初始化SDK AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); GenericExecuteApi api = new GenericExecuteApi(); api.Client.SetAlipayConfigUtil(alipayConfigUtil); // 构造请求参数以调用接口 Dictionary bizParams = new Dictionary(); Dictionary bizContent = new Dictionary(); //通过扣费规则表去找到冻结金额 //----------------- input.Amount = uavFee.TotalCap; //----------------- // 设置订单标题 // bizContent.Add("order_title", input.OrderTitle); bizContent.Add("order_title", "无人机租借"); // 设置商户授权资金订单号 bizContent.Add("out_order_no", input.OutOrderNo); // 设置商户本次资金操作的请求流水号 bizContent.Add("out_request_no", input.OutRequestNo); // 设置需要冻结的金额 bizContent.Add("amount", input.Amount); // 设置预授权订单相对超时时间 bizContent.Add("timeout_express", input.TimeoutExpress); // 设置销售产品码 bizContent.Add("product_code", input.ProductCode); List AliPostPaymentslist = new List(); var unit = uavFee.PackageType switch { "minute" => "分钟", "hour" => "小时", _ => "单位" // fallback }; AliPostPaymentslist.Add(new AliPostPayments { name = uavFee.RuleName, description = $"{uavFee.OvertimePrice}元/{unit},{uavFee.TotalCap}元封顶" }); // 设置无特殊需要请勿传入 // bizContent.Add("enable_pay_channels", "[{\"payChannelType\":\"MONEY_FUND\"}]"); bizContent.Add("post_payments", AliPostPaymentslist.ToJson()); // 设置业务扩展参数 // bizContent.Add("extra_param", input.aliExtraParam.ToJson()); bizContent.Add("extra_param", "{\"category\":\"CREDIT_RENT_OFFLINE\",\"serviceId\":\"2025061600000000000104406000\"}"); // 设置免押受理台模式 bizContent.Add("deposit_product_mode", input.DepositProductMode); bizParams.Add("notify_url", App.Configuration["PaymentSettings:AlipayConfig:ALIPay_NotifyURL_V2"]); bizParams.Add("biz_content", bizContent); Log.Information("线上资金授权冻结接口传入信息:" + bizParams.ToJson()); try { // 如果是第三方代调用模式,请设置app_auth_token(应用授权令牌) string orderStr = api.SdkExecute("alipay.fund.auth.order.app.freeze", bizParams, null, null); return orderStr; } catch (ApiException e) { Console.WriteLine("调用失败"); return e.ToString(); } } #endregion #region 线上资金扣款操作 /// /// 线上资金扣款操作 /// /// /// [HttpPost("TradePay")] public async Task TradePay(AliPayTradePayEntity input) { Log.Information($"[扣款操作]线上资金扣款操作:{input.ToJson()}"); //查询订单信息 var orderinfo = _db.Queryable().Where(x => x.OrderNo == input.OutTradeNo).First(); Log.Information($"[扣款操作]{input.OutTradeNo}订单信息", orderinfo.ToJson()); if (orderinfo == null) { return new { code = 500, message = "订单不存在" }; } // 初始化SDK AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); // 构造请求参数以调用接口 AlipayTradeApi instance = new AlipayTradeApi(); instance.Client.SetAlipayConfigUtil(alipayConfigUtil); AlipayTradePayModel data = new AlipayTradePayModel(); data.NotifyUrl = App.Configuration["PaymentSettings:AlipayConfig:ALIPay_NotifyURL"]; // 设置商户订单号 data.OutTradeNo = input.OutTradeNo; // 设置订单总金额 data.TotalAmount = input.TotalAmount.ToString(); // 设置订单标题 data.Subject = input.Subject; // 设置产品码 data.ProductCode = "PREAUTH_PAY"; // 设置资金预授权单号 data.AuthNo = orderinfo.AliAuthNo; // 设置预授权确认模式 // data.AuthConfirmMode = input.AuthConfirmMode; data.AuthConfirmMode = "COMPLETE"; // 设置买家支付宝用户唯一标识 // data.BuyerOpenId = input.BuyerOpenId; // 设置订单附加信息 // data.Body = "Iphone6 16G"; // 设置支付模式类型 // data.AdvancePaymentType = "ENJOY_PAY_V2"; // 设置是否异步支付 data.IsAsyncPay = false; // 设置不可打折金额 data.UndiscountableAmount = input.TotalAmount.ToString(); // 设置返回参数选项 List queryOptions = new List(); queryOptions.Add("voucher_detail_list"); data.QueryOptions = queryOptions; try { var response = instance.Pay(data, 0, null); return response; } catch (ApiException e) { AlipayTradePayDefaultResponse errorObject = (AlipayTradePayDefaultResponse)e.ErrorObject; Console.WriteLine("调用失败:" + errorObject); Log.Information($"线上资金扣款操作--调用失败:{errorObject}"); return errorObject; } } #endregion #region 取消免押订单 /// /// 取消免押订单 /// /// /// [HttpPost("liPayOperationCance")] public async Task liPayOperationCance(AliPayOperationCancelEntity input) { // 初始化SDK AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); // 构造请求参数以调用接口 AlipayFundAuthOperationApi instance = new AlipayFundAuthOperationApi(); instance.Client.SetAlipayConfigUtil(alipayConfigUtil); AlipayFundAuthOperationCancelModel data = new AlipayFundAuthOperationCancelModel(); // 设置商户的授权资金订单号 data.OutOrderNo = input.OutOrderNo; // 设置商户的授权资金操作流水号 data.OutRequestNo = input.OutRequestNo; // 设置商户对本次撤销操作的附言描述 data.Remark = input.Remark; data.NotifyUrl = App.Configuration["PaymentSettings:AlipayConfig:ALIPay_NotifyURL_Cancel"]; try { var response = instance.Cancel(data, 0, null); return response; } catch (ApiException e) { AlipayFundAuthOperationCancelDefaultResponse errorObject = (AlipayFundAuthOperationCancelDefaultResponse)e.ErrorObject; Console.WriteLine("调用失败:" + errorObject); return errorObject; } } #endregion #region 支付宝小程序登录 /// /// 支付宝小程序登录 /// /// /// [HttpPost("AlipayLogin")] [AllowAnonymous] public async Task AlipayLogin([FromBody] AliLoginInput req) { // 第一步:通过 authCode 换取 user_id var client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", GetAlipayConfig().AppId, GetAlipayConfig().PrivateKey, "json", "1.0", "RSA2", GetAlipayConfig().AlipayPublicKey, "utf-8", false); var tokenReq = new AlipaySystemOauthTokenRequest { GrantType = "authorization_code", Code = req.authCode }; var tokenResp = await client.ExecuteAsync(tokenReq); var userId = tokenResp.UserId; // 第二步:解密手机号 var phone = DecryptPhoneNumber(req.response, GetAlipayConfig().PrivateKey); // 这里开始是用户登录的逻辑 var info = await _db.Queryable().Where(o => o.Account == phone && o.ExtensionStr == "支付宝用户" && o.EnabledMark != 0 && o.DeleteMark == null).FirstAsync(); if (info.IsNullOrEmpty()) { //如果用户信息是空,就注册创建用户 info = new UserEntity { Id = YitIdHelper.NextId().ToString(), Account = phone, MobilePhone = phone, HeadIcon = req.headicon, RealName = req.realName ?? phone, NickName = req.realName, EnabledMark = 1, OpenId = userId, Password = MD5Encryption.Encrypt(userId), ExtensionStr = "支付宝用户" }; await _db.Insertable(info).ExecuteCommandAsync(); } string tenantDbName = App.Configuration["ConnectionStrings:DBName"]; var accessToken = string.Empty; string tenantId = App.Configuration["ConnectionStrings:ConfigId"]; var tokenTimeout = _db.Queryable().Where(s => s.Category == "SysConfig" && s.Key == "tokentimeout").First(); // 生成Token令牌 if (KeyVariable.MultiTenancy) { accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.CLAINM_USERID, info.Id }, { ClaimConst.CLAINM_ACCOUNT, info.Account }, { ClaimConst.TENANT_ID, tenantId }, { ClaimConst.TENANT_DB_NAME, tenantDbName } }, long.Parse(tokenTimeout.Value)); } else { accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.CLAINM_USERID, info.Id }, { ClaimConst.CLAINM_ACCOUNT, info.Account }, { ClaimConst.TENANT_ID, tenantId }, { ClaimConst.TENANT_DB_NAME, tenantDbName } }, long.Parse(tokenTimeout.Value)); } var httpContext = _httpContextAccessor.HttpContext; // 设置Swagger自动登录 httpContext.SigninToSwagger(accessToken); // 生成刷新Token令牌 var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, 30); // 设置刷新Token令牌 httpContext.Response.Headers["x-access-token"] = refreshToken; var ip = httpContext.GetRemoteIpAddressToIPv4(); return new { //theme = input.Theme == null ? "classic" : input.Theme, token = "Bearer " + accessToken, user = info }; } [NonAction] public static string DecryptPhoneNumber(string response, string privateKey) { try { var plainData = AlipayEncrypt.AesDencrypt("o49tr1UchK+7s/bBvgxSQA==", response, "UTF-8"); var json = JObject.Parse(plainData); return json["mobile"]?.ToString(); } catch (Exception ex) { // 可记录日志 ex.Message throw new Exception("手机号解密失败,请检查私钥或支付宝返回内容", ex); } } #endregion #region 线上资金退款操作 /// /// 线上资金退款操作 /// /// /// [HttpPost("RefundPay")] public async Task RefundPay(AliPayOperationCancelEntity input) { var orderinfo = _db.Queryable().Where(x => x.OrderNo == input.OutOrderNo).First(); Log.Information($"[退款操作]{input.OutOrderNo}订单信息{orderinfo.ToJson()}"); if (orderinfo == null) { return new { code = 500, message = "订单不存在" }; } // 初始化SDK AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); // 构造请求参数以调用接口 AlipayTradeApi instance = new AlipayTradeApi(); instance.Client.SetAlipayConfigUtil(alipayConfigUtil); AlipayTradeRefundModel data = new AlipayTradeRefundModel(); // 设置商户订单号 data.OutTradeNo = input.OutOrderNo; // 设置支付宝交易号 //data.TradeNo = orderinfo.AliAuthNo; // 设置退款金额 data.RefundAmount = orderinfo.ActualAmount.ToString(); // 设置退款原因说明 data.RefundReason = "正常退款"; // 设置退款请求号 // data.OutRequestNo = "HZ01RF001"; // 设置查询选项 List queryOptions = new List(); queryOptions.Add("refund_detail_item_list"); data.QueryOptions = queryOptions; // 设置针对账期交易 // data.RelatedSettleConfirmNo = "2024041122001495000530302869"; try { var response = instance.Refund(data, 0, null); Log.Information($"[支付宝退款响应]Response: {response.ToJson()}"); if (response.FundChange == "Y") { // 退款成功 orderinfo.Status = UavOrderStatusEnum.已退款.GetHashCode(); orderinfo.UpdateTime = DateTime.Now; await _db.Updateable(orderinfo).ExecuteCommandAsync(); //通过订单id去找到流水信息 var orderflow = await _db.Queryable().Where(x => x.RelatedId == orderinfo.OrderNo).ToListAsync(); foreach (var item in orderflow) { UavWalletFlowEntity flowEntity = new UavWalletFlowEntity { Id = YitIdHelper.NextId().ToString(), UserId = item.UserId, FlowDirection = item.FlowDirection, Amount = -item.Amount, RelatedId = item.RelatedId, RelatedType = item.RelatedType, Description = "订单退款", CreateTime = DateTime.Now, CreateUser = _userManager.UserId }; await _db.Insertable(flowEntity).ExecuteCommandAsync(); } //去找到退款记录修改状态 var refundEntity = await _db.Queryable().Where(x => x.OrderNo == orderinfo.OrderNo).FirstAsync(); if (refundEntity != null) { refundEntity.RefundStatus = RefundStatusEnum.已退款.GetHashCode(); refundEntity.HandleTime = DateTime.Now; refundEntity.HandleUser = _userManager.UserId; refundEntity.HandleResult = input.HandleResult; await _db.Updateable(refundEntity).ExecuteCommandAsync(); } Log.Information($"[退款操作]订单{input.OutOrderNo}退款成功,更新订单状态为已退款"); // 返回成功信息 return "退款成功"; } else { return "退款失败"; } } catch (ApiException e) { AlipayTradeRefundDefaultResponse errorObject = (AlipayTradeRefundDefaultResponse)e.ErrorObject; Console.WriteLine("调用失败1:" + e); return "fill"; } } #endregion #region 完结免押订单 /// /// 完结免押订单 /// /// /// [HttpPost("TradeFinish")] public async Task TradeFinish(AliPayOperationCancelEntity input) { var orderinfo = _db.Queryable().Where(x => x.OrderNo == input.OutOrderNo).First(); //从订单中获取计费规则的快照 UavFeeRuleEntity uavFee = orderinfo.FeeRuleSnapshot.ToObject().Adapt();//获取快照中的费用规则 Log.Information($"[退款操作]{input.OutOrderNo}订单信息{orderinfo.ToJson()}"); if (orderinfo == null) { return new { code = 500, message = "订单不存在" }; } // 初始化SDK AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); // 构造请求参数以调用接口 AlipayFundAuthOrderApi instance = new AlipayFundAuthOrderApi(); instance.Client.SetAlipayConfigUtil(alipayConfigUtil); AlipayFundAuthOrderUnfreezeModel data = new AlipayFundAuthOrderUnfreezeModel(); // 设置支付宝资金授权订单号 data.AuthNo = orderinfo.AliAuthNo; // 设置解冻请求流水号 data.OutRequestNo = "End_" + orderinfo.OrderNo; // 设置本次操作解冻的金额 data.Amount = uavFee.TotalCap.ToString(); // 设置商户对本次解冻操作的附言描述 data.Remark = "订单已完成"; // 设置解冻扩展信息 // data.ExtraParam = "{\"unfreezeBizInfo\": \"{\"bizComplete\":\"true\"}\"}"; // 第三方代调用模式下请设置app_auth_token // CustomizedParams customizedParams = new CustomizedParams(); // customizedParams.AppAuthToken = "<-- 请填写应用授权令牌 -->"; try { var response = instance.Unfreeze(data, 0, null); Log.Information($"[完结订单]:{response.ToJson()}"); return "success"; } catch (ApiException e) { AlipayFundAuthOrderUnfreezeDefaultResponse errorObject = (AlipayFundAuthOrderUnfreezeDefaultResponse)e.ErrorObject; Console.WriteLine("调用失败:" + errorObject); return errorObject; } } #endregion #region 统一收到交易支付接口 /// /// 统一收到交易支付接口 /// /// /// [HttpPost("Pay")] public async Task Pay(AliPayOperationCancelEntity input) { var orderinfo = _db.Queryable().Where(x => x.OrderNo == input.OutOrderNo).First(); Log.Information($"[统一收单交易接口]{input.OutOrderNo}订单信息{orderinfo.ToJson()}"); if (orderinfo == null) { return new { code = 500, message = "订单不存在" }; } // 初始化SDK AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); GenericExecuteApi api = new GenericExecuteApi(); api.Client.SetAlipayConfigUtil(alipayConfigUtil); // 构造请求参数以调用接口 Dictionary bizParams = new Dictionary(); Dictionary bizContent = new Dictionary(); bizContent.Add("out_trade_no", orderinfo.OrderNo); bizContent.Add("total_amount", orderinfo.ActualAmount.ToString("1.00")); // 设置订单标题 bizContent.Add("subject", "无人机租金"); // 设置产品码 bizContent.Add("product_code", "PREAUTH_PAY"); // 设置预授权单号 bizContent.Add("auth_no", orderinfo.AliAuthNo); // 设置预授权确认模式 bizContent.Add("auth_confirm_mode", "COMPLETE"); bizContent.Add("enable_pay_channels", "balance"); bizParams.Add("notify_url", App.Configuration["PaymentSettings:AlipayConfig:ALIPay_NotifyURL"]); bizParams.Add("biz_content", bizContent); Log.Information("统一收单交易接口传入信息:" + bizParams.ToJson()); try { // 如果是第三方代调用模式,请设置app_auth_token(应用授权令牌) string orderStr = api.SdkExecute("alipay.trade.pay", bizParams, null, null); return orderStr; } catch (ApiException e) { Console.WriteLine("调用失败"); return e.ToString(); } // // 初始化SDK // AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); // // 构造请求参数以调用接口 // AlipayTradeApi instance = new AlipayTradeApi(); // instance.Client.SetAlipayConfigUtil(alipayConfigUtil); // AlipayTradePayModel data = new AlipayTradePayModel(); // // 设置商户订单号 // data.OutTradeNo = orderinfo.OrderNo; // // 设置订单总金额 // data.TotalAmount = "10"; // // 设置订单标题 // data.Subject = "无人机租金"; // // 设置产品码 // data.ProductCode = "PREAUTH_PAY"; // // 设置资金预授权单号 // data.AuthNo = orderinfo.AliAuthNo; // // 设置预授权确认模式 // data.AuthConfirmMode = "COMPLETE"; // try // { // var response = instance.Pay(data, 0, null); // return response; // } // catch (ApiException e) // { // AlipayTradePayDefaultResponse errorObject = (AlipayTradePayDefaultResponse)e.ErrorObject; // Console.WriteLine("调用失败:" + errorObject); // return "fill"; // } } #endregion #region 统一收单交易关闭接口 /// /// 统一收单交易关闭接口 /// /// /// [HttpPost("ClosePay")] public async Task ClosePay(AliPayOperationCancelEntity input) { var orderinfo = _db.Queryable().Where(x => x.OrderNo == input.OutOrderNo).First(); Log.Information($"[统一收单交易关闭接口]{input.OutOrderNo}订单信息{orderinfo.ToJson()}"); if (orderinfo == null) { return new { code = 500, message = "订单不存在" }; } AlipayConfigUtil alipayConfigUtil = new AlipayConfigUtil(GetAlipayConfig()); // 构造请求参数以调用接口 AlipayTradeApi instance = new AlipayTradeApi(); instance.Client.SetAlipayConfigUtil(alipayConfigUtil); AlipayTradeCloseModel data = new AlipayTradeCloseModel(); // 设置该交易在支付宝系统中的交易流水号 // data.TradeNo = "2013112611001004680073956707"; // 设置订单支付时传入的商户订单号 data.OutTradeNo = orderinfo.OrderNo; // 设置商家操作员编号 id // data.OperatorId = "YX01"; Log.Information($"[统一收单交易关闭接口]传入参数:{data.ToJson()}"); try { var response = instance.Close(data, 0, null); return response; } catch (ApiException e) { AlipayTradeCloseDefaultResponse errorObject = (AlipayTradeCloseDefaultResponse)e.ErrorObject; Log.Information($"[统一收单交易关闭接口]失败{errorObject}"); return "fill"; } } #endregion } }