Received.aspx.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. using LYFZ.Weixin.SDK;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using LYFZ.WXLibrary;
  10. namespace LYFZ.WeixinServers.WeiXinAPP
  11. {
  12. public partial class Received : System.Web.UI.Page
  13. {
  14. string postinfoddomaine = "recurl";
  15. protected void Page_Load(object sender, EventArgs e)
  16. {
  17. if (Request.RequestType == "POST")
  18. {
  19. try
  20. {
  21. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收URL 收到 POST请求-\r\nUrl:" + this.Request.Url + "\r\nRawUrl:" + this.Request.RawUrl, postinfoddomaine, Global.LogsDongleDomainList);
  22. //接收并读取POST过来的XML文件流
  23. string xmlData = "";
  24. try
  25. {
  26. Request.InputStream.Seek(0, SeekOrigin.Begin);//强制调整指针位置
  27. using (var streamReader = new StreamReader(Request.InputStream))
  28. {
  29. var decryptMsg = string.Empty;
  30. xmlData = streamReader.ReadToEnd();
  31. System.Diagnostics.Debug.Write( xmlData, "加密的微信消息:");
  32. }
  33. }
  34. catch (Exception ex)
  35. {
  36. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收URL POST 求请加密解密时出错:" + ex.Message, postinfoddomaine, Global.LogsDongleDomainList);
  37. }
  38. //把数据重新返回给客户端
  39. string sToken = OpenPlatformConfig.OpenToken;
  40. string sAppID = OpenPlatformConfig.OpenAppID;
  41. string sEncodingAESKey = OpenPlatformConfig.OpenEncodingAESKey;
  42. //string sAppSecret = "29258df7112c9b170a680f5b598182e5";
  43. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收URL 开始解密信息:sToken=" + sToken + " sAppID=" + sAppID + " sEncodingAESKey=" + sEncodingAESKey + "xmlData=" + xmlData, postinfoddomaine, Global.LogsDongleDomainList);
  44. Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID);
  45. string sReqMsgSig = Request["msg_signature"];
  46. string sReqTimeStamp = Request["timestamp"];
  47. string sReqNonce = Request["nonce"];
  48. string sMsg = ""; //解析之后的明文
  49. int ret = 0;
  50. ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, xmlData, ref sMsg);
  51. if (ret != 0)
  52. {
  53. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收URL POST 求请加密解密时失败 RET:" + ret, postinfoddomaine, Global.LogsDongleDomainList);
  54. }
  55. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收URL 收到的信息:" + sMsg, postinfoddomaine, Global.LogsDongleDomainList);
  56. System.Diagnostics.Debug.Write(xmlData, "解密后的微信消息:");
  57. var msg = new WeixinMessage();
  58. msg.Body = new DynamicXml(sMsg);
  59. /* msg.Body = new DynamicXml("<xml>"
  60. + "<AppId>"
  61. + "<![CDATA[wx34b5f92cdbb24fe4]]>"
  62. + "</AppId>"
  63. + "<CreateTime>1436066428</CreateTime>"
  64. + "<InfoType>"
  65. + "<![CDATA[component_verify_ticket]]>"
  66. + "</InfoType>"
  67. + "<ComponentVerifyTicket>"
  68. + "<![CDATA[ticket@@@SfS2Ck4oxPhL0LRSJH5v9Pr68vjeDfWWPx9SzIWzm6PeKGeEoszohQ-5-EBm4RajI7AKlzIz1Kj1ghPg0t199w]]>"
  69. + "</ComponentVerifyTicket>"
  70. + "</xml>");*/
  71. string infoType = msg.Body.InfoType.Value;
  72. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收URL infoType:" + infoType, postinfoddomaine, Global.LogsDongleDomainList);
  73. switch (infoType)
  74. {
  75. case "component_verify_ticket":
  76. //这里就是component_verify_ticket的值,保存起来就可以了,处理完成后在页面上输出success,通知微信服务器已经接收到ticket
  77. string component_verify_ticket = msg.Body.ComponentVerifyTicket.Value;
  78. OpenPlatformConfig.Component_verify_ticket = component_verify_ticket;
  79. OpenPlatformConfig.SaveComponent_verify_ticket(component_verify_ticket);
  80. break;
  81. case "unauthorized":
  82. //当用户取消授权的时候,微信服务器也会向这个页面发送信息,在这里做一下记录
  83. /*<xml>
  84. <AppId>第三方平台appid</AppId>
  85. <CreateTime>1413192760</CreateTime>
  86. <InfoType>unauthorized</InfoType>
  87. <AuthorizerAppid>公众号appid</AuthorizerAppid>
  88. </xml>*/
  89. AuthorizationInfo unauthorizedInfo = new AuthorizationInfo();
  90. unauthorizedInfo.AppId = msg.Body.AppId.Value;
  91. unauthorizedInfo.CreateTime = msg.Body.CreateTime.Value;
  92. unauthorizedInfo.InfoType = AuthorizationInfoType.unauthorized;
  93. unauthorizedInfo.AuthorizerAppid = msg.Body.AuthorizerAppid.Value;
  94. PerformAuthorization(unauthorizedInfo, 0);
  95. break;
  96. case "authorized":
  97. //授权成功通知
  98. /*
  99. <xml>
  100. <AppId>第三方平台appid</AppId>
  101. <CreateTime>1413192760</CreateTime>
  102. <InfoType>authorized</InfoType>
  103. <AuthorizerAppid>公众号appid</AuthorizerAppid>
  104. <AuthorizationCode>授权码(code)</AuthorizationCode>
  105. <AuthorizationCodeExpiredTime>过期时间</AuthorizationCodeExpiredTime>
  106. </xml>*/
  107. AuthorizationInfo authorizedInfo = new AuthorizationInfo();
  108. authorizedInfo.AppId = msg.Body.AppId.Value;
  109. authorizedInfo.CreateTime = msg.Body.CreateTime.Value;
  110. authorizedInfo.InfoType = AuthorizationInfoType.authorized;
  111. authorizedInfo.AuthorizerAppid = msg.Body.AuthorizerAppid.Value;
  112. authorizedInfo.AuthorizationCode = msg.Body.AuthorizationCode.Value;
  113. authorizedInfo.AuthorizationCodeExpiredTime = LYFZ.WinAPI.CustomPublicMethod.StampToDateTime(msg.Body.AuthorizationCodeExpiredTime.Value);
  114. PerformAuthorization(authorizedInfo, 1);
  115. break;
  116. case "updateauthorized":
  117. //授权更新通知
  118. /*<xml>
  119. <AppId>第三方平台appid</AppId>
  120. <CreateTime>1413192760</CreateTime>
  121. <InfoType>updateauthorized</InfoType>
  122. <AuthorizerAppid>公众号appid</AuthorizerAppid>
  123. <AuthorizationCode>授权码(code)</AuthorizationCode>
  124. <AuthorizationCodeExpiredTime>过期时间</AuthorizationCodeExpiredTime>
  125. </xml>*/
  126. AuthorizationInfo updateauthorizedInfo = new AuthorizationInfo();
  127. updateauthorizedInfo.AppId = msg.Body.AppId.Value;
  128. updateauthorizedInfo.CreateTime = msg.Body.CreateTime.Value;
  129. updateauthorizedInfo.InfoType = AuthorizationInfoType.updateauthorized;
  130. updateauthorizedInfo.AuthorizerAppid = msg.Body.AuthorizerAppid.Value;
  131. updateauthorizedInfo.AuthorizationCode = msg.Body.AuthorizationCode.Value;
  132. updateauthorizedInfo.AuthorizationCodeExpiredTime = LYFZ.WinAPI.CustomPublicMethod.StampToDateTime(msg.Body.AuthorizationCodeExpiredTime.Value);
  133. PerformAuthorization(updateauthorizedInfo, 1);
  134. break;
  135. default:
  136. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收到未处理事件:" + infoType, postinfoddomaine, Global.LogsDongleDomainList);
  137. break;
  138. }
  139. }
  140. catch(Exception ex) {
  141. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权事件接收URL 处理信息时出错:" + ex.Message, postinfoddomaine, Global.LogsDongleDomainList);
  142. }
  143. Response.Write("success");
  144. Response.End();
  145. /*if (component_verify_ticket != "")
  146. {
  147. my_component_verify_ticket = component_verify_ticket;
  148. Dictionary<string, string> dicqq = new Dictionary<string, string>
  149. {
  150. {"component_appid",sAppID},
  151. {"component_appsecret",sAppSecret},
  152. {"component_verify_ticket",component_verify_ticket}
  153. };
  154. * string json = (new JavaScriptSerializer()).Serialize(dic);
  155. string formatmsg = "{"
  156. + "\"component_appid\":\"" + sAppID + "\" ,"
  157. + "\"component_appsecret\": \"" + sAppSecret + "\","
  158. + "\"component_verify_ticket\": \"" + component_verify_ticket + "\" "
  159. +"\"}";
  160. //获取第三方平台access_token
  161. string component_access_token = BasicAPI.GetApi_Component_Token(formatmsg).Trim();
  162. }
  163. */
  164. }
  165. else {
  166. Response.Write("最新的“component_verify_ticket”值:" + OpenPlatformConfig.Component_verify_ticket);
  167. Response.End();
  168. }
  169. }
  170. void AddAuthorizationInfo(AuthorizationInfo authInfo)
  171. {
  172. /*if (OpenPlatformConfig.AuthorizationInfoList.ContainsKey(authInfo.AuthorizerAppid))
  173. {
  174. AuthorizationInfo findAuthInfo = null;
  175. if (OpenPlatformConfig.AuthorizationInfoList.TryGetValue(authInfo.AuthorizerAppid, out findAuthInfo))
  176. {
  177. findAuthInfo.AppId = authInfo.AppId;
  178. findAuthInfo.CreateTime = authInfo.CreateTime;
  179. findAuthInfo.InfoType = authInfo.InfoType;
  180. findAuthInfo.AuthorizerAppid = authInfo.AuthorizerAppid;
  181. findAuthInfo.AuthorizationCode = authInfo.AuthorizationCode;
  182. findAuthInfo.AuthorizationCodeExpiredTime = authInfo.AuthorizationCodeExpiredTime;
  183. }
  184. else {
  185. LYFZ.WXLibrary.CommonHandleClass.WriteLog("更新已授权公众号的授权信息时失败:" + authInfo.ToString(), postinfoddomaine, Global.LogsDongleDomainList);
  186. }
  187. }
  188. else {
  189. OpenPlatformConfig.AuthorizationInfoList.Add(authInfo.AuthorizerAppid, authInfo);
  190. }*/
  191. }
  192. LYFZ.WeixinServiceDate.DAL.DAL_Authorization_info Authorization_infoDal = new WeixinServiceDate.DAL.DAL_Authorization_info();
  193. /// <summary>
  194. /// 执行授权
  195. /// </summary>
  196. /// <param name="authInfo"></param>
  197. /// <param name="_AuthorizeStatus">授权状态 1 为授权 0 为取消授权</param>
  198. void PerformAuthorization(AuthorizationInfo authInfo, int _AuthorizeStatus)
  199. {
  200. try
  201. {
  202. //授权是否成功
  203. bool AuthorizeSuccess = false;
  204. LYFZ.WeixinServiceDate.Model.Model_Authorization_info Authorization_infoModel = new LYFZ.WeixinServiceDate.Model.Model_Authorization_info();
  205. if (Authorization_infoDal.Exists("authorizer_appid", authInfo.AuthorizerAppid))
  206. {
  207. Authorization_infoModel = (LYFZ.WeixinServiceDate.Model.Model_Authorization_info)Authorization_infoDal.GetModelObject("authorizer_appid", authInfo.AuthorizerAppid);
  208. }
  209. if (_AuthorizeStatus == 1)
  210. {
  211. Dictionary<string, string> dic = new Dictionary<string, string>
  212. {
  213. {"component_appid",LYFZ.WXLibrary.OpenPlatformConfig.OpenAppID},
  214. {"authorization_code",authInfo.AuthorizationCode},
  215. };
  216. string json = (new System.Web.Script.Serialization.JavaScriptSerializer()).Serialize(dic);
  217. string retmsg = "";
  218. var Authorization_InfoObj = BasicAPI.GetAuthorization_Info(LYFZ.WXLibrary.OpenPlatformConfig.Component_Access_Token, json, out retmsg);
  219. LYFZ.WXLibrary.CommonHandleClass.WriteLog("获取授权请求返回信息:" + retmsg, "-2", Global.LogsDongleDomainList);
  220. if (Authorization_InfoObj != null)
  221. {
  222. string authorizer_appid = Authorization_InfoObj.authorization_info.authorizer_appid.ToString().Trim();
  223. LYFZ.WXLibrary.CommonHandleClass.WriteLog("成功获取授权请求信息:" + authorizer_appid, "-2", Global.LogsDongleDomainList);
  224. if (authorizer_appid.Trim().Length > 0)
  225. {
  226. Authorization_infoModel.Authorizer_appid = authorizer_appid;
  227. Authorization_infoModel.Authorization_info = Authorization_InfoObj.ToString();
  228. Authorization_infoModel.Authorizer_access_token = Authorization_InfoObj.authorization_info.authorizer_access_token;
  229. Authorization_infoModel.Expires_in = Convert.ToInt32(Authorization_InfoObj.authorization_info.expires_in);
  230. Authorization_infoModel.Authorizer_refresh_token = Authorization_InfoObj.authorization_info.authorizer_refresh_token;
  231. Authorization_infoModel.AuthorizeStatus = _AuthorizeStatus;
  232. Authorization_infoModel.UpdateTime = DateTime.Now;
  233. Authorization_infoModel.RefreshTokenTime = DateTime.Now;
  234. if (authorizer_appid.ToLower().Trim() == OpenPlatformConfig.MicroLetterTestAPPID.ToLower().Trim())
  235. {
  236. Authorization_infoModel.CompanyName = "微信后台专用测试公众号";
  237. Authorization_infoModel.JMGDomainName = OpenPlatformConfig.MicroLetterTestUsername;
  238. LYFZ.WXLibrary.CommonHandleClass.WriteLog("收到“微信后台专用测试公众号(" + OpenPlatformConfig.MicroLetterTestUsername + ")”测试授权请求", "-2", Global.LogsDongleDomainList);
  239. }
  240. if (Authorization_infoModel.ID > 0)
  241. {
  242. AuthorizeSuccess = Authorization_infoDal.Update(Authorization_infoModel);
  243. Authorization_infoModel = (LYFZ.WeixinServiceDate.Model.Model_Authorization_info)Authorization_infoDal.GetModelObject("authorizer_appid", authorizer_appid);
  244. if (AuthorizeSuccess && Authorization_infoModel != null && Authorization_infoModel.ID > 0)
  245. {
  246. Global.UpdateAuthorizedAPPIDHand(Authorization_infoModel);
  247. }
  248. }
  249. else
  250. {
  251. Authorization_infoModel.CreateTime = DateTime.Now;
  252. AuthorizeSuccess = Authorization_infoDal.Add(Authorization_infoModel);
  253. if (AuthorizeSuccess && authorizer_appid.ToLower().Trim() == OpenPlatformConfig.MicroLetterTestAPPID.ToLower().Trim())
  254. {
  255. Authorization_infoModel = (LYFZ.WeixinServiceDate.Model.Model_Authorization_info)Authorization_infoDal.GetModelObject("authorizer_appid", authorizer_appid);
  256. Global.AddAuthorizedAPPIDHand(Authorization_infoModel);
  257. Global.UpdateAuthorizationInfoDaTable(authorizer_appid, Authorization_infoModel);
  258. LYFZ.WXLibrary.CommonHandleClass.WriteLog("收到“微信后台专用测试公众号(" + OpenPlatformConfig.MicroLetterTestUsername + ")”测试授权请求", "-2", Global.LogsDongleDomainList);
  259. }
  260. }
  261. LYFZ.WXLibrary.CommonHandleClass.WriteLog("执行授权成功:authInfo.InfoType=" + authInfo.InfoType.ToString() + "&CompanyName=" + Authorization_infoModel.CompanyName + " &JMGDomainName=" + Authorization_infoModel.JMGDomainName, "-2", Global.LogsDongleDomainList);
  262. if (!AuthorizeSuccess)
  263. {
  264. LYFZ.WXLibrary.CommonHandleClass.WriteLog("授权失败,原因:更新数据库操作失败", "-2", Global.LogsDongleDomainList);
  265. }
  266. }
  267. else
  268. {
  269. LYFZ.WXLibrary.CommonHandleClass.WriteLog("获取授权失败请重试:" + Authorization_InfoObj.ToString(), "-2", Global.LogsDongleDomainList);
  270. }
  271. }
  272. else
  273. {
  274. LYFZ.WXLibrary.CommonHandleClass.WriteLog("获取授权失败,原因:" + retmsg, "-2", Global.LogsDongleDomainList);
  275. }
  276. }
  277. else {
  278. if (Authorization_infoModel!=null&&Authorization_infoModel.ID > 0)
  279. {
  280. Authorization_infoModel.RefreshTokenTime = DateTime.Now;
  281. Authorization_infoModel.AuthorizeStatus = _AuthorizeStatus;
  282. AuthorizeSuccess = Authorization_infoDal.Update(Authorization_infoModel);
  283. LYFZ.WXLibrary.CommonHandleClass.WriteLog("用户已取消授权:authInfo.InfoType=" + authInfo.InfoType.ToString() + "&CompanyName=" + Authorization_infoModel.CompanyName + " &JMGDomainName=" + Authorization_infoModel.JMGDomainName, "-2", Global.LogsDongleDomainList);
  284. }
  285. Global.RemoveAuthorizedAPPIDHand(Authorization_infoModel);
  286. }
  287. }
  288. catch (Exception ex)
  289. {
  290. LYFZ.WXLibrary.CommonHandleClass.WriteLog("解析返回授权信息时出错:" + ex.Message, "-2", Global.LogsDongleDomainList);
  291. }
  292. }
  293. }
  294. }