/// <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);
            }
        }
Exemplo n.º 2
0
        /// <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("支付错误,请联系客服或重新支付!");
        }