d_sms_service/APT.MicroApi/APT.OP.WebApi/Controllers/Api/WeiXinController.cs

299 lines
15 KiB
C#
Raw Normal View History

2024-10-28 13:45:58 +08:00
using APT.BaseData.Domain.Entities.OP;
using APT.BaseData.Domain.Enums.OP;
using APT.CMS.Domain.Entities.SO;
using APT.CMS.Domain.Enums.FC;
using APT.CMS.Domain.Enums.SO;
using APT.Infrastructure.Api;
using APT.Infrastructure.Core;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace APT.OP.WebApi.Controllers.Api
{
[Route("api/OP/WeiXin")]
public class WeiXinController : APTApiController<T_OP_CLIENT>
{
/// <summary>
/// 付款回调
/// </summary>
/// <returns></returns>
[HttpPost, Route("Notify")]
public async Task<IActionResult> Notify()
{
String xmlData = getPostStr();
//保存付款成功过来的数据
LoggerManager.GetLogger().Info("GXL", xmlData);
PayResult(xmlData);
return Content("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>", "text/xml");
}
[HttpPost("CancelNotify")]
/// <summary>
/// 付款返回的数据
/// </summary>
/// <returns></returns>
public async Task<IActionResult> CancelNotify()
{
String xmlData = getPostStr();
//保存付款成功过来的数据
LoggerManager.GetLogger().Info("GXL", xmlData);
CancelResult(xmlData);
return Content("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>", "text/xml");
}
//获得Post过来的数据
public string getPostStr()
{
//Int32 intLen = Convert.ToInt32(System.Web.HttpContext.Current.Request.InputStream.Length);
//byte[] b = new byte[intLen];
//System.Web.HttpContext.Current.Request.InputStream.Read(b, 0, intLen);
Request.EnableBuffering();
using (Stream stream = Request.Body)
{
byte[] buffer = new byte[Request.ContentLength.Value];
stream.Read(buffer, 0, buffer.Length);
string content = Encoding.UTF8.GetString(buffer);
return content;
}
}
/// <summary>
/// 付款结果处理
/// </summary>
public void PayResult(string ResultMsg)
{
if (!string.IsNullOrEmpty(ResultMsg))
{
LoggerManager.GetLogger().Info("收到回调数据1:" + ResultMsg);
var xml = new XmlDocument();
xml.LoadXml(ResultMsg);
//处理返回的值
DataSet ds = new DataSet();
StringReader stram = new StringReader(ResultMsg);
XmlTextReader reader = new XmlTextReader(stram);
ds.ReadXml(reader);
string return_code = ds.Tables[0].Rows[0]["return_code"].ToString();
if (return_code.ToUpper() == "SUCCESS")
{
//通信成功
string result_code = ds.Tables[0].Rows[0]["result_code"].ToString();//业务结果
if (result_code.ToUpper() == "SUCCESS")
{
string appid = ds.Tables[0].Rows[0]["appid"].ToString();
//string attach = ds.Tables[0].Rows[0]["attach"].ToString();
string mch_id = ds.Tables[0].Rows[0]["mch_id"].ToString();
string openid = ds.Tables[0].Rows[0]["openid"].ToString();
string orderid = ds.Tables[0].Rows[0]["out_trade_no"].ToString();
Int32 total_fee = Convert.ToInt32(ds.Tables[0].Rows[0]["total_fee"].ToString());
string transaction_id = ds.Tables[0].Rows[0]["transaction_id"].ToString();
LoggerManager.GetLogger().Info("付款成功:小程序appID:" + appid + ",商户号:" + mch_id +
",支付人:" + openid + ",付款金额:" + total_fee + ",商户交易号:" + transaction_id);
//var gOrder = orderid.Substring(0, 8) + "-" + orderid.Substring(8, 4) + "-" + orderid.Substring(12, 4) + "-" + orderid.Substring(16, 4) + "-" + orderid.Substring(20);
var orderAry = orderid.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
//var orderId = new Guid(gOrder);
//var order = this.GetEntity<T_FM_SALE_ORDER>(i => i.CODE == orderAry[0], "Nav_ClinetOpen.NavClient",
// "Nav_Orders.Nav_Details.Nav_Stock.Nav_HotelRoomTypeDetail.Nav_HotelRoomType",
// "Nav_Orders.Nav_Details.Nav_Stock.Nav_HotelRoomTypeDetail.Nav_Hotel");
if (orderAry[2] == "DK")//电卡订单
{
BaseFilter filter = new BaseFilter();
filter.IgnoreOrgRule = true;
filter.IsMultipleDb = true;
var order = this.GetEntity<T_SO_RECHARGE_ORDER>(i => i.CODE == orderAry[0], filter, "Nav_RechargeCard");
if (order == null)
LoggerManager.GetLogger().Error("订单不存在:" + order);
order.ORDER_STATUS = (int)OPRechargeOrderStatus.;
if (order.Nav_RechargeCard != null)
{
var rechargeCard = order.Nav_RechargeCard;
rechargeCard.BALANCE += order.AMOUNT;
this.UpdateEntityByConn(order, order.DbConn,"ORDER_STATUS");
this.UpdateEntityByConn(rechargeCard, order.DbConn, "BALANCE");
LoggerManager.GetLogger().Info("充值成功" + order.CODE);
}
else
{
order.ORDER_STATUS = (int)OPRechargeOrderStatus.;
this.UpdateEntityByConn(order, order.DbConn, "ORDER_STATUS");
LoggerManager.GetLogger().Error("微信充值成功,电卡金额未更新:" + ResultMsg);
}
}
else//微信直接支付
{
BaseFilter filter = new BaseFilter();
filter.IgnoreOrgRule = true;
filter.IsMultipleDb = true;
var order = this.GetEntity<T_SO_CHARGING_ORDER>(x => x.CODE == orderAry[0], filter);//查询订单
order.PAY_TYPE = (int)FCPayType.;
order.ORDER_STATUS = (int)FCOrderStatus.;
this.UpdateEntityByConn(order, order.DbConn);//更新订单状态
}
}
else
{
LoggerManager.GetLogger().Error("支付失败:" + ResultMsg);
}
}
else
{
LoggerManager.GetLogger().Error("支付失败:" + ResultMsg);
}
}
}
/// <summary>
/// 付款结果处理
/// </summary>
public void CancelResult(string ResultMsg)
{
if (!string.IsNullOrEmpty(ResultMsg))
{
LoggerManager.GetLogger().Info("收到回调数据:" + ResultMsg);
var xml = new XmlDocument();
xml.LoadXml(ResultMsg);
//处理返回的值
DataSet ds = new DataSet();
StringReader stram = new StringReader(ResultMsg);
XmlTextReader reader = new XmlTextReader(stram);
ds.ReadXml(reader);
string return_code = ds.Tables[0].Rows[0]["return_code"].ToString();
if (return_code.ToUpper() == "SUCCESS")
{
//通信成功
string appid = ds.Tables[0].Rows[0]["appid"].ToString();
//string attach = ds.Tables[0].Rows[0]["attach"].ToString();
string mch_id = ds.Tables[0].Rows[0]["mch_id"].ToString();
string reqInfo = ds.Tables[0].Rows[0]["req_info"].ToString();
//
var tenant = this.GetEntity<T_OP_TENANT>(x => x.MCH_ID == mch_id);//查找运营商
//解密reqInfo
string dReqInfo = DecodeReqInfoByTenant(reqInfo, tenant.WXPAYKEY);
if (dReqInfo == null)
{
LoggerManager.GetLogger().Error("解密失败");
return;
}
LoggerManager.GetLogger().Info(reqInfo);
DataSet dsReq = new DataSet();
StringReader stramReq = new StringReader(dReqInfo);
XmlTextReader readerReq = new XmlTextReader(stramReq);
dsReq.ReadXml(readerReq);
string orderid = dsReq.Tables[0].Rows[0]["out_trade_no"].ToString();
string refundCode = dsReq.Tables[0].Rows[0]["out_refund_no"].ToString();
Int32 total_fee = Convert.ToInt32(dsReq.Tables[0].Rows[0]["total_fee"].ToString());
Int32 refund_fee = Convert.ToInt32(dsReq.Tables[0].Rows[0]["refund_fee"].ToString());
string transaction_id = dsReq.Tables[0].Rows[0]["transaction_id"].ToString();
LoggerManager.GetLogger().Info("退款成功:小程序appID:" + appid + ",商户号:" + mch_id +
",订单金额:" + total_fee + ",退款金额:" + refund_fee + ",商户交易号:" + transaction_id);
var orderAry = orderid.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
var refundCodeAry = refundCode.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries);
if (orderAry[3] == "DK")//电卡订单
{
BaseFilter filter = new BaseFilter();
filter.IgnoreOrgRule = true;
filter.IsMultipleDb = true;
var refundOrder = this.GetEntity<T_SO_REFUND_ORDER>(i => i.CODE == refundCodeAry[0], filter);
if (refundOrder == null)
LoggerManager.GetLogger().Error("订单不存在:" + refundOrder);
refundOrder.REFUND_STATUS = (int)SORefundOrderStatus.退;
var order = this.GetEntity<T_SO_RECHARGE_ORDER>(i => i.CODE == orderAry[0], filter, "Nav_RechargeCard");
if (order.Nav_RechargeCard != null)
{
var rechargeCard = order.Nav_RechargeCard;
rechargeCard.BALANCE -= refundOrder.REFUND_AMOUNT;//扣除电卡金额
this.UpdateEntityByConn(refundOrder, refundOrder.DbConn, "REFUND_STATUS");
this.UpdateEntityByConn(rechargeCard, refundOrder.DbConn, "BALANCE");
LoggerManager.GetLogger().Info("退款成功" + order.CODE);
}
else
{
refundOrder.REFUND_STATUS = (int)SORefundOrderStatus.退;
this.UpdateEntityByConn(refundOrder, refundOrder.DbConn, "REFUND_STATUS");
LoggerManager.GetLogger().Error("微信退款成功,电卡金额未更新:" + ResultMsg);
}
}
else//微信直接支付
{
BaseFilter filter = new BaseFilter();
filter.IgnoreOrgRule = true;
filter.IsMultipleDb = true;
var refundOrder = this.GetEntity<T_SO_REFUND_ORDER>(i => i.CODE == refundCodeAry[0], filter);
if (refundOrder == null)
LoggerManager.GetLogger().Error("订单不存在:" + refundOrder);
refundOrder.REFUND_STATUS = (int)SORefundOrderStatus.退;
this.UpdateEntityByConn(refundOrder, refundOrder.DbConn, "REFUND_STATUS");//更新订单状态
}
}
else
{
LoggerManager.GetLogger().Error("退款成功:" + ResultMsg);
}
}
}
public static string DecodeReqInfo(string s)
{
string r = null;
string key = GenerateMD5(LibUtils.ToString(ConfigurationManager.AppSettings["WxPayKey"])).ToLower();
r = DecodeAES256ECB(s, key);
return r;
}
public static string DecodeReqInfoByTenant(string s,string key)
{
string r = null;
//string key = GenerateMD5(LibUtils.ToString(ConfigurationManager.AppSettings["WxPayKey"])).ToLower();
r = DecodeAES256ECB(s, key);
return r;
}
public static string DecodeAES256ECB(string s, string key)
{
string r = null;
try
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] toEncryptArray = Convert.FromBase64String(s);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
r = UTF8Encoding.UTF8.GetString(resultArray);
}
catch (Exception e)
{
LoggerManager.GetLogger().Error("解密异常:" + e.Message);
}
return r;
}
public static string GenerateMD5(string txt)
{
using (MD5 mi = MD5.Create())
{
byte[] buffer = Encoding.Default.GetBytes(txt);
//开始加密
byte[] newBuffer = mi.ComputeHash(buffer);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < newBuffer.Length; i++)
{
sb.Append(newBuffer[i].ToString("x2"));
}
return sb.ToString();
}
}
}
}