DuGuYang 1 year ago
parent
commit
01e5e580ca

+ 230 - 0
AppStart/Helper/OrdersPayService.cs

@@ -0,0 +1,230 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Linq;
+using System.Data;
+using MySystem;
+using Library;
+using LitJson;
+using Aop.Api;
+using Aop.Api.Request;
+using Newtonsoft.Json;
+using Aop.Api.Response;
+using System.Net;
+using System.Security.Cryptography;
+using System.IO;
+using MySystem.MainModels;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
+using MySystem.Areas.Api.Controllers;
+using Microsoft.Extensions.Options;
+
+/// <summary>
+/// 来客吧支付
+/// </summary>
+public class OrdersPayService
+{
+    public readonly static OrdersPayService Instance = new OrdersPayService();
+    private OrdersPayService()
+    {
+    }
+
+    public void StartEverTime()
+    {
+        Thread th = new Thread(StartEverTimeDo);
+        th.IsBackground = true;
+        th.Start();
+    }
+
+    #region 来客吧支付队列
+    private void StartEverTimeDo()
+    {
+        while (true)
+        {
+            try
+            {
+                string data = RedisDbconn.Instance.RPop<string>("OrdersPayQueue");
+                if (!string.IsNullOrEmpty(data))
+                {
+                    function.WriteLog("data:" + data, "来客吧支付回调日志");
+
+                    JsonData jsonData = JsonMapper.ToObject(data);
+                    string SnNo = jsonData["Sn"].ToString(); //码牌SN
+                    int PayMode = int.Parse(function.CheckInt(jsonData["PayMode"].ToString())); //支付方式
+                    decimal PayMoney = decimal.Parse(function.CheckNum(jsonData["PayMoney"].ToString())); //支付金额
+                    string Code = jsonData["Code"].ToString(); // 订单唯一标识
+                    string OnlyFlag = jsonData["OnlyFlag"].ToString();
+                    string Value = jsonData["Value"].ToString();
+
+                    Dictionary<string, object> Obj = new Dictionary<string, object>();
+                    MySystem.AppResultJson returnObj = new MySystem.AppResultJson();
+                    MerchantQrCode qrcode = MerchantQrCodeDbconn.Instance.Get(SnNo) ?? new MerchantQrCode();
+                    PosMachinesTwo pos = PosMachinesTwoDbconn.Instance.Get(SnNo) ?? new PosMachinesTwo();
+                    PosMachines machine = PosMachinesDbconn.Instance.Get(SnNo) ?? new PosMachines();
+                    function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "-5", "支付时间监控");
+                    int MerchantId = pos.BindMerchantId;
+                    if (machine.DeviceKind == "1")
+                    {
+                        MerchantId = machine.BindMerchantId;
+                    }
+                    if (pos.OpId == 1 || machine.DeviceKind == "1")
+                    {
+                        WebCMSEntities maindb = new WebCMSEntities();
+                        MerchantInfo merchant = MerchantInfoDbconn.Instance.Get(MerchantId) ?? new MerchantInfo();
+                        MerchantAddInfo merchantAdd = MerchantAddInfoDbconn.Instance.Get(MerchantId) ?? new MerchantAddInfo();
+                        MerchantParamSet merchantset = MerchantParamSetDbconn.Instance.Get(MerchantId) ?? new MerchantParamSet();
+
+                        function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "-6", "支付时间监控");
+                        //通过Code获取OpenId
+                        string openid = OpenId(Code, PayMode);
+                        function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "-7", "支付时间监控");
+
+                        int ConsumerId = 0;
+
+                        string OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8);
+                        bool ActFlag = merchantset.IsAll == 1 ? false : true;
+                        if (PayMoney < merchantset.MinPayMoney) //支付金额小于活动最小金额,则不分账
+                        {
+                            ActFlag = false;
+                        }
+                        ConsumerOrders order = maindb.ConsumerOrders.Add(new ConsumerOrders()
+                        {
+                            // Id = PublicFunction.MakeConsumerOrderId(),
+                            CreateDate = DateTime.Now, //创建时间
+                            MerchantId = MerchantId, //商户
+                            ConsumerId = ConsumerId, //消费者
+                            UserId = merchant.UserId, //创客
+                            PayMode = PayMode, //支付方式
+                            PayMoney = PayMoney, //支付金额
+                            SnNo = SnNo, //SN号
+                            OrderNo = OrderNo,
+                            MaxDivi = ActFlag ? PayMoney * merchantset.DiviPercent / 100 : 0,
+                            IsAct = ActFlag ? 1u : 0u,
+                            MerchantActualAmount = ActFlag ? PayMoney * merchantset.GetPercent / 100 : PayMoney,
+                            SeoDescription = Newtonsoft.Json.JsonConvert.SerializeObject(merchantset),
+                        }).Entity;
+                        maindb.SaveChanges();
+                        maindb.ConsumerOrderForNo.Add(new ConsumerOrderForNo()
+                        {
+                            OrderNo = OrderNo,
+                            OrderIds = order.Id,
+                        });
+                        maindb.SaveChanges();
+                        if (PayMode == 1)
+                        {
+                            string backString = new AlipayFunction().CreateTrade(OrderNo, merchant.Name, PayMoney, openid, merchantAdd.AlipayAuthToken, ConfigurationManager.AppSettings["SpHost"].ToString() + "/api/alipay/notice");
+                            JsonData obj = JsonMapper.ToObject(backString);
+                            if (obj["alipay_trade_create_response"]["code"].ToString() == "10000")
+                            {
+                                string tradeNo = obj["alipay_trade_create_response"]["trade_no"].ToString();
+                                Obj.Add("respCode", obj["alipay_trade_create_response"]["code"].ToString());
+                                Obj.Add("tradeNo", tradeNo);
+                            }
+                            else
+                            {
+                                Obj.Add("respCode", obj["alipay_trade_create_response"]["code"].ToString());
+                                Obj.Add("tradeNo", "");
+                                returnObj = new MySystem.AppResultJson() { Status = "-1", Info = obj["alipay_trade_create_response"]["sub_msg"].ToString(), Data = Obj };
+                            }
+                        }
+                        else if (PayMode == 2)
+                        {
+                            string SubMchId = merchantAdd.SubMchid;
+                            string Description = merchant.Name;
+                            string OpenId = openid;
+                            string Key = AppConfig.WeChatParam.AesGemKey;
+                            string NotifyUrl = ConfigurationManager.AppSettings["SpHost"].ToString() + "/api/wechat/notice";
+                            Dictionary<string, string> dic = new WeChatFunction().Pay(SubMchId, PayMoney, OrderNo, Description, OpenId, Key, NotifyUrl, ActFlag);
+                            Obj.Add("appId", dic["appId"]); //微信小程序appid
+                            Obj.Add("timeStamp", dic["timeStamp"]); //时间戳
+                            Obj.Add("nonceStr", dic["nonceStr"]); //随机字符串
+                            Obj.Add("package", dic["package"]); //统一支付接口返回的prepayid参数值
+                            Obj.Add("paySign", dic["paySign"]); //支付签名
+                            Obj.Add("ConsumerId", ConsumerId);
+                        }
+                        RedisDbconn.Instance.AddList("OrdersPayBack:" + OnlyFlag, Newtonsoft.Json.JsonConvert.SerializeObject(returnObj));
+                    }
+                    else
+                    {
+                        string result = function.PostWebRequest(AppConfig.Base.Host2 + "api/v1/consumerorders/pay", "value=" + Value);
+                        // return Newtonsoft.Json.JsonConvert.DeserializeObject<AppResultJson>(result);
+                        RedisDbconn.Instance.AddList("OrdersPayBack:" + OnlyFlag, result);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "来客吧支付回调线程异常");
+            }
+        }
+    }
+    #endregion
+
+    #region 通过Code获取OpenId
+    /// <summary>
+    /// 通过Code获取OpenId
+    /// </summary>
+    /// <param name="Code"></param>
+    /// <param name="PayMode"></param>
+    /// <returns></returns>
+    public string OpenId(string Code, int PayMode)
+    {
+        var OpenId = "";
+        if (PayMode == 1)
+        {
+            OpenId = new AlipayFunction().GetAlipayUserId(Code);
+            if (OpenId.Contains("|"))
+            {
+                OpenId = OpenId.Split('|')[0];
+            }
+        }
+        else
+        {
+            string result = function.GetWebRequest("https://api.weixin.qq.com/sns/jscode2session?appid=" + new WeChatFunction().AppId + "&secret=" + new WeChatFunction().AppSecret + "&js_code=" + Code + "&grant_type=authorization_code");
+            function.WriteLog(DateTime.Now.ToString() + "\n" + result, "微信小程序获取openid");
+            JsonData jsonObj = JsonMapper.ToObject(result);
+            OpenId = jsonObj["openid"].ToString();
+        }
+        return OpenId;
+    }
+    #endregion
+
+
+    #region 通过OpenId获取ConsumerId
+    /// <summary>
+    /// 通过OpenId获取ConsumerId
+    /// </summary>
+    /// <param name="OpenId"></param>
+    /// <returns></returns>
+    public string OpenId(string OpenId)
+    {
+        WebCMSEntities maindb = new WebCMSEntities();
+        var ConsumerId = 0;
+        ConsumerOpenIds check = maindb.ConsumerOpenIds.FirstOrDefault(m => m.OpenId == openid);
+        if (check == null)
+        {
+            Consumers consumer = maindb.Consumers.Add(new Consumers()
+            {
+                Id = ConsumerId,
+                CreateDate = DateTime.Now,
+                WechatOpenId = OpenId,
+            }).Entity;
+            maindb.SaveChanges();
+            ConsumerId = consumer.Id;
+            check = maindb.ConsumerOpenIds.Add(new ConsumerOpenIds()
+            {
+                OpenId = OpenId,
+                ConsumerId = ConsumerId,
+            }).Entity;
+        }
+        else
+        {
+            ConsumerId = check.ConsumerId;
+        }
+        maindb.SaveChanges();
+        
+        return ConsumerId;
+    }
+    #endregion
+
+}

