Received.aspx.cs 20 KB

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