WeChatPayBackService.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using System;
  2. using System.Collections.Generic;
  3. using Library;
  4. using LitJson;
  5. using System.Linq;
  6. using MySystem.Models.Main;
  7. using Org.BouncyCastle.Crypto.Modes;
  8. using Org.BouncyCastle.Crypto.Engines;
  9. using Org.BouncyCastle.Crypto.Parameters;
  10. using System.Text;
  11. using System.Threading;
  12. namespace MySystem
  13. {
  14. public class WeChatPayBackService
  15. {
  16. public readonly static WeChatPayBackService Instance = new WeChatPayBackService();
  17. private WeChatPayBackService()
  18. { }
  19. public void Start()
  20. {
  21. Thread th = new Thread(Listen);
  22. th.IsBackground = true;
  23. th.Start();
  24. }
  25. public void Listen()
  26. {
  27. bool op = true;
  28. while (op)
  29. {
  30. string content = RedisDbconn.Instance.RPop<string>("WeChatPayBack");
  31. if (!string.IsNullOrEmpty(content))
  32. {
  33. try
  34. {
  35. dosomething(content);
  36. }
  37. catch (Exception ex)
  38. {
  39. function.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "微信支付回调异常");
  40. }
  41. }
  42. else
  43. {
  44. Thread.Sleep(2000);
  45. }
  46. }
  47. }
  48. public void dosomething(string content)
  49. {
  50. JsonData jsonObj = JsonMapper.ToObject(content);
  51. if (jsonObj.Count > 0)
  52. {
  53. string OrderNo = jsonObj["outOrderNo"].ToString();
  54. string TradeNo = jsonObj["orderNo"].ToString();
  55. WebCMSEntities db = new WebCMSEntities();
  56. ConsumerOrderForNo forNo = db.ConsumerOrderForNo.FirstOrDefault(m => m.OrderNo == OrderNo);
  57. if (forNo != null)
  58. {
  59. ConsumerOrders order = db.ConsumerOrders.FirstOrDefault(m => m.Id == forNo.OrderIds && m.Status == 0);
  60. if (order != null)
  61. {
  62. order.Status = 1;
  63. order.UpdateDate = DateTime.Now;
  64. order.PayMoney = order.PayMoney;
  65. order.MaxDivi = order.MaxDivi;
  66. order.SeoTitle = TradeNo;
  67. MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == order.MerchantId) ?? new MerchantInfo();
  68. order.UserId = merchant.UserId;
  69. ConsumerOrders check = db.ConsumerOrders.FirstOrDefault(m => m.Id < order.Id && m.Status > 0 && m.PayMode == order.PayMode && m.MerchantId == order.MerchantId);
  70. if (check != null)
  71. {
  72. order.QueryCount = check.QueryCount + 1;
  73. }
  74. else
  75. {
  76. order.QueryCount = 1;
  77. }
  78. db.SaveChanges();
  79. }
  80. }
  81. db.Dispose();
  82. }
  83. }
  84. //分账队列
  85. public void StartProfitShare()
  86. {
  87. Thread th = new Thread(StartProfitShareListen);
  88. th.IsBackground = true;
  89. th.Start();
  90. }
  91. public void StartProfitShareListen()
  92. {
  93. bool op = true;
  94. while (op)
  95. {
  96. try
  97. {
  98. WebCMSEntities db = new WebCMSEntities();
  99. DateTime checkDate = DateTime.Now.AddMinutes(-1);
  100. var list = db.ConsumerOrders.Select(m => new { m.Id, m.CreateDate, m.Status, m.IsAct, m.PayMode }).Where(m => m.Status == 1 && m.IsAct == 1 && m.CreateDate < checkDate).OrderBy(m => m.Id).Take(10).ToList();
  101. foreach (var sub in list)
  102. {
  103. ConsumerOrders order = db.ConsumerOrders.FirstOrDefault(m => m.Id == sub.Id);
  104. if (order != null)
  105. {
  106. order.Status = 2;
  107. MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == order.MerchantId) ?? new MerchantInfo();
  108. MerchantParamSet set = db.MerchantParamSet.FirstOrDefault(m => m.Id == order.MerchantId) ?? new MerchantParamSet();
  109. if (order.IsAct == 1 && order.PayMoney >= set.MinPayMoney)
  110. {
  111. MerchantAddInfo merchantAdd = db.MerchantAddInfo.FirstOrDefault(m => m.Id == order.MerchantId) ?? new MerchantAddInfo();
  112. //发起分账
  113. decimal fee = order.PayMoney; //单位:分
  114. if (fee >= 1)
  115. {
  116. string applyNo = "FZ" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + function.get_Random(8); //批次号
  117. string mchtNo = merchantAdd.OutMchtNo; //慧掌柜商户号
  118. string orderNo = order.OrderNo; //交易订单号(好哒平台订单号,G开头)
  119. string acctNo = AppConfig.Haoda.AcctNo; //账户号,账户类型为商户收款账户时填收款商户号, 账户类型为分账接收方时填分账接收方账户号
  120. string acctType = "1"; //账户类型(0:商户收款账户(大B),1:分账接收方账户(小B))
  121. string amount = (fee * (1M - 0.0038M)).ToString(); //金额(分)
  122. HaoDaHelper.Instance.OrderDivideAccounts(OrderDivideAccountsUtil.AddValue(applyNo, mchtNo, orderNo, acctNo, acctType, amount));
  123. //开始监听分账状态
  124. Dictionary<string, object> req = new Dictionary<string, object>();
  125. req.Add("ApplyNo", applyNo);
  126. req.Add("OrderNo", orderNo);
  127. req.Add("MchtNo", mchtNo);
  128. RedisDbconn.Instance.AddList("ProfitShareQueue", Newtonsoft.Json.JsonConvert.SerializeObject(req));
  129. }
  130. else
  131. {
  132. RedisDbconn.Instance.AddList("ConsumerOrders:Divi:2:List", order.Id.ToString());
  133. }
  134. }
  135. }
  136. }
  137. db.SaveChanges();
  138. db.Dispose();
  139. }
  140. catch (Exception ex)
  141. {
  142. function.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "好哒分账队列异常");
  143. }
  144. Thread.Sleep(2000);
  145. }
  146. }
  147. }
  148. }