+ 71 - 9
Areas/Api/Controllers/v1/MainServer/ConsumerOrdersController.cs

@@ -135,7 +135,7 @@ namespace MySystem.Areas.Api.Controllers.v1
 
 
 
-        
+
 
 
 
@@ -248,10 +248,10 @@ namespace MySystem.Areas.Api.Controllers.v1
             JsonData data = JsonMapper.ToObject(value);
             string SnNo = data["Sn"].ToString(); //码牌SN
             // string Machine = data["Machine"].ToString();
-            if(SnNo.Length > 20)
+            if (SnNo.Length > 20)
             {
                 SnNo = System.Web.HttpUtility.UrlDecode(SnNo);
-                if(!SnNo.EndsWith("="))
+                if (!SnNo.EndsWith("="))
                 {
                     SnNo += "=";
                 }
@@ -281,11 +281,11 @@ namespace MySystem.Areas.Api.Controllers.v1
             PosMachines machine = PosMachinesDbconn.Instance.Get(SnNo) ?? new PosMachines();
             function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "-5", "支付时间监控");
             int MerchantId = pos.BindMerchantId;
-            if(machine.DeviceKind == "1")
+            if (machine.DeviceKind == "1")
             {
                 MerchantId = machine.BindMerchantId;
             }
-            if(pos.OpId == 1 || machine.DeviceKind == "1")
+            if (pos.OpId == 1 || machine.DeviceKind == "1")
             {
                 MerchantInfo merchant = MerchantInfoDbconn.Instance.Get(MerchantId) ?? new MerchantInfo();
                 MerchantAddInfo merchantAdd = MerchantAddInfoDbconn.Instance.Get(MerchantId) ?? new MerchantAddInfo();
@@ -293,7 +293,7 @@ namespace MySystem.Areas.Api.Controllers.v1
                 function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "-6", "支付时间监控");
                 string openid = "";
                 if (PayMode == 1)
-                { 
+                {
                     openid = new AlipayFunction(_accessor.HttpContext).GetAlipayUserId(Code);
                     if (openid.Contains("|"))
                     {
@@ -335,7 +335,7 @@ namespace MySystem.Areas.Api.Controllers.v1
                 function.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "-8", "支付时间监控");
                 string OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8);
                 bool ActFlag = merchantset.IsAll == 1 ? false : true;
-                if(PayMoney < merchantset.MinPayMoney) //支付金额小于活动最小金额,则不分账
+                if (PayMoney < merchantset.MinPayMoney) //支付金额小于活动最小金额,则不分账
                 {
                     ActFlag = false;
                 }
@@ -364,7 +364,7 @@ namespace MySystem.Areas.Api.Controllers.v1
                 });
                 maindb.SaveChanges();
                 if (PayMode == 1)
-                { 
+                {
                     string backString = new AlipayFunction(_accessor.HttpContext).CreateTrade(OrderNo, merchant.Name, PayMoney, openid, merchantAdd.AlipayAuthToken, SpHost + "/api/alipay/notice");
                     JsonData obj = JsonMapper.ToObject(backString);
                     if (obj["alipay_trade_create_response"]["code"].ToString() == "10000")
@@ -374,7 +374,7 @@ namespace MySystem.Areas.Api.Controllers.v1
                         Obj.Add("tradeNo", tradeNo);
                     }
                     else
-                    { 
+                    {
                         Obj.Add("respCode", obj["alipay_trade_create_response"]["code"].ToString());
                         Obj.Add("tradeNo", "");
                         return new AppResultJson() { Status = "-1", Info = obj["alipay_trade_create_response"]["sub_msg"].ToString(), Data = Obj };
@@ -407,6 +407,68 @@ namespace MySystem.Areas.Api.Controllers.v1
         #endregion
 
 
+        #region 消费者-支付接口
+        [Authorize]
+        public JsonResult Payv2(string value)
+        {
+            if (string.IsNullOrEmpty(value))
+            {
+                System.IO.StreamReader sr = new System.IO.StreamReader(Request.Body);
+                value = sr.ReadToEnd();
+                value = value.Split('=')[1];
+            }
+            value = DesDecrypt(value);
+            JsonData data = JsonMapper.ToObject(value);
+            AppResultJson result = Payv2Do(value);
+            return Json(new AppResultJson() { Status = result.Status, Info = result.Info, Data = result.Data });
+        }
+        public AppResultJson Payv2Do(string value)
+        {
+            JsonData data = JsonMapper.ToObject(value);
+            string SnNo = data["Sn"].ToString(); //码牌SN
+            if (SnNo.Length > 20)
+            {
+                SnNo = System.Web.HttpUtility.UrlDecode(SnNo);
+                if (!SnNo.EndsWith("="))
+                {
+                    SnNo += "=";
+                }
+                SnNo = dbconn.Decrypt3DES(SnNo, "l2k0b2#3");
+                SnNo = SnNo.TrimEnd('\0');
+                SnNo = SnNo.Substring(0, 20);
+            }
+            int PayMode = int.Parse(function.CheckInt(data["PayMode"].ToString())); //支付方式
+            decimal PayMoney = decimal.Parse(function.CheckNum(data["PayMoney"].ToString())); //支付金额
+            string Code = data["Code"].ToString();
+            var OnlyFlag = "No" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8); // 订单唯一标识
+            Dictionary<string, object> Obj = new Dictionary<string, object>();
+            Obj.Add("OnlyFlag", OnlyFlag);
+            RedisDbconn.Instance.AddList("OrdersPayQueue", "{\"SnNo\":\"" + SnNo + "\",\"PayMode\":\"" + PayMode + "\",\"PayMoney\":\"" + PayMoney + "\",\"Code\":\"" + Code + "\",\"OnlyFlag\":\"" + OnlyFlag + "\",\"Value\":\"" + value + "\"}");
+            return new AppResultJson() { Status = "1", Info = "", Data = Obj };
+        }
+        #endregion
+
+
+        #region 支付返回
+        [Authorize]
+        public JsonResult PayReturn(string value)
+        {
+            value = DesDecrypt(value);
+            JsonData data = JsonMapper.ToObject(value);
+            AppResultJson result = PayReturnDo(value);
+            return Json(new AppResultJson() { Status = result.Status, Info = result.Info, Data = result.Data });
+        }
+        private AppResultJson PayReturnDo(string value)
+        {
+            JsonData data = JsonMapper.ToObject(value);
+            Dictionary<string, object> Obj = new Dictionary<string, object>();
+            string OnlyFlag = data["OnlyFlag"].ToString(); //码牌SN
+            var result = RedisDbconn.Instance.RPop<string>("OrdersPayBack:" + OnlyFlag);
+            return Newtonsoft.Json.JsonConvert.DeserializeObject<AppResultJson>(result);
+        }
+        #endregion
+
+