WeChartMessage.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using PMS.Plugins.Common;
  4. using PMS.Plugins.PluginsModels;
  5. using QWPlatform.SystemLibrary.LogManager;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Configuration;
  9. namespace PMS.Plugins.WeChart
  10. {
  11. public class WeChartMessage
  12. {
  13. public static Logger Log = Logger.Instance;
  14. public static string AppID = ConfigurationManager.AppSettings["AppID"].ToStringEx();//AppID
  15. public static string AppSecret = ConfigurationManager.AppSettings["AppSecret"].ToStringEx();//AppSecret
  16. public static string IsWechatPush = ConfigurationManager.AppSettings["IsWechatPush"].ToStringEx();//是否推送消息
  17. /// <summary>
  18. /// 获取微信用户信息
  19. /// </summary>
  20. /// <param name="code"></param>
  21. /// <returns></returns>
  22. public static WeChatUserInfo WeChatUserInfo(string code)
  23. {
  24. var _weChatUserInfo = new WeChatUserInfo();
  25. try
  26. {
  27. Log.Info("获取微信用户信息【0】用户code:" + code);
  28. var access_token_url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", AppID, AppSecret, code);
  29. var openid_result = WechatHelper.InvokeMedicalWebApiMethod(access_token_url);
  30. if (openid_result != null)
  31. {
  32. JObject jResult = JObject.Parse(openid_result);
  33. Logger.Instance.Info("获取微信用户信息【1】获取SNS:" + openid_result);
  34. JObject jObjectToken = JObject.Parse(openid_result);
  35. _weChatUserInfo.wx_openid = jObjectToken["openid"].ToString();
  36. var get_userinfo = UpdateToken(_weChatUserInfo.wx_openid);
  37. var jump = false;//不用再次请求token
  38. JObject jObject = JObject.Parse(get_userinfo);
  39. try
  40. {
  41. if (jObject["errcode"].ToString() == "40001")//防止微信无缘无故失效
  42. {
  43. jump = true;
  44. }
  45. }
  46. catch (Exception ex)
  47. {
  48. _weChatUserInfo.wx_nickname = jObject["nickname"].ToString();
  49. _weChatUserInfo.sex = jObject["sex"].ToString();
  50. _weChatUserInfo.headimgurl = jObject["headimgurl"].ToString();
  51. ///正常返回会在里面抛出异常
  52. }
  53. if (jump)//重新获取token,并获取信息
  54. {
  55. get_userinfo = UpdateToken(_weChatUserInfo.wx_openid);
  56. jObject = JObject.Parse(get_userinfo);
  57. }
  58. if (jObject["subscribe"].ToString() == "0")//未关注公众号
  59. {
  60. _weChatUserInfo.NoAttention = 0;
  61. }
  62. }
  63. }
  64. catch (Exception ex)
  65. {
  66. Logger.Instance.Error("可能未关注公众号+获取微信用户信息异常:", ex);
  67. _weChatUserInfo.NoAttention = 0;
  68. }
  69. return _weChatUserInfo;
  70. }
  71. /// <summary>
  72. /// 根据openid获取用户信息
  73. /// </summary>
  74. /// <param name="wx_openid"></param>
  75. /// <returns></returns>
  76. public static dynamic UpdateToken(string wx_openid)
  77. {
  78. var wx_access_token = WechatHelper.GetAccessToken(AppID, AppSecret);
  79. var access_token_url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", wx_access_token.access_token, wx_openid);
  80. var get_userinfo = WechatHelper.InvokeMedicalWebApiMethod(access_token_url);//使用openid access_token 获取用户的信息[4]
  81. return get_userinfo;
  82. }
  83. /// <summary>
  84. /// 发送微信消息
  85. /// </summary>
  86. /// <param name="notification"></param>
  87. /// <returns></returns>
  88. public static string SendWeChartTempletMessge(WxMessgPush wxMessgPush)
  89. {
  90. string strReturn = string.Empty;
  91. if(IsWechatPush=="0")
  92. {
  93. return "推送关闭";
  94. }
  95. try
  96. {
  97. var cacheData = WechatHelper.GetAccessToken(AppID, AppSecret);
  98. var wx_access_token = cacheData.access_token;
  99. //ar wx_access_token = "59_2K4nWDN2YxJKvllR120Bm-Hk70c8WNtbCdTJ78ymQyfjML_83RX35OwcQnedfIIs5ZKlKXWSwXh17_Nc7kxKCk9peN5RuFuWWFpSBL2-XHZ_ErUmN_d_oA8eOyYO6G2MlNTFtJRgTHkqYbTFKPPjAJAAFF";
  100. string url = @"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + wx_access_token;
  101. string temp = "{\"touser\": \"" + wxMessgPush.wx_openid + "\"," +
  102. "\"url\": \"" + wxMessgPush.url + "\", " +
  103. "\"template_id\": \"" + wxMessgPush.template_id + "\", " +
  104. "\"topcolor\": \"#FF0000\", " +
  105. "\"data\": " + wxMessgPush.data + "}";
  106. //核心代码
  107. var state = WechatHelper.GetResponseData(temp, @url, "text/json");
  108. Log.Info("微信公众号准备第一次推送消息【1】:" + url + "\r\n\r\n" + "参数:" + temp + "\r\n\r\n" + "返回结果:" + state);
  109. JObject jObject = JObject.Parse(state);
  110. var jump = false;//不用再次请求token
  111. try
  112. {
  113. if (jObject["errcode"].ToString() == "40001")//防止微信无缘无故失效
  114. {
  115. jump = true;
  116. }
  117. }
  118. catch (Exception ex)
  119. {
  120. ///正常返回会在里面抛出异常
  121. }
  122. if (jump)//重新获取token,并获取信息
  123. {
  124. WxTickectInfo wx = new WxTickectInfo();
  125. HashtableHelper.AddCacheIitems("GetAccessToken", wx);//当前时间加上7100秒
  126. cacheData = WechatHelper.GetAccessToken(AppID, AppSecret);
  127. wx_access_token = cacheData.access_token;
  128. url = @"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + wx_access_token;
  129. state = WechatHelper.GetResponseData(temp, @url, "text/json");
  130. Log.Info("微信公众号准备第二次推送消息【2】:" + @url + "\r\n\r\n" + "参数:" + temp + "\r\n\r\n" + "返回结果:" + state);
  131. }
  132. strReturn = "推送成功";
  133. }
  134. catch (Exception ex)
  135. {
  136. strReturn = ex.Message;
  137. }
  138. return strReturn;
  139. }
  140. }
  141. }