You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

650 lines
26 KiB
C#

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 POSV.Payment.Saobei;
using POSV.Payment.Saobei.Parameter;
using POSV.Payment.Saobei.Result;
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;
namespace POSV.Business
{
public partial class FastMPayChckForm : BusinessForm
{
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
public decimal PayMoney = 0.00M;
/// <summary>
/// 订单对象
/// </summary>
private OrderObject _orderObject = null;
/// <summary>
/// 支付渠道
/// </summary>
private PayChannelEnum _payChannel = PayChannelEnum.;
public FastMPayChckForm(OrderObject orderObject, decimal amount)
{
InitializeComponent();
this._orderObject = orderObject;
this.PayMoney = amount;
}
private PayMode CurrentPayMode = null;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.Focus();
var cellStyles = payListTable.DefaultVisualStyles.CellStyles;
//设置选中以背景色、行字体颜色
cellStyles.Selected.Background.Color1 = ColorTranslator.FromHtml("#E7EAF1");
cellStyles.Selected.Background.Color2 = ColorTranslator.FromHtml("#E7EAF1");
cellStyles.Selected.TextColor = ColorTranslator.FromHtml("#000000");
//设置鼠标经过背景色、行字体颜色
cellStyles.SelectedMouseOver.Background.Color1 = ColorTranslator.FromHtml("#E7EAF1");
cellStyles.SelectedMouseOver.Background.Color2 = ColorTranslator.FromHtml("#E7EAF1");
cellStyles.SelectedMouseOver.TextColor = ColorTranslator.FromHtml("#000000");
var rowStyles = payListTable.DefaultVisualStyles.RowStyles;
//设置选中以后行头部、底部背景色、头部字体颜色
rowStyles.Selected.RowHeaderStyle.Background.Color1 = ColorTranslator.FromHtml("#E7EAF1");
rowStyles.Selected.RowHeaderStyle.Background.Color2 = ColorTranslator.FromHtml("#E7EAF1");
rowStyles.Selected.RowHeaderStyle.TextColor = ColorTranslator.FromHtml("#000000");
rowStyles.Selected.Background.Color1 = ColorTranslator.FromHtml("#E7EAF1");
rowStyles.Selected.Background.Color2 = ColorTranslator.FromHtml("#E7EAF1");
//设置鼠标经过行头部、底部背景色、头部字体颜色
rowStyles.SelectedMouseOver.RowHeaderStyle.Background.Color1 = ColorTranslator.FromHtml("#E7EAF1");
rowStyles.SelectedMouseOver.RowHeaderStyle.Background.Color2 = ColorTranslator.FromHtml("#E7EAF1");
rowStyles.SelectedMouseOver.RowHeaderStyle.TextColor = ColorTranslator.FromHtml("#000000");
rowStyles.SelectedMouseOver.Background.Color1 = ColorTranslator.FromHtml("#E7EAF1");
rowStyles.SelectedMouseOver.Background.Color2 = ColorTranslator.FromHtml("#E7EAF1");
QueryTicket();
}
private void OnCloseTouchClick(object sender, EventArgs e)
{
//先关闭父窗体
if (this.Owner != null)
{
this.Owner.Close();
}
//再关闭当前窗体
this.Close();
}
/// <summary>
/// 关闭窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnClose(object sender, EventArgs e)
{
OnCloseTouchClick(sender, e);
}
private void QueryTicket()
{
string orderNo = this.txtReChargeNo.Text;
List<SaomaPayTicket> 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<SaomaPayTicket> getSaomaPayTicket(string orderNo)
{
List<SaomaPayTicket> 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<SaomaPayTicket>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
if (list == null)
{
list = new List<SaomaPayTicket>();
}
return list;
}
#region 原生微信支付渠道查询
/// <summary>
/// 微信支付结果查询
/// </summary>
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 原生支付宝渠道查询
/// <summary>
/// 支付宝支付结果查询
/// </summary>
/// <param name="OutTradeNo"></param>
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<string, object>();
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
#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";
}
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, "扫呗支付付款成功");
//先关闭父窗体
if (this.Owner != null)
{
this.Owner.Close();
}
//再关闭当前窗体
this.Close();
}
}
else
{
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
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<OrderObject>(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;
}
/// <summary>
/// 遍历更新订单单号
/// </summary>
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 BtnTouchQuery(object sender, Component.TouchEventArgs e)
{
QueryTicket();
}
private void BtnTouchCheck(object sender, Component.TouchEventArgs 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();
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;
}
}
}
}