|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
namespace POSV.Bill
|
|
|
|
|
{
|
|
|
|
|
public partial class MPayCheckForm : 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 MPayCheckForm(OrderObject orderObject, decimal amount)
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
this.controlBox.Text = LangProxy.ToLang("扫码支付核销");
|
|
|
|
|
this.controlBox.ShowApplicationVersion = false;
|
|
|
|
|
this._orderObject = orderObject;
|
|
|
|
|
this.PayMoney = amount;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 查询
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
private void BtnQuery(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
QueryTicket();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 核销按钮
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="e"></param>
|
|
|
|
|
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();
|
|
|
|
|
|
|
|
|
|
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 扫呗支付渠道
|
|
|
|
|
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<string, string> keys = new Dictionary<string, string>();
|
|
|
|
|
|
|
|
|
|
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<PayItem>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this._orderObject.Pays.Add(_data.Item3);
|
|
|
|
|
|
|
|
|
|
//发送自动完成结账事件
|
|
|
|
|
MsgEvent.Send(Constant.PAY_AUTO_EVENT_NOTIFY, "支付付款成功");
|
|
|
|
|
//再关闭当前窗体
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|