/// <summary> /// 支付 /// </summary> /// <param name="input"></param> /// <returns></returns> public override async Task <object> ToPay(PayInputBase input) { var weChatPayApi = IocResolver.Resolve <WeChatPayApi>(); if (weChatPayApi == null) { throw new UserFriendlyException("支付未开放,请联系管理员!"); } var appPayInput = new MiniProgramPayInput() { Body = input.Body, OutTradeNo = input.OutTradeNo, Attach = input.Key, TotalFee = input.TotalAmount, SpbillCreateIp = _clientInfoProvider?.ClientIpAddress, OpenId = input.OpenId, }; try { var appPayOutput = weChatPayApi.MiniProgramPay(appPayInput); return(await Task.FromResult(appPayOutput)); } catch (Exception ex) { throw new UserFriendlyException(ex.Message); } }
/// <summary> /// 小程序支付 /// 小程序统一下单接口 /// https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1 /// </summary> /// <returns></returns> public MiniProgramPayOutput MiniProgramPay(MiniProgramPayInput input) { if (input == null) { throw new ArgumentNullException(nameof(input)); } if (input.TotalFee <= 0) { throw new ArgumentException("金额不能小于0!", nameof(input.TotalFee)); } if (string.IsNullOrWhiteSpace(input.OpenId)) { throw new ArgumentNullException("OpenId必须填写!", nameof(input.OpenId)); } if (string.IsNullOrWhiteSpace(input.Body)) { throw new ArgumentNullException("商品描述必须填写!", nameof(input.Body)); } if (string.IsNullOrWhiteSpace(input.SpbillCreateIp)) { throw new ArgumentNullException("终端IP必须填写!", nameof(input.SpbillCreateIp)); } var url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; var config = GetConfig(); var model = new UnifiedorderRequest { AppId = config.PayAppId, MchId = config.MchId, Attach = input.Attach, Body = input.Body, Detail = input.Detail, DeviceInfo = input.DeviceInfo, FeeType = input.FeeType, GoodsTag = input.GoodsTag, LimitPay = input.LimitPay, OpenId = input.OpenId, OutTradeNo = input.OutTradeNo ?? weChatPayHelper.GenerateOutTradeNo(), SpbillCreateIp = input.SpbillCreateIp, TimeExpire = input.TimeExpire, TimeStart = input.TimeStart, TotalFee = ((int)(input.TotalFee * 100)).ToString(), NonceStr = weChatPayHelper.GetNoncestr(), NotifyUrl = config.PayNotifyUrl }; var dictionary = weChatPayHelper.GetDictionaryByType(model); model.Sign = weChatPayHelper.CreateMd5Sign(dictionary, config.TenPayKey); //生成Sign var result = weChatPayHelper.PostXML <UnifiedorderResult>(url, model); if (result.IsSuccess()) { var data = new { appId = result.AppId, nonceStr = result.NonceStr, package = "prepay_id=" + result.PrepayId, signType = "MD5", timeStamp = weChatPayHelper.GetTimestamp() }; return(new MiniProgramPayOutput { AppId = data.appId, Package = data.package, NonceStr = data.nonceStr, PaySign = weChatPayHelper.CreateMd5Sign(weChatPayHelper.GetDictionaryByType(data), config.TenPayKey), SignType = data.signType, TimeStamp = data.timeStamp }); } WeChatPayHelper.LoggerAction("Error", "支付错误:" + result.GetFriendlyMessage()); throw new WeChatPayException("支付错误,请联系客服或重新支付!"); }