using Aop.Api; using Aop.Api.Request; using Aop.Api.Response; using DevComponents.DotNetBar.SuperGrid; using NLog; using POSV.Entity; using POSV.Member; using POSV.MessageEvent; using POSV.PayApi; using POS.Language.Language; using POSV.Proxy.ThirdPartyPayMent; using POSV.ShoppingCart; using POSV.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using POSV.Component; using POSV.Payment.Abmcs; using POSV.Payment.Saobei.Parameter; using POSV.Payment.Saobei; using POSV.Payment.Saobei.Result; using POSV.Payment.AllinPay; using POSV.Payment.AllinPay.Models.ParamModels; using POSV.Payment.AllinPay.Models.ResponseModels; namespace POSV.Bill { /// /// 通联支付核销 subin 2023-07-07 添加 /// public partial class AllinPayCheckForm : BusinessForm { private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); public decimal PayMoney = 0.00M; public bool IsAllinPay = false; /// /// 订单对象 /// private OrderObject _orderObject = null; /// /// 支付渠道 /// private PayChannelEnum _payChannel = PayChannelEnum.原生支付; public AllinPayCheckForm(OrderObject orderObject, decimal amount, bool allinPay) { InitializeComponent(); this.controlBox.Text = LangProxy.ToLang("扫码支付核销"); this.controlBox.ShowApplicationVersion = false; this._orderObject = orderObject; this.PayMoney = amount; this.IsAllinPay = allinPay; } private PayMode CurrentPayMode = null; protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; DefaultGridStyle.setDefaultGridStyle(this.payListTable); this.Focus(); this.txtReChargeNo.Focus(); this.txtReChargeNo.SelectAll(); this.ActiveControl = this.txtReChargeNo; QueryTicket(); } private void OnCloseTouchClick(object sender, EventArgs e) { //先关闭父窗体 if (this.Owner != null) { this.Owner.Close(); } //再关闭当前窗体 this.Close(); } /// /// 查询 /// /// /// private void BtnQuery(object sender, EventArgs e) { QueryTicket(); } /// /// 核销按钮 /// /// /// private void BtnCheck(object sender, EventArgs e) { var row = this.payListTable.ActiveRow as GridRow; if (row == null) { this.ShowToastNotify(this, "请选择要核销的数据"); return; } var money = StringUtils.GetDecimal(row.Cells["money"].Value.ToString()); if (this.PayMoney != money) { this.ShowToastNotify(this, "要核销的金额和点单金额不一致"); return; } var authCode = row.Cells["authCode"].Value == null ? "" : row.Cells["authCode"].Value.ToString(); var orderNo = row.Cells["orderNo"].Value == null ? "" : row.Cells["orderNo"].Value.ToString(); var serialNo = row.Cells["serialNo"].Value == null ? "" : row.Cells["serialNo"].Value.ToString(); var payTime = row.Cells["payTime"].Value == null ? "" : row.Cells["payTime"].Value.ToString(); if (IsAllinPay) { this.CurrentPayMode = RechargeSaomaUtils.GetPayModeOrder("50"+"00000000000000").Item3; if (this.CurrentPayMode.Body.Count() == 0) { var payModelBody = new Dictionary(); payModelBody.Add("channel", "allinpay"); payModelBody.Add("appId", AllinpayLib.AppId); payModelBody.Add("appKey", AllinpayLib.AppKey); payModelBody.Add("gatewayUrl", AllinpayLib.Url); var store = Global.Instance.Worker.StoreInfo; if (store == null) { using (var db = Global.Instance.OpenDataBase) { store = db.FirstOrDefault("where id = @0", Global.Instance.Authc.StoreId); } } if (!string.IsNullOrEmpty(store.Ext1)) { var storeAllinParams = JsonUtils.Deserialize(store.Ext1); AllinpayLib.Payuserid = storeAllinParams.PayuserId; AllinpayLib.VspCusid = storeAllinParams.VspCusid; AllinpayLib.BizUserId = storeAllinParams.BizUserId; } payModelBody.Add("payuserid", AllinpayLib.Payuserid); payModelBody.Add("vspCusid", AllinpayLib.VspCusid); payModelBody.Add("bizUserId", AllinpayLib.BizUserId); this.CurrentPayMode.Body = payModelBody; } } else { this.CurrentPayMode = RechargeSaomaUtils.GetPayModeOrder(authCode).Item3; } if (this.CurrentPayMode == null) { this.ShowToastNotify(this, "支付码不合法或尚未适配..."); return; } bool paymentVerify = RechargeSaomaUtils.VerifyInputValue(authCode, this.CurrentPayMode).Item1; if (!paymentVerify) { this.ShowToastNotify(this, "支付渠道获取失败,请检查后台配置"); return; } this._payChannel = RechargeSaomaUtils.VerifyInputValue(authCode, this.CurrentPayMode).Item3; switch (this._payChannel) { case PayChannelEnum.原生支付: { switch (this.CurrentPayMode.No) { case "04": { QueryAliPayResult(orderNo); } break; case "05": { QueryWxPayResult(orderNo); } break; } } break; case PayChannelEnum.扫呗支付: { QuerySAOBEIPayResult(orderNo, serialNo, payTime); } break; case PayChannelEnum.乐刷支付: { QueryLESHUAPayResult(orderNo, PayChannelEnum.乐刷支付, authCode, serialNo); } break; #region subin 2023-07-07 add case PayChannelEnum.通联支付: { QueryAllinPayResult(orderNo); } break; #endregion } } #region 扫呗支付渠道 private void QuerySAOBEIPayResult(string orderNo, string serialNo, string payTime) { try { var parameter = this.CurrentPayMode.Body; string merchant_no = parameter.ContainsKey("merchant_no") ? parameter["merchant_no"].ToString() : ""; string terminal_id = parameter.ContainsKey("terminal_id") ? parameter["terminal_id"].ToString() : ""; string signKey = parameter.ContainsKey("signKey") ? parameter["signKey"].ToString() : ""; string gatewayUrl = parameter.ContainsKey("gatewayUrl") ? parameter["gatewayUrl"].ToString() : ""; SaobeiQueryParam request = new SaobeiQueryParam(); //支付方式 支付宝1、微信2 request.Pay_type = "020"; if (this.CurrentPayMode.No == "05") { request.Pay_type = "010"; } else if (this.CurrentPayMode.No == "07") { request.Pay_type = "110"; } request.Terminal_trace = orderNo.Replace("_", ""); request.Pay_trace = orderNo.Replace("_", ""); request.Pay_time = payTime; request.Out_trade_no = serialNo; var saobeiPayment = SaobeiUtils.SaobeiQuery(merchant_no, terminal_id, signKey, gatewayUrl, request); if (saobeiPayment.Item1) { if (saobeiPayment.Item3 != null && "SUCCESS".Equals(saobeiPayment.Item3.Trade_state)) { //发送消息通知显示文本 this.ShowToastNotify(this, "扫呗支付付款成功"); //先查询状态再发起充值 if (DoQuery(orderNo)) { //构建支付宝支付方式 this.AddSAOBEIPayType(saobeiPayment.Item3, orderNo); //发送自动完成结账事件 MsgEvent.Send(Constant.PAY_AUTO_EVENT_NOTIFY, "扫呗支付付款成功"); //再关闭当前窗体 this.Close(); } } else { if (saobeiPayment.Item3 != null) { if (!string.IsNullOrEmpty(saobeiPayment.Item3.Return_msg)) { this.ShowToastNotify(this, "查询结果:" + saobeiPayment.Item3.Return_msg); return; } } this.ShowToastNotify(this, "查询结果:" + "支付中..."); } } else { this.ShowToastNotify(this, saobeiPayment.Item2); } } catch (Exception ex) { LOGGER.Error(ex, "扫呗支付结果查询发生异常"); } } private void AddSAOBEIPayType(SaobeiQueryResult queryParam, string orderNo) { if (queryParam != null && "SUCCESS".Equals(queryParam.Trade_state)) { string[] orderNoArray = orderNo.Split('_'); this._orderObject.TradeNo = orderNoArray[1]; //刷新订单内容 RefOrderNo(); //构建支付方式 PayItem item = OrderUtils.ToPayItem(this.CurrentPayMode); //租户ID item.TenantId = Global.Instance.Authc.TenantId; //订单号 item.OrderId = this._orderObject.Id; //订单编号 item.TradeNo = this._orderObject.TradeNo; //商户订单号 string outTradeNo = string.Format("{0}_{1}", this._orderObject.StoreNo, this._orderObject.TradeNo); item.OutTradeNo = outTradeNo.Replace("_", ""); //实收金额 item.PaidAmount = Convert.ToDecimal(StringUtils.GetDecimal(queryParam.Total_fee) / 100); //找零金额 item.ChangeAmount = Convert.ToDecimal(0.00); //已收金额,真正意义上实际收款金额 item.Amount = item.PaidAmount; item.CardNo = ""; item.TradeVoucherNo = queryParam.Out_trade_no;//扫呗支付订单号 item.Memo = this._payChannel.ToString(); item.Subscribe = string.Empty; item.PayChannel = this._payChannel; //支付状态 item.Status = (int)OrderPaymentStatus.已付款; item.StatusDesc = string.Format("{0}", queryParam.Trade_state); //将支付宝支付压入支付清单 this._orderObject.Pays.Add(item); } } #endregion private void QueryLESHUAPayResult(string orderNo, PayChannelEnum payChannel, string authCode, string serialNo) { string[] _TranNo = orderNo.Split('_'); //var _order = OrderUtils.getOrderObjectByTranNo(_TranNo[1]); //if (_order == null) //{ // //发送消息通知显示文本 // this.ShowToastNotify(this, "查询不到订单对象"); // return; //} Dictionary keys = new Dictionary(); var _data = PayMentOperation.QueryPay(authCode, _TranNo[1], serialNo, payChannel, keys); if (!_data.Item1) { //发送消息通知显示文本 this.ShowToastNotify(this, _data.Item2); return; } //发送消息通知显示文本 this.ShowToastNotify(this, "乐刷支付付款成功"); //先查询状态再发起充值 if (DoQuery(orderNo)) { if (this._orderObject.Pays == null) { this._orderObject.Pays = new List(); } this._orderObject.Pays.Add(_data.Item3); //发送自动完成结账事件 MsgEvent.Send(Constant.PAY_AUTO_EVENT_NOTIFY, "支付付款成功"); //再关闭当前窗体 this.Close(); } } /// /// 关闭窗口 /// /// /// private void BtnClose(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void QueryTicket() { string orderNo = this.txtReChargeNo.Text; List listPay = getSaomaPayTicket(orderNo); foreach (SaomaPayTicket saomaPayTicket in listPay) { if (saomaPayTicket.PayStatus == 0) { saomaPayTicket.OrderStatus = "未核销"; } else if (saomaPayTicket.PayStatus == 1) { saomaPayTicket.OrderStatus = "核销成功"; } } payListTable.PrimaryGrid.DataSource = listPay; } public List getSaomaPayTicket(string orderNo) { List list = null; try { using (var db = Global.Instance.OpenDataBase) { StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append(" select * "); sqlBuld.Append(" from pos_saoma_pay_ticket "); sqlBuld.Append(" where busType =0 "); if (orderNo != null && !"".Equals(orderNo)) { sqlBuld.Append(" and orderNo like '%" + orderNo + "%' "); } sqlBuld.Append(" and storeId ='{0}' and shiftNo = '{1}' "); sqlBuld.Append(" order by createDate desc "); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.StoreId, Global.Instance.BusinessPlanLog.No); list = db.Query(sql).ToList(); } } catch (Exception ex) { LOGGER.Error(ex); } if (list == null) { list = new List(); } return list; } #region 原生微信支付渠道查询 /// /// 微信支付结果查询 /// private void QueryWxPayResult(string orderNo) { try { var parameter = this.CurrentPayMode.Body; string appId = parameter.ContainsKey("appid") ? parameter["appid"].ToString() : ""; string mchId = parameter.ContainsKey("mchid") ? parameter["mchid"].ToString() : ""; string subMchId = parameter.ContainsKey("submchid") ? parameter["submchid"].ToString() : ""; string key = parameter.ContainsKey("appsecret") ? parameter["appsecret"].ToString() : ""; string nonceStr = "x86" + ObjectId.GenerateNewStringId(); var dataInfo = new WxPayV3OrderQueryRequestData(appId, "", mchId, subMchId, "", nonceStr, orderNo, key); var result = WxPayV3.OrderQuery(dataInfo); if ("SUCCESS".Equals(result.return_code)) { if ("SUCCESS".Equals(result.result_code)) { var tradeState = WxPayTradeState.NONE; Enum.TryParse(result.trade_state, out tradeState); switch (tradeState) { case WxPayTradeState.SUCCESS: { this.ShowToastNotify(this, "微信支付成功,正在进行充值"); //先查询状态再发起充值 if (DoQuery(orderNo)) { //构建微信支付方式 this.AddWxPayType(result, orderNo); //发送自动完成结账事件 MsgEvent.Send(Constant.PAY_AUTO_EVENT_NOTIFY, "微信支付成功"); //再关闭当前窗体 this.Close(); } } break; case WxPayTradeState.USERPAYING: { this.ShowToastNotify(this, "未查询到订单是否支付成功,请再次确认"); } break; case WxPayTradeState.NOTPAY: case WxPayTradeState.PAYERROR: { this.ShowToastNotify(this, "密码错误或未输入,微信支付失败"); } break; default: break; } } else { this.ShowToastNotify(this, "未查询到订单是否支付成功,请再次确认"); } } else { LOGGER.Warn("查询支付结果网络通信错误:{0}", result.return_msg); this.ShowToastNotify(this, result.return_msg); } } catch (Exception ex) { this.ShowToastNotify(this, "微信支付结果查询发生异常,请再次确认"); LOGGER.Error(ex, "微信支付结果查询发生异常"); } } private void AddWxPayType(OrderQueryResult result, string orderNo) { if (result != null && "SUCCESS".Equals(result.return_code) && "SUCCESS".Equals(result.result_code)) { string[] orderNoArray = orderNo.Split('_'); this._orderObject.TradeNo = orderNoArray[1]; //更新订单详情订单号 RefOrderNo(); //构建微信支付方式 PayItem item = OrderUtils.ToPayItem(this.CurrentPayMode); //租户ID item.TenantId = Global.Instance.Authc.TenantId; //订单号 item.OrderId = this._orderObject.Id; item.TradeNo = this._orderObject.TradeNo; //商户订单号 string outTradeNo = string.Format("{0}_{1}", this._orderObject.StoreNo, this._orderObject.TradeNo); item.OutTradeNo = outTradeNo; //实收金额 item.PaidAmount = DecimalUtils.Fen2Yuan(result.total_fee); //找零金额 item.ChangeAmount = Convert.ToDecimal(0.00); //已收金额,真正意义上实际收款金额 item.Amount = item.PaidAmount; item.CardNo = ""; item.TradeVoucherNo = result.transaction_id; item.Memo = result.openid; item.Subscribe = result.is_subscribe; item.PayChannel = this._payChannel; //微信支付状态 item.Status = (int)OrderPaymentStatus.已付款; ; item.StatusDesc = string.Format("微信支付<{0}>", result.result_code); //将微信支付压入支付清单 this._orderObject.Pays.Add(item); } } #endregion #region 原生支付宝渠道查询 /// /// 支付宝支付结果查询 /// /// private void QueryAliPayResult(string orderNo) { try { var parameter = this.CurrentPayMode.Body; string appId = parameter.ContainsKey("appid") ? parameter["appid"].ToString() : ""; string privateKey = parameter.ContainsKey("privatekey") ? parameter["privatekey"].ToString() : ""; string appAuthToken = parameter.ContainsKey("appAuthToken") ? parameter["appAuthToken"].ToString() : ""; string storeNo = parameter.ContainsKey("storeNo") ? parameter["storeNo"].ToString() : ""; string signType = parameter.ContainsKey("signType") ? parameter["signType"].ToString() : "RSA"; DefaultAopClient client = null; if ("RSA2".Equals(signType)) { client = new DefaultAopClient(Global.Instance.AliPayServerUrl, appId, privateKey, "json", "utf-8", "RSA2"); } else { client = new DefaultAopClient(Global.Instance.AliPayServerUrl, appId, privateKey, false); } var request = new AlipayTradeQueryRequest(); var content = new Dictionary(); content.Add("out_trade_no", orderNo); request.BizContent = JsonUtils.Serialize(content); AlipayTradeQueryResponse response = client.Execute(request, string.Empty, appAuthToken); switch (response.TradeStatus) { case "TRADE_SUCCESS": { //发送消息通知显示文本 this.ShowToastNotify(this, "支付宝付款成功,正在充值"); //先查询状态再发起充值 if (DoQuery(orderNo)) { //构建支付宝支付方式 this.AddAliPayType(response, orderNo); //发送自动完成结账事件 MsgEvent.Send(Constant.PAY_AUTO_EVENT_NOTIFY, "支付宝付款成功"); //再关闭当前窗体 this.Close(); } } break; case "WAIT_BUYER_PAY": { this.ShowToastNotify(this, "等待买家付款,未查询到支付成功过状态"); } break; default: { this.ShowToastNotify(this, "等待买家付款,未查询到支付成功过状态"); } break; } } catch (Exception ex) { this.ShowToastNotify(this, "支付宝结果查询发生异常"); LOGGER.Error(ex, "支付宝结果查询发生异常"); } } private void AddAliPayType(AlipayTradeQueryResponse result, string orderNo) { if (result != null && "TRADE_SUCCESS".Equals(result.TradeStatus)) { string[] orderNoArray = orderNo.Split('_'); this._orderObject.TradeNo = orderNoArray[1]; //刷新订单内容 RefOrderNo(); //构建微信支付方式 PayItem item = OrderUtils.ToPayItem(this.CurrentPayMode); //租户ID item.TenantId = Global.Instance.Authc.TenantId; //订单号 item.OrderId = this._orderObject.Id; //订单编号 item.TradeNo = this._orderObject.TradeNo; //商户订单号 string outTradeNo = string.Format("{0}_{1}", this._orderObject.StoreNo, this._orderObject.TradeNo); item.OutTradeNo = outTradeNo; //实收金额 item.PaidAmount = StringUtils.GetDecimal(result.TotalAmount); //找零金额 item.ChangeAmount = Convert.ToDecimal(0.00); //已收金额,真正意义上实际收款金额 item.Amount = item.PaidAmount; item.CardNo = ""; item.TradeVoucherNo = result.TradeNo; item.Memo = result.BuyerUserId; item.Subscribe = string.Empty; item.PayChannel = this._payChannel; //支付宝支付状态 item.Status = (int)OrderPaymentStatus.已付款; item.StatusDesc = string.Format("支付宝付款<{0}>", result.TradeStatus); //将支付宝支付压入支付清单 this._orderObject.Pays.Add(item); } } #endregion public bool DoQuery(string orderNo) { try { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { string[] orderNoArray = orderNo.Split('_'); //先查询核销记录是否存在 string querySql = "select * from pos_order where tradeNo = '{0}'"; querySql = string.Format(querySql, orderNoArray[1]); OrderObject orderObject = db.FirstOrDefault(querySql); //如果插入扫码支付记录 if (orderObject != null) { logger.Info("单号:[{0}]更改扫码支付状态 payStatus==>1......开始", orderNo); string sql = "update pos_saoma_pay_ticket set payStatus =1 where orderNo = '{0}'"; sql = string.Format(sql, orderNo); db.Execute(sql, null); transaction.Complete(); logger.Info("单号:[{0}]更改扫码支付状态 payStatus==>1......更新成功", orderNo); this.ShowToastNotify(this, string.Format("支付核销成功,本地订单号[{0}]已结算成功", orderNo)); return false; } } } } } catch (Exception ex) { LOGGER.Error(ex); } //UpdateSaoMa(orderNo); return true; } /// /// 遍历更新订单单号 /// public void RefOrderNo() { foreach (OrderItem item in this._orderObject.Items) { item.TradeNo = this._orderObject.TradeNo; foreach (PromotionItem promotionItem in item.Promotions) { promotionItem.TradeNo = this._orderObject.TradeNo; } foreach (FlavorItem flavorItem in item.Flavors) { flavorItem.TradeNo = this._orderObject.TradeNo; } } foreach (PromotionOrder promotionOrder in this._orderObject.Promotions) { promotionOrder.TradeNo = this._orderObject.TradeNo; } } private void OnEnterClick(object sender, Component.EnterEventArg e) { QueryTicket(); } private void QueryAllinPayResult(string orderNo) { try { var payParam = this.CurrentPayMode.Body; AllinpayLib.AppId = payParam.ContainsKey("appId") ? payParam["appId"].ToString() : ""; AllinpayLib.AppKey = payParam.ContainsKey("appKey") ? payParam["appKey"].ToString() : ""; AllinpayLib.Url = payParam.ContainsKey("gatewayUrl") ? payParam["gatewayUrl"].ToString() : ""; var info = new GetOrderDetailModel() { reqsn = orderNo.Split('_')[1], }; var param = new GetOrderDetailParamInfo { bizContent = JsonUtils.Serialize(info) }; var _response = AllinpayHelper.GetOrderDetail(param); if (_response.IsSuccess) { var _data = JsonUtils.Deserialize(_response.ResultInfo.data); var _statusDesc = "进行中"; switch (_data.status) { case "1": _statusDesc = "未支付"; break; case "3": _statusDesc = "交易失败"; break; case "4": _statusDesc = "交易成功"; break; case "5": _statusDesc = "交易成功-发生退款"; break; case "6": _statusDesc = "关闭"; break; case "99": _statusDesc = "进行中"; break; } if (_statusDesc.Equals("交易成功")) { //发送消息通知显示文本 this.ShowToastNotify(this, "通联支付付款成功"); //先查询状态再发起充值 if (DoQuery(orderNo)) { //构建支付宝支付方式 this.AddAllinPayType(_data, orderNo); //发送自动完成结账事件 MsgEvent.Send(Constant.PAY_AUTO_EVENT_NOTIFY, "通联支付付款成功"); //再关闭当前窗体 this.Close(); } } else { if (_data != null) { if (!string.IsNullOrEmpty(_statusDesc)) { this.ShowToastNotify(this, "查询结果:" + _statusDesc); return; } } this.ShowToastNotify(this, "查询结果:" + "支付中..."); } } else { this.ShowToastNotify(this, _response.ShowUserMsg); } } catch (Exception ex) { LOGGER.Error(ex, "通联支付结果查询发生异常"); } } private void AddAllinPayType(OrderDetail queryParam, string orderNo) { if (queryParam != null && "4".Equals(queryParam.status)) { //刷新订单内容 RefOrderNo(); //构建支付方式 PayItem item = OrderUtils.ToPayItem(this.CurrentPayMode); //租户ID item.TenantId = Global.Instance.Authc.TenantId; //订单号 item.OrderId = this._orderObject.Id; //订单编号 item.TradeNo = this._orderObject.TradeNo; //商户订单号 string outTradeNo = string.Format("{0}_{1}", this._orderObject.StoreNo, this._orderObject.TradeNo); item.OutTradeNo = outTradeNo; //实收金额 item.PaidAmount = Convert.ToDecimal(StringUtils.GetDecimal(queryParam.amount) / 100); //找零金额 item.ChangeAmount = Convert.ToDecimal(0.00); //已收金额,真正意义上实际收款金额 item.Amount = item.PaidAmount; item.CardNo = ""; item.TradeVoucherNo = queryParam.trxid;//通联唯一订单号 item.Memo = this._payChannel.ToString(); item.Subscribe = string.Empty; item.PayChannel = this._payChannel; //支付状态 item.Status = (int)OrderPaymentStatus.已付款; item.StatusDesc = string.Format("{0}", queryParam.status); //将支付返回的手续费保存至订单的支付信息中 item.OtherRate = 0.77M; //将通联支付压入支付清单 this._orderObject.Pays.Add(item); } } } }