/// <summary> /// 根据当前日期 判断Access_Token 是否超期 /// 如果超期返回新的Access_Token 否则返回之前的Access_Token /// </summary> public string IsExistAccess_Token() { string Token = string.Empty; WXCustomerService ws = new WXCustomerService(); //查询已存在的记录 WXAccessToken at = ws.GetQueryWXAccessToken(); Token = at.Access_token; if (at.Expires_in <= DateTime.Now) { WebClient wc = new WebClient(); wc.Encoding = Encoding.UTF8; var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", "client_credential", "wx1a4fb84b6f156f44", "2b72be8ef2978b11a34fa9ecfadf313b"); string josn_Token = wc.DownloadString(url); if (!josn_Token.Contains("errcode")) { string[] test = josn_Token.Split(','); test[0] = test[0].Replace("\"", ""); Token = test[0].Substring(14); } //修改WXAccessToken表 WXAccessToken wx = new WXAccessToken(); wx.Access_token = Token; wx.Expires_in = DateTime.Now.AddSeconds(7000); ws.UploadWXAccessToken(wx); } return(Token); }
/// <summary> /// 获取 /// </summary> /// <param name="AppID"></param> /// <param name="AppSecret"></param> /// <param name="Reflesh">是否更新缓存</param> /// <returns></returns> public static string GetToken(string AppID, string AppSecret, bool Reflesh) { string key = "access_token_" + AppID; WXAccessToken wxToken = null; if (!Reflesh) { wxToken = RedisUtil.Get <WXAccessToken>(key); if (wxToken != null && !string.IsNullOrEmpty(wxToken.access_token)) { return(wxToken.access_token); } } string req_url = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={AppID}&secret={AppSecret}"; string result = HttpHelper.GetData(req_url, 5000); if (string.IsNullOrEmpty(result)) { return(string.Empty); } wxToken = JsonConvert.DeserializeObject <WXAccessToken>(result); if (wxToken.errcode == 0 && !string.IsNullOrEmpty(wxToken.access_token)) { RedisUtil.Set(key, wxToken, TimeSpan.FromMinutes(60)); return(wxToken.access_token); } else { log4net.LogHelper.WriteInfo(typeof(WxHelper), "GetToken失败result: " + result); return(string.Empty); } }
/// <summary> /// 获取凭证(首先判断数据库是否存在凭证以及是否过期,如过期,重新获取) /// </summary> /// <returns></returns> public WXAccessToken GetAccessToken(int comid, string AppId, string AppSecret) { try { DateTime fitcreatetime = DateTime.Now.AddHours(-2); WXAccessToken token = new WXAccessTokenData().GetLaststWXAccessToken(fitcreatetime, comid); if (token == null) { string geturl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + AppId + "&secret=" + AppSecret; string jsonText = new GetUrlData().HttpGet(geturl); XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode("{\"root\":" + jsonText + "}"); XmlElement rootElement = doc.DocumentElement; string access_token = rootElement.SelectSingleNode("access_token").InnerText; //把获取到的凭证录入数据库中 token = new WXAccessToken() { Id = 0, ACCESS_TOKEN = access_token, CreateDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), Comid = comid }; int edittoken = new WXAccessTokenData().EditAccessToken(token); } return(token); } catch { return(null); } }
/// <summary> /// 获取AccessToken /// </summary> private static string GetAccessToken() { var appId = BLLConfig.Get("wx_appid"); var appSecret = BLLConfig.Get("wx_appsecret"); var accessToken = BLLConfig.Get("wx_access_token"); var accessTokenExpire = BLLConfig.Get("wx_access_token_expire"); if ((!string.IsNullOrEmpty(accessTokenExpire)) && (!string.IsNullOrEmpty(accessToken)) && DateTime.Now < DateTime.Parse(accessTokenExpire)) { return(accessToken); } string parm = string.Format("grant_type=client_credential&appid={0}&secret={1}", appId, appSecret); string result = RequestUtil.Get("https://api.weixin.qq.com/cgi-bin/token?" + parm); WXAccessToken wxAccessToken = JSONHelper.JsonToObject <WXAccessToken>(result); if (wxAccessToken.errcode != 0) { return(string.Empty); } using (Entities db = new Entities()) { db.ht_sys_config.FirstOrDefault(p => p.xkey == "wx_access_token").xvalue = wxAccessToken.access_token; db.ht_sys_config.FirstOrDefault(p => p.xkey == "wx_access_token_expire").xvalue = DateTime.Now.AddSeconds(wxAccessToken.expires_in - 60).ToString(); if (db.SaveChanges() > 0) { } else { } } return(wxAccessToken.access_token); }
/// <summary> /// 更新最新AccessToken /// </summary> public void UploadWXAccessToken(WXAccessToken wx) { DbParam[] dbParams = new DbParam[] { new DbParam("@Access_token", DbType.String, wx.Access_token, ParameterDirection.Input), new DbParam("@Expires_in", DbType.String, wx.Expires_in.ToString(), ParameterDirection.Input), }; base.ExecuteNoQueryBySqlString("update WXAccessToken set Access_token=@Access_token,Expires_in=@Expires_in", dbParams); //return dbParams[1].Value.ObjectToInt32(); }
internal int EditAccessToken(WXAccessToken accesstoken) { string sql = "INSERT INTO [EtownDB].[dbo].[WXAccessToken]([ACCESS_TOKEN],[createdate],[comid])VALUES('" + accesstoken.ACCESS_TOKEN + "','" + accesstoken.CreateDate + "'," + accesstoken.Comid + ")"; if (accesstoken.Id > 0) { sql = "UPDATE [EtownDB].[dbo].[WXAccessToken] SET [ACCESS_TOKEN] = '" + accesstoken.ACCESS_TOKEN + "',[createdate] = '" + accesstoken.CreateDate + "',comid=" + accesstoken.Comid + " WHERE id=" + accesstoken.Id; } var cmd = sqlHelper.PrepareTextSqlCommand(sql); return((int)cmd.ExecuteNonQuery()); }
protected void Button1_Click(object sender, EventArgs e) { initJavascript(); //根据公司id得到开发者凭据 WeiXinBasic basicc = new WeiXinBasicData().GetWxBasicByComId(comid); if (basicc != null) { //获取凭证(首先判断数据库是否存在凭证以及是否过期,如过期,重新获取) WXAccessToken token = GetAccessToken(comid, basicc.AppId, basicc.AppSecret); //获得以前总共抓取关注者列表的次数 int MaxOtainNo = new ObtainGzListLogData().GetMaxObtainNo(comid); //计算需要向微信端发送请求次数 int weixintotal = AskWeixinTotal(token.ACCESS_TOKEN);//获得关注微信用户总数目 if (weixintotal == 0) { Literal1.Text = "获得关注微信用户总数目出错"; return; } int askno = int.Parse(Math.Ceiling((double)weixintotal / (double)10000).ToString()); for (int i = 0; i < askno; i++) { if (i == 0)//第一次请求,发送无参数next_openid { AskWeixin(token.ACCESS_TOKEN, "", MaxOtainNo + 1); } else //第一次以后请求,发送带参数next_openid { string next_openid = new ObtainGzListLogData().GetNextOpenId(comid, MaxOtainNo + 1); if (next_openid != "") { AskWeixin(token.ACCESS_TOKEN, next_openid, MaxOtainNo + 1); } } } //BindGrid(comid, MaxOtainNo + 1); UnloadJavascript(); Literal1.Text = "共获取微信关注用户数量:" + weixintotal; } else { UnloadJavascript(); Literal1.Text = "公司开发者凭据获取有误"; } }
public int EditAccessToken(WXAccessToken accesstoken) { using (var sql = new SqlHelper()) { try { var internalData = new InternalWXAccessToken(sql); int result = internalData.EditAccessToken(accesstoken); return(result); } catch { throw; } } }
public WXAccessToken GetLaststWXAccessToken(DateTime fitcreatetime, int comid) { using (var sql = new SqlHelper()) { try { var internalData = new InternalWXAccessToken(sql); WXAccessToken result = internalData.GetLaststWXAccessToken(fitcreatetime, comid); return(result); } catch { throw; } } }
//获取微信全局Token protected void btngGetToken_Click(object sender, EventArgs e) { try { string strSQL = " SELECT Access_Token, LastReqDate FROM dbo.WeiXinToken WHERE AppId=@AppId"; DynamicParameters dyParams = new DynamicParameters(); dyParams.Add("@AppId", GlobalUtils.AppId); WXAccessToken wxToken = PublicConn.QueryActivitySingle <WXAccessToken>(strSQL, ref dyParams); if (wxToken != null) { strAccessToken = wxToken.Access_Token + "<br/>" + wxToken.LastReqDate; } } catch (Exception ex) { Tool.JavaScript.Alert(ex.Message); } }
/// <summary> /// 更新最新AccessToken /// </summary> /// <param name="wx"></param> public void UploadWXAccessToken(WXAccessToken wx) { (new WXCustomerAccessor()).UploadWXAccessToken(wx); }
//给客户发送顾问的信息 public static void Sendweixinchient(string openid, int comid) { WeiXinBasic basic = new WeiXinBasicData().GetWxBasicByComId(comid); string company = ""; string channelname = ""; string name = ""; WxMessageLogData messagelogdata = new WxMessageLogData(); //var messageinfo = messagelogdata.GetWxMessageLogSendTime(comid, openid);//查询2小时内是否给渠道发送过消息 //if (messageinfo == 0) //{ //会员 MemberCardData carddata = new MemberCardData(); var userdata = new B2bCrmData(); var userinfo = userdata.GetB2bCrm(openid, comid); if (userinfo != null) { name = userinfo.Name; } var cardinfo = carddata.GetMemberCardByOpenId(openid); if (cardinfo != null) { //获取渠道 var channeldata = new MemberChannelData(); var channelinfo = channeldata.GetChannelDetail(int.Parse(cardinfo.IssueCard.ToString())); if (channelinfo != null) { channelname = channelinfo.Name; //渠道名称 if (channelinfo.Companyid == 0) //内部渠道 { B2bCompanyData comdata = new B2bCompanyData(); var cominfo = comdata.GetCompanyBasicById(comid); if (cominfo != null) { company = cominfo.Com_name; } } else { //外部合作单位,调取合作单位名称 var channelcompanydata = new MemberChannelcompanyData(); var channelcominfo = channelcompanydata.GetChannelCompany(channelinfo.Companyid.ToString()); if (channelcominfo != null) { company = channelcominfo.Companyname; } } } } if (channelname != "" && channelname != "默认渠道" && channelname != "微信注册" && channelname != "网站注册") { //微信客服 文本消息 string data = SendWxMsg(comid, openid, 1, "", name + "你好,我是您的服务顾问" + company + "的 " + channelname + " ,\n请直接在微信上给我语音或文字留言,我会在手机微信上看到留言并很快回复。您不信? 现在就试试…", "", basic.Weixinno); //微信模板消息 new Weixin_tmplmsgManage().WxTmplMsg_SubscribeActReward(comid, openid, name + "你好,我是您的服务顾问" + company + "的 " + channelname + " , \\n请直接在微信上给我语音或文字留言,我会在手机微信上看到留言并很快回复。您不信? 现在就试试…\\n", "向《我的服务顾问:" + channelname + "》微信咨询", DateTime.Now.ToString(), ""); WxMessageLog messagelog = new WxMessageLog(); messagelog.Comid = comid; messagelog.Weixin = openid; var messageedit = messagelogdata.EditWxMessageLog(messagelog);//插入日志 //顾问录入的 问候语音 int isreplymediasuc = 0;//发送语音消息状态:0失败;1成功 WXAccessToken m_accesstoken = WeiXinManage.GetAccessToken(basic.Comid, basic.AppId, basic.AppSecret); //根据用户微信得到其顾问微信,然后根据微信和标记得到最新的一条保存路径(注:已经上传过语音的即mediaid!="") Wxmedia_updownlog udlog = new Wxmedia_updownlogData().GetWxmedia_updownlog(openid, (int)Clientuptypemark.DownGreetVoice, basic.Comid); if (udlog == null) { isreplymediasuc = 0; } else { string media_id = new WxUploadDownManage().UploadMultimedia(m_accesstoken.ACCESS_TOKEN, "voice", udlog.savepath); if (media_id != "") { Wxmedia_updownlog uplog = new Wxmedia_updownlog { id = 0, mediaid = media_id, mediatype = "voice", savepath = udlog.savepath, created_at = ConvertDateTimeInt(DateTime.Now).ToString(), createtime = DateTime.Now, opertype = "up", operweixin = openid, clientuptypemark = (int)Clientuptypemark.DownGreetVoice,//上传多媒体信息 comid = basic.Comid, relativepath = udlog.relativepath, txtcontent = "", isfinish = 1 }; int uplogresult = new Wxmedia_updownlogData().Edituploadlog(uplog); if (uplogresult == 0) { isreplymediasuc = 0; } else { //resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[voice]]></MsgType><Voice><MediaId><![CDATA[" + media_id + "]]></MediaId></Voice></xml>"; isreplymediasuc = 1; SendWxMsg(comid, openid, 2, "", "", media_id, basic.Weixinno); } } else { isreplymediasuc = 0; } } ////如果发送语音失败,则发送客服消息 //if (isreplymediasuc == 0) //{ //} } //} }
public static string SendWxMsg(int comid, string tousername, int type, string img, string txt, string mediaid, string fromusername) { //B2b_company_manageuser manageuser = UserHelper.CurrentUser();//客服信息(账户表B2b_company_manageuser) B2b_crm crm = new B2bCrmData().GetB2bCrmByWeiXin(tousername); if (crm == null) { return(JsonConvert.SerializeObject(new { type = 1, msg = "发送客服消息失败" })); } //else //{ // if (crm.Whetherwxfocus == false) // { // return JsonConvert.SerializeObject(new { type = 1, msg = "微信用户已经取消了关注" }); // } //} WeiXinBasic basicc = new WeiXinBasicData().GetWxBasicByComId(comid); if (basicc != null) { //获取凭证(首先判断数据库是否存在凭证以及是否过期,如过期,重新获取) WXAccessToken token = WeiXinManage.GetAccessToken(comid, basicc.AppId, basicc.AppSecret); //发送文本信息 string err = "";//返回错误原因 string createmenuurl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + token.ACCESS_TOKEN; string createmenutext1 = ""; //微信菜单内容 if (type == 1) //文本 { createmenutext1 = "{\"touser\":\"" + tousername + "\", \"msgtype\":\"text\",\"text\":{\"content\":\"" + txt + "\"}}"; } if (type == 2)//语音 { if (mediaid != "") { createmenutext1 = "{\"touser\":\"" + tousername + "\", \"msgtype\":\"voice\",\"voice\":{\"media_id\":\"" + mediaid + "\"}}"; } else { return(JsonConvert.SerializeObject(new { type = 1, msg = "语音mediaid不可为空" })); } } if (type == 3)//图片 { if (mediaid != "") { createmenutext1 = "{\"touser\":\"" + tousername + "\", \"msgtype\":\"image\",\"image\":{\"media_id\":\"" + mediaid + "\"}}"; } else { return(JsonConvert.SerializeObject(new { type = 1, msg = "图片mediaid不可为空" })); } } if (err.Length > 0) { return(JsonConvert.SerializeObject(new { type = 1, msg = err })); } else { string createmenuutret = new GetUrlData().HttpPost(createmenuurl, createmenutext1); XmlDocument createselfmenudoc = (XmlDocument)JsonConvert.DeserializeXmlNode("{\"root\":" + createmenuutret + "}"); XmlElement createselfmenurootElement = createselfmenudoc.DocumentElement; string createerrcode = createselfmenurootElement.SelectSingleNode("errcode").InnerText; if (createerrcode != "0") { //短信提示 ,查询会员账户,并检测是否今天发送过短信,如果发送过就不发送了,每天发送一次 var crmdata = new B2bCrmData(); var crminfo = crmdata.b2b_crmH5(tousername, comid); if (crminfo != null) { if (crminfo.Phone != "") { var smstixing = new WxRequestXmlData().GetWxErr_sms_SendMsgList(comid, crminfo.Phone); if (smstixing == 0) { var smstixinginsert = new WxRequestXmlData().InsertWxErr_sms_SendMsgList(comid, crminfo.Phone); if (smstixinginsert != 0) { var cominfo = B2bCompanyData.GetCompany(comid); string comname = ""; string weixincom = ""; if (cominfo != null) { comname = cominfo.Com_name; weixincom = cominfo.B2bcompanyinfo.Weixinname; } ////发送短信 //var smsmsg = ""; //var smssendback = SendSmsHelper.SendSms(crminfo.Phone, "有一条给您发送微信消息接收失败 请关注" + comname + "微信账户: " + weixincom + " ,输入“我的消息”获取消息内容!", comid, out smsmsg); } } } } //发送客服信息,信息内容录入数据库 if (type == 1)//文本 { RequestXML retRequestXML = new RequestXML(); retRequestXML.PostStr = createmenutext1; retRequestXML.ToUserName = tousername; //retRequestXML.FromUserName = new WeiXinBasicData().GetWxBasicByComId(comid).Weixinno.ConvertTo<string>(""); retRequestXML.FromUserName = fromusername; retRequestXML.CreateTime = ConvertDateTimeInt(DateTime.Now).ToString(); retRequestXML.MsgType = "text"; retRequestXML.Content = txt; retRequestXML.contentType = false; retRequestXML.Comid = comid; retRequestXML.Sendstate = 0;//发送状态为 未发送 int inswxexchangemsg = new WxRequestXmlData().EditWxRequestXmlLog(retRequestXML); } //发送客服信息,信息内容录入数据库 if (type == 2)//语音 { RequestXML retRequestXML = new RequestXML(); retRequestXML.PostStr = createmenutext1; retRequestXML.ToUserName = tousername; //retRequestXML.FromUserName = new WeiXinBasicData().GetWxBasicByComId(comid).Weixinno.ConvertTo<string>(""); retRequestXML.FromUserName = fromusername; retRequestXML.CreateTime = ConvertDateTimeInt(DateTime.Now).ToString(); retRequestXML.MsgType = "voice"; retRequestXML.Recognition = txt; retRequestXML.contentType = false; retRequestXML.Comid = comid; retRequestXML.MediaId = mediaid; retRequestXML.Sendstate = 0;//发送状态为 未发送 int inswxexchangemsg = new WxRequestXmlData().EditWxRequestXmlLog(retRequestXML); } if (type == 3)//图片 { RequestXML retRequestXML = new RequestXML(); retRequestXML.PostStr = createmenutext1; retRequestXML.ToUserName = tousername; //retRequestXML.FromUserName = new WeiXinBasicData().GetWxBasicByComId(comid).Weixinno.ConvertTo<string>(""); retRequestXML.FromUserName = fromusername; retRequestXML.CreateTime = ConvertDateTimeInt(DateTime.Now).ToString(); retRequestXML.MsgType = "image"; retRequestXML.PicUrl = img; retRequestXML.contentType = false; retRequestXML.Comid = comid; retRequestXML.Sendstate = 0;//发送状态为 未发送 int inswxexchangemsg = new WxRequestXmlData().EditWxRequestXmlLog(retRequestXML); } return(JsonConvert.SerializeObject(new { type = 1, msg = "回复客服信息失败" + createerrcode })); } else { //发送客服信息,信息内容录入数据库 if (type == 1)//文本 { RequestXML retRequestXML = new RequestXML(); retRequestXML.PostStr = createmenutext1; retRequestXML.ToUserName = tousername; //retRequestXML.FromUserName = new WeiXinBasicData().GetWxBasicByComId(comid).Weixinno.ConvertTo<string>(""); retRequestXML.FromUserName = fromusername; retRequestXML.CreateTime = ConvertDateTimeInt(DateTime.Now).ToString(); retRequestXML.MsgType = "text"; retRequestXML.Content = txt; retRequestXML.contentType = false; retRequestXML.Comid = comid; retRequestXML.Sendstate = 1;//发送状态为 未发送 //retRequestXML.Manageuserid = manageuser.Id; //retRequestXML.Manageusername = manageuser.Accounts; int inswxexchangemsg = new WxRequestXmlData().EditWxRequestXmlLog(retRequestXML); } //发送客服信息,信息内容录入数据库 if (type == 2)//语音 { RequestXML retRequestXML = new RequestXML(); retRequestXML.PostStr = createmenutext1; retRequestXML.ToUserName = tousername; //retRequestXML.FromUserName = new WeiXinBasicData().GetWxBasicByComId(comid).Weixinno.ConvertTo<string>(""); retRequestXML.FromUserName = fromusername; retRequestXML.CreateTime = ConvertDateTimeInt(DateTime.Now).ToString(); retRequestXML.MsgType = "voice"; retRequestXML.Recognition = txt; retRequestXML.contentType = false; retRequestXML.Comid = comid; retRequestXML.MediaId = mediaid; retRequestXML.Sendstate = 1;//发送状态为 未发送 //retRequestXML.Manageuserid = manageuser.Id; //retRequestXML.Manageusername = manageuser.Accounts; int inswxexchangemsg = new WxRequestXmlData().EditWxRequestXmlLog(retRequestXML); } if (type == 3)//图片 { RequestXML retRequestXML = new RequestXML(); retRequestXML.PostStr = createmenutext1; retRequestXML.ToUserName = tousername; //retRequestXML.FromUserName = new WeiXinBasicData().GetWxBasicByComId(comid).Weixinno.ConvertTo<string>(""); retRequestXML.FromUserName = fromusername; retRequestXML.CreateTime = ConvertDateTimeInt(DateTime.Now).ToString(); retRequestXML.MsgType = "image"; retRequestXML.PicUrl = img; retRequestXML.contentType = false; retRequestXML.Comid = comid; retRequestXML.Sendstate = 1;//发送状态为 未发送 //retRequestXML.Manageuserid = manageuser.Id; //retRequestXML.Manageusername = manageuser.Accounts; int inswxexchangemsg = new WxRequestXmlData().EditWxRequestXmlLog(retRequestXML); } return(JsonConvert.SerializeObject(new { type = 100, msg = "回复客服信息成功" })); } } } else { return(JsonConvert.SerializeObject(new { type = 1, msg = "" })); } }