Commit 16fc4a6c authored by 吴春's avatar 吴春

1

parent 2804b713
......@@ -11,16 +11,13 @@ namespace Mall.WeChat.Common
/// </summary>
public class WechatMessage
{
/// <summary>
/// 本公众帐号
/// </summary>
public string ToUserName { get; set; }
/// <summary>
/// appid
/// </summary>
public string Appid { get; set; }
public string AppId { get; set; }
/// <summary>
/// Token
......@@ -31,6 +28,11 @@ namespace Mall.WeChat.Common
/// EncodingAESKey
/// </summary>
public string EncodingAESKey { get; set; }
/// <summary>
/// 本公众帐号
/// </summary>
public string ToUserName { get; set; }
/// <summary>
/// 用户帐号
/// </summary>
......@@ -52,15 +54,23 @@ namespace Mall.WeChat.Common
/// </summary>
public string EventName { get; set; }
/// <summary>
/// 这两个属性会在后面的讲解中提到
/// 消息id
/// </summary>
public string Ticket { get; set; }
public string MsgId { get; set; }
/// <summary>
/// 消息标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 事件KEY值,qrscene_为前缀,后面为二维码的参数值
/// 消息url地址
/// </summary>
public string EventKey { get; set; }
public string PagePath { get; set; }
}
......
......@@ -62,7 +62,7 @@ namespace Mall.Common.Pay.WeChatPat
// @return: 成功0,失败返回对应的错误码
public int DecryptMsg(string sMsgSignature, string sTimeStamp, string sNonce, string sPostData, ref string sMsg)
{
if (m_sEncodingAESKey.Length!=43)
if (m_sEncodingAESKey.Length != 43)
{
return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_IllegalAesKey;
}
......@@ -112,7 +112,7 @@ namespace Mall.Common.Pay.WeChatPat
// return:成功0,失败返回对应的错误码
public int EncryptMsg(string sReplyMsg, string sTimeStamp, string sNonce, ref string sEncryptMsg)
{
if (m_sEncodingAESKey.Length!=43)
if (m_sEncodingAESKey.Length != 43)
{
return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_IllegalAesKey;
}
......@@ -187,7 +187,7 @@ namespace Mall.Common.Pay.WeChatPat
}
}
public static int GenarateSinature(string sToken, string sTimeStamp, string sNonce, string sMsgEncrypt ,ref string sMsgSignature)
public static int GenarateSinature(string sToken, string sTimeStamp, string sNonce, string sMsgEncrypt, ref string sMsgSignature)
{
ArrayList AL = new ArrayList();
AL.Add(sToken);
......@@ -245,7 +245,7 @@ namespace Mall.Common.Pay.WeChatPat
int r = ret.DecryptMsg(msg_signature, timestamp, nonce, postStr, ref postStr);
if (r != 0)
{
Plugin.LogHelper.WriteInfo("GetWxMessage_消息解密失败:");
Plugin.LogHelper.WriteInfo("GetWxMessage_消息解密失败111:");
return wx;
}
}
......@@ -255,39 +255,23 @@ namespace Mall.Common.Pay.WeChatPat
wx.ToUserName = xml.SelectSingleNode("xml").SelectSingleNode("ToUserName").InnerText;
wx.FromUserName = xml.SelectSingleNode("xml").SelectSingleNode("FromUserName").InnerText;
wx.MsgType = xml.SelectSingleNode("xml").SelectSingleNode("MsgType").InnerText;
if (wx.MsgType.Trim() == "text")
{
wx.Content = xml.SelectSingleNode("xml").SelectSingleNode("Content").InnerText;
}
if (wx.MsgType.Trim() == "event")
{
wx.EventName = xml.SelectSingleNode("xml").SelectSingleNode("Event").InnerText;
try
else if (wx.MsgType.Trim() == "miniprogrampage")
{
wx.EventKey = xml.SelectSingleNode("xml").SelectSingleNode("EventKey").InnerText;
Plugin.LogHelper.Write("wx.EventKey:" + wx.EventKey.Trim());
}
catch (Exception ex)
{
Plugin.LogHelper.Write( ex);
wx.EventKey = "";
}
try
{
wx.Ticket = xml.SelectSingleNode("xml").SelectSingleNode("Ticket")?.InnerText ?? "";
Plugin.LogHelper.Write("wx.Ticket:" + wx.Ticket.Trim());
}
catch (Exception ex)
{
Plugin.LogHelper.Write(ex);
wx.Ticket = "";
}
wx.MsgId = xml.SelectSingleNode("xml").SelectSingleNode("MsgId").InnerText;
//wx.Title = xml.SelectSingleNode("xml").SelectSingleNode("Title").InnerText;
wx.AppId = xml.SelectSingleNode("xml").SelectSingleNode("AppId").InnerText;
wx.PagePath = xml.SelectSingleNode("xml").SelectSingleNode("PagePath").InnerText;
}
}
}
catch (Exception ex)
{
Plugin.LogHelper.Write(ex);
Plugin.LogHelper.Write(ex, "我是解析方法GetWxMessage:");
}
return wx;
}
......
......@@ -11,6 +11,7 @@ using Mall.Common;
using Mall.Common.API;
using Mall.Common.Plugin;
using Mall.Module.User;
using Mall.Repository.TradePavilion;
namespace Mall.Module.Education
{
......@@ -36,6 +37,8 @@ namespace Mall.Module.Education
#region 用户基本信息
public Model.Entity.User.RB_Member_User GetUserEntity(int UserId)
{
......@@ -1120,5 +1123,8 @@ namespace Mall.Module.Education
}
#endregion
}
}
......@@ -2,22 +2,28 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
using System.Xml;
using Google.Protobuf.WellKnownTypes;
using Mall.CacheManager.AppletWeChat;
using Mall.Common;
using Mall.Common.API;
using Mall.Common.Pay.WeChatPat;
using Mall.Common.Plugin;
using Mall.Model.Extend.User;
using Mall.Module.User;
using Mall.WebApi.Filter;
using Mall.WeChat.Common;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MongoDB.Libmongocrypt;
using Newtonsoft.Json.Linq;
using Org.BouncyCastle.Crypto.Generators;
using RabbitMQ.Client.Framing.Impl;
namespace Mall.WebApi.Controllers.AppletWeChat
{
......@@ -34,6 +40,7 @@ namespace Mall.WebApi.Controllers.AppletWeChat
private readonly Module.MarketingCenter.RechargeModule rechargeModule = new Module.MarketingCenter.RechargeModule();
private readonly Module.MarketingCenter.CouponModule couponModule = new Module.MarketingCenter.CouponModule();
private readonly Module.Education.PointModule pointModule = new Module.Education.PointModule();
private readonly Module.TradePavilion.BuildingCarrierModule buildingCarrierModule = new Module.TradePavilion.BuildingCarrierModule();
private readonly Module.Education.ActivityModule activityModule = new Module.Education.ActivityModule();
private readonly IHttpContextAccessor _accessor;
......@@ -539,9 +546,8 @@ namespace Mall.WebApi.Controllers.AppletWeChat
/// <returns></returns>
[HttpPost]
[HttpGet]
public string EventMessageCall(int MallBaseId,int TenantId)
public string EventMessageCall(int MallBaseId, int TenantId)
{
LogHelper.WriteInfo("EventMessageCall_进入方法....");
string timestamp = "";
string nonce = "";
string echostr = "";
......@@ -604,21 +610,12 @@ namespace Mall.WebApi.Controllers.AppletWeChat
LogHelper.WriteInfo("openid:" + ex.Message);
}
LogHelper.WriteInfo($"我进来了参数如下[MallBaseId:" + MallBaseId+ "," +
"TenantId:"+ TenantId + ",signature:" + signature + ",echostr:" + echostr + ",timestamp:" + timestamp + ",nonce:" + nonce + ",openid:" + openid + ",encrypt_type:" + encrypt_type + ",msg_signature:" + msg_signature );
LogHelper.WriteInfo($"我进来了参数如下[MallBaseId:" + MallBaseId + "," +
"TenantId:" + TenantId + ",signature:" + signature + ",echostr:" + echostr + ",timestamp:" + timestamp + ",nonce:" + nonce + ",openid:" + openid + ",encrypt_type:" + encrypt_type + ",msg_signature:" + msg_signature);
var req = new RequestHandler();
try
{
int qrCodeType = 0;
int userId = 0;
string textpl = "";
string content = "你好!";
string sToken = "f87f2b2a8c474c06908b5c937068b506";
string sAppID = "wxaeb077c07ed6f30d";
string sEncodingAESKey = "9FgR0wMXxe6wXBB5hwgpn2mZM6sQMi3E3Vk5sxrXEAL";
var request = _accessor.HttpContext.Request;
LogHelper.WriteInfo("我是回调方法:EventMessageCall" + "请求方式:" + request.Method);
if (request.Method == "GET")
{
try
......@@ -628,30 +625,110 @@ namespace Mall.WebApi.Controllers.AppletWeChat
catch (Exception ex)
{
echostr = "";
LogHelper.WriteInfo("echostr:::"+ ex.Message);
LogHelper.WriteInfo("echostr:::" + ex.Message);
}
return echostr ?? "echostr is null";
}
// var str = new StreamReader(HttpContext.Request.);
else
{
var str = new StreamReader(request.Body);
string postStr = str.ReadToEnd();
LogHelper.WriteInfo("我是返回信息:" + postStr);
lock (_lock)
{
if (!string.IsNullOrWhiteSpace(postStr))
{
WechatMessage wx = WXBizMsgCrypt.GetWxMessage(postStr, timestamp, nonce, signature, encrypt_type, msg_signature, openid);
if (!string.IsNullOrWhiteSpace(wx.MsgType))// 用户未关注时,进行关注后的事件推送;事件KEY值,qrscene_为前缀,后面为二维码的参数值
if (!string.IsNullOrWhiteSpace(wx.PagePath) && wx.MsgType == "miniprogrampage")// 卡片消息发送联系人信息
{
textpl = ReceivedText(wx.FromUserName, wx.ToUserName, content);
if (encrypt_type.ToLower() == "aes".ToLower())//加密模式需要先解密
var parameters = GetQueryParameters(wx.PagePath);
int id = 0;
if (parameters != null && parameters.Any())
{
foreach (System.Text.RegularExpressions.Match m in parameters)
{
var ret = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID);
int r = ret.EncryptMsg(textpl, timestamp, nonce, ref textpl);
if (r != 0)
if (m.Result("$2").Equals("id"))
{
LogHelper.WriteInfo("GetWxMessage_消息加密失败:");
textpl = "";
try
{
id = Convert.ToInt32(m.Result("$3"));
}
catch (Exception ex)
{
id = 0;
}
}
}
}
if (id > 0)
{
bool sendMsg = false;
string contactName = "";
string contactPhone = "";
if (wx.PagePath.Contains("pages/kotra/carrier/detail_building"))//楼宇
{
var model = buildingCarrierModule.GetBuildingInfoModule(id);
contactName = model?.ContactName??"";
contactPhone = model?.ContactPhone??"";
sendMsg = true;
}
else if (wx.PagePath.Contains("pages/kotra/carrier/detail_carrier"))//载体
{
var model = buildingCarrierModule.GetBuildingCarrierModule(id);
contactName = model?.ContactName ?? "";
contactPhone = model?.ContactPhone ?? "";
sendMsg = true;
}
else if (wx.PagePath.Contains("pages/kotra/brand/detail_brand"))//品牌
{
var model = buildingCarrierModule.GetBrandEnterpriseModule(id);
contactName = model?.ContactName ?? "";
contactPhone = model?.ContactPhone ?? "";
sendMsg = true;
}
else if (wx.PagePath.Contains("pages/kotra/brand/detail_company"))//企业
{
var model = buildingCarrierModule.GetEnterpriseServicesInfoModule(id);
contactName = model?.ContactName ?? "";
contactPhone = model?.ContactPhone ?? "";
sendMsg = true;
}
if (sendMsg)
{
RB_MiniProgram_Extend modelMiniProgram = new RB_MiniProgram_Extend();
modelMiniProgram = activityModule.GetMiniProgramExtend(MallBaseId);
string token = WeiXinReidsCache.Get(modelMiniProgram.MiniAppId);
if (string.IsNullOrEmpty(token))
{
token = Mall.Common.Pay.WeChatPat.TokenHelper.GetLXYToken(token, modelMiniProgram.MiniAppId, modelMiniProgram.MiniAppSecret);
System.Threading.Tasks.Task.Run(() => WeiXinReidsCache.Set(modelMiniProgram.MiniAppId, token));
}
if (string.IsNullOrEmpty(token))
{
return "";
}
string url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + token;
string contetnStr = "";
if (string.IsNullOrWhiteSpace(contactName) && String.IsNullOrWhiteSpace(contactPhone))
{
contetnStr = "暂无相关主体联系人信息";
}
else
{
contetnStr = "联系人:" + contactName + "\n" + "联系电话:" + contactPhone;
}
var obj = new
{
touser = wx.FromUserName,
msgtype = "text",
text = new { content = contetnStr },
};
string result = Common.Plugin.HttpHelper.HttpPostStr(url, JsonHelper.Serialize(obj));
// LogHelper.WriteInfo("发送消息返回信息:" + result);
}
}
}
}
......@@ -665,6 +742,13 @@ namespace Mall.WebApi.Controllers.AppletWeChat
return echostr ?? "echostr is null";
}
private static MatchCollection GetQueryParameters(string url)
{
System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex(@"(^|&)?(\w+)=([^&]+)(&|$)?", System.Text.RegularExpressions.RegexOptions.Compiled);
System.Text.RegularExpressions.MatchCollection mc = re.Matches(url);
return mc;
}
/// <summary>
/// 接收消息
/// </summary>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment