예제 #1
0
        public virtual async Task <object> PayNotifyUrl(string appName, [FromBody] TenPayNotifyXml input)
        {
            Log.Warning(JsonConvert.SerializeObject(input));
            var return_msg  = input.return_msg;
            var return_code = input.return_code;

            var app = await _appProvider.GetOrNullAsync(appName);

            var appsec = app["appsec"] ?? throw new AbpException($"App:{appName} appsec未设置");

            var verifySign = _signatureGenerator.Generate(GetPayParameters(input), MD5.Create(), appsec);

            Log.Warning($"verifySign:{verifySign},InputSign:{input.sign}");

            var tenPayNotify = new TenPayNotify
            {
                appid        = input.appid,
                bank_type    = input.bank_type,
                cash_fee     = input.cash_fee,
                fee_type     = input.fee_type,
                is_subscribe = input.is_subscribe,
                mch_id       = input.mch_id,
                nonce_str    = input.nonce_str,
                openid       = input.openid,
                out_trade_no = input.out_trade_no,
                result_code  = input.result_code,
                return_code  = input.return_code,

                sign           = input.sign,
                time_end       = input.time_end,
                total_fee      = input.total_fee,
                trade_type     = input.trade_type,
                transaction_id = input.transaction_id
            };


            var notify = await _tenpayRepository.FirstOrDefaultAsync(z => z.out_trade_no == tenPayNotify.out_trade_no);

            if (notify == null)
            {
                notify = tenPayNotify;
                var insertEntity = await _tenpayRepository.InsertAsync(notify, autoSave : true);

                await _capBus.PublishAsync("mall.tenpay.notify", insertEntity);
            }

            var xml = $@"<xml>
<return_code><![CDATA[{return_code}]]></return_code>
<return_msg><![CDATA[{return_msg}]]></return_msg>
</xml>";

            return(xml);
        }
예제 #2
0
        public virtual async Task <object> PayNotifyUrl([FromBody] TenPayNotifyXml input)
        {
            Log.Warning(JsonConvert.SerializeObject(input));
            var return_msg  = input.return_msg;
            var return_code = input.return_code;

            var tenPayNotify = new TenPayNotify
            {
                appid        = input.appid,
                bank_type    = input.bank_type,
                cash_fee     = input.cash_fee,
                fee_type     = input.fee_type,
                is_subscribe = input.is_subscribe,
                mch_id       = input.mch_id,
                nonce_str    = input.nonce_str,
                openid       = input.openid,
                out_trade_no = input.out_trade_no,
                result_code  = input.result_code,
                return_code  = input.return_code,

                sign           = input.sign,
                time_end       = input.time_end,
                total_fee      = input.total_fee,
                trade_type     = input.trade_type,
                transaction_id = input.transaction_id
            };

            var notify = await _tenpayRepository.FirstOrDefaultAsync(z => z.out_trade_no == tenPayNotify.out_trade_no);

            if (notify == null)
            {
                notify = tenPayNotify;
                var insertEntity = await _tenpayRepository.InsertAsync(notify, autoSave : true);

                await _capBus.PublishAsync("mall.tenpay.notify", insertEntity);
            }

            var xml = $@"<xml>
<return_code><![CDATA[{return_code}]]></return_code>
<return_msg><![CDATA[{return_msg}]]></return_msg>
</xml>";

            return(xml);
        }
        public async Task TenPayNotifySubscriber(TenPayNotify tenPayNotify)
        {
            using (var uow = _unitOfWorkManager.Begin(requiresNew: true))
            {
                var payOrder = await _payOrderRepository.FindAsync(tenPayNotify.out_trade_no);

                if (payOrder != null)
                {
                    if (payOrder.TotalPrice.ToString() == tenPayNotify.total_fee && tenPayNotify.result_code == "SUCCESS")
                    {
                        payOrder.SuccessPay(tenPayNotify.Id);

                        if (payOrder.Type == MallEnums.OrderType.Product)
                        {
                            var productOrders = await _productOrderRepository.Where(x => x.BillNo == payOrder.BillNo).ToListAsync();

                            foreach (var o in productOrders)
                            {
                                // TODO:实收少于应收多少范围内要发消息
                                o.SuccessPay(MallEnums.PayType.微信, payOrder.TotalPrice / 100m);
                            }
                        }

                        await uow.SaveChangesAsync();
                    }
                    else
                    {
                        throw new Exception($"Tenpay Result Fee not equals !!pay is {tenPayNotify.fee_type} , db is {payOrder.TotalPrice} , BillNo is {payOrder.BillNo}");
                    }
                }
                else
                {
                    //TODO:这里要更多的消息通知管理员
                    throw new Exception($"cant't find BillNo {tenPayNotify.out_trade_no}");
                }

                await Task.CompletedTask;
            }
        }