/// <summary> /// 接收微信支付成功通知 /// </summary> /// <param name="xmlContent">微信通知内容</param> /// <returns>通知处理结果</returns> public string WechatOrderPayNotify(string xmlContent) { string return_code = "", return_msg = ""; try { WeChatApi weChatApi = new WeChatApi(); WechatPayNotifyResponse response = weChatApi.PayNotify(xmlContent); if (response.IsSuccess) { return_code = "SUCCESS"; return_msg = "OK"; } else { return_code = "FAIL"; return_msg = "FAIL"; } } catch (Exception) { return_code = "FAIL"; return_msg = "FAIL"; } //返回通知处理结果 return string.Format("<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg); }
/// <summary> /// 调用微信统一下单 /// </summary> /// <param name="orderId">订单Id</param> /// <param name="studentId">学生Id</param> /// <param name="voucherIds">本次支付使用的优惠券Id列表</param> /// <param name="ip">用户IP</param> /// <param name="image">支付二维码图片</param> /// <param name="isFreeOrder">是否免费订单,如为0元购返回true</param> /// <returns>统一下单处理结果。</returns> public bool WechatOrderPay(int orderId, int studentId, int[] voucherIds, string ip, ref byte[] image, ref bool isFreeOrder) { decimal amount = 0; string orderNo = ""; int batchId = Service.PreOrderPay(orderId, studentId, voucherIds, CashPayTypeEnum.微信); Service.OrderPay(orderId, studentId, voucherIds, CashPayTypeEnum.微信, batchId, out amount, out orderNo); if (batchId >= 1)//如果之前已经发起过微信支付,需要关闭之前的微信支付订单。如果关闭之前订单失败,本次支付仍然继续执行。 { try { WeChatApi weChatApi = new WeChatApi(); weChatApi.CloseOrder(orderId, GetOutTradeNo(orderNo, batchId)); } catch (Exception ex) { LogHelper.ErrorLog("", ex); } } if (amount > 0 && !string.IsNullOrEmpty(orderNo)) { WechatPreOrderResponse response = new WeChatApi().CreatePreOrder(orderId, "大语文订单", GetOutTradeNo(orderNo, batchId + 1), amount, ip); image = QRCodeUtil.MakeImage(response.CodeUrl); return true; } else if (amount == 0 && !string.IsNullOrEmpty(orderNo))//如果本次不需要微信支付(课程价格是0或者使用的现金券金额>=课程金额) { Service.OrderPayOver(orderNo); isFreeOrder = true; return false; } return false; }
/// <summary> /// 获取所有关注用户(返回OpenId集合) /// </summary> /// <returns></returns> public FocusUserListModel GetFocusUserList() { var resp = WeChatApi.GetFocusUserList(); var openIds = JsonConvert.DeserializeObject <FocusUserListModel>(resp); return(openIds); }
/// <summary> /// 获取关注用户信息 /// </summary> /// <param name="userList">OpenId列表</param> /// <returns></returns> public FocusUsersModel GetFocusUsers(string userList) { var resp2 = WeChatApi.BatchGetFocusUser(JsonConvert.SerializeObject(userList)); var focusUsers = JsonConvert.DeserializeObject <FocusUsersModel>(resp2); return(focusUsers); }
/// <summary> /// 获取图文素材 /// </summary> /// <param name="pageIndex">从全部素材的该偏移位置开始返回,0表示从第一个素材 返回</param> /// <param name="pageSize">返回素材的数量,取值在1到20之间</param> /// <returns></returns> public WeChatNewsResponse GetDataList(int pageIndex, int pageSize) { var result = WeChatApi.BatchGetMaterial("news", pageIndex, pageSize); var materialList = JsonConvert.DeserializeObject <WeChatNewsResponse>(result); return(materialList); }
/// <summary> /// 添加图文素材 /// </summary> /// <param name="title">标题</param> /// <param name="thumb_media_id">图文消息的封面图片素材id(必须是永久mediaID)</param> /// <param name="author">作者</param> /// <param name="digest">图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。</param> /// <param name="show_cover_pic">是否显示封面,0为false,即不显示,1为true,即显示</param> /// <param name="content">图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。</param> /// <param name="content_source_url">图文消息的原文地址,即点击“阅读原文”后的URL</param> /// <param name="need_open_comment">Uint32 是否打开评论,0不打开,1打开</param> /// <param name="only_fans_can_comment">Uint32 是否粉丝才可评论,0所有人可评论,1粉丝才可评论</param> public string CreateData(string title, string thumb_media_id, string author, string digest, bool show_cover_pic, string content, string content_source_url, bool need_open_comment, bool only_fans_can_comment) { var postData = new { articles = new List <object>() { new { title, thumb_media_id, author, digest, show_cover_pic = show_cover_pic ? 1 : 0, content = new WeChatNewsMaterialService(Broker).ConvertLocalUrlToWeChatUrl(content), content_source_url, need_open_comment = need_open_comment ? 1 : 0, only_fans_can_comment = only_fans_can_comment ? 1: 0 } } }; var result = WeChatApi.AddNews(JsonConvert.SerializeObject(postData)); var data = new wechat_news() { wechat_newsId = result.media_id, media_id = result.media_id, author = author, html_content = content, name = title, digest = digest, thumb_media_id = thumb_media_id }; return(CreateData(data)); }
public UploadForeverMediaResult UploadMedia(Wx_App app, string mediaUrl) { if (!mediaUrl.HasValue()) { throw new AceException("上传的素材不存在!"); } return(WeChatApi.UploadForeverMedia(app.AppId, mediaUrl)); }
/// <summary> /// 删除图文素材 /// </summary> /// <param name="ids"></param> public override void DeleteData(List <string> ids) { foreach (var item in ids) { var data = Broker.Retrieve <wechat_news>(item); WeChatApi.DeleteMaterial(data.media_id); } base.DeleteData(ids); }
public HttpResponseMessage Post() { try { Stream requestStream = System.Web.HttpContext.Current.Request.InputStream; byte[] requestByte = new byte[requestStream.Length]; requestStream.Read(requestByte, 0, (int)requestStream.Length); string reqXml = Encoding.UTF8.GetString(requestByte); if (string.IsNullOrEmpty(reqXml)) return ResponseMessage("success"); var wxXmlSerialize = new WxXmlSerialize(reqXml); WxXmlModel WxXmlModel = wxXmlSerialize.GetBaseModel(); switch (WxXmlModel.MsgType) { case "text"://文本 WxXmlModel.Content = wxXmlSerialize.GetValue("Content"); var xml = WxResponseMessage.GetText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.Content); return ResponseMessage(xml); case "event"://事件 BaseEventEntity entity = new BaseEventEntity(); entity.FromUserName = WxXmlModel.FromUserName; entity.ToUserName = WxXmlModel.ToUserName; entity.CreateTime = long.Parse(WxXmlModel.CreateTime); entity.MsgType = WxXmlModel.MsgType; entity.Event = wxXmlSerialize.GetValue("Event"); entity.EventKey = wxXmlSerialize.GetValue("EventKey"); entity.Ticket = wxXmlSerialize.GetValue("Ticket"); //关注公众号 if (entity.Event == "subscribe") { WeChatUser chatUser = new WeChatUser(); chatUser.ToUserName = entity.ToUserName; chatUser.OpenID = entity.FromUserName; WeChatApi.AddWeiXinUser(chatUser); } //取消关注 else if (entity.Event == "unsubscribe") { WeChatApi.DeleteWeiXinUser(entity.FromUserName); } return ResponseMessage("success"); default: return ResponseMessage("success"); } } catch (Exception ex) { return ResponseMessage("success"); throw; } //回复消息的时候也需要验证消息,这个很多开发者没有注意这个,存在安全隐患 //微信中 谁都可以获取信息 所以 关系不大 对于普通用户 但是对于某些涉及到验证信息的开发非常有必要 //接收消息 }
private string GetWxHtml(Wx_App app, Wx_News news) { var html = new HtmlDocument(); var sysCfg = configService.GetConfig(app.Id); var content = news.Content.Replace(vars); var header = sysCfg["header_html"]; var footer = sysCfg["footer_html"]; var cover = "<p><img src=\"" + news.ThumbWxUrl + "\" /></p>"; html.LoadHtml("<div>" + header + cover + content + footer + "</div>"); var nodes = html.DocumentNode.SelectNodes("./div/p | ./div/div"); if (nodes != null) { foreach (HtmlNode item in nodes) { item.InnerHtml = item.InnerHtml.Trim(); SetStyle(item, "padding:0.25em 0"); var subImgs = item.SelectNodes(".//img"); if (subImgs == null || subImgs.Count <= 0) { var attr = item.Attributes["style"]; if (attr == null || attr.Value.IndexOf("text-align:center") < 0) { SetStyle(item, "text-indent:2em"); } } if (!item.HasChildNodes) { item.Remove(); } } } var imgs = html.DocumentNode.SelectNodes("//img"); if (imgs != null) { foreach (HtmlNode img in imgs) { var src = img.Attributes["src"].Value; var result = WeChatApi.UploadImg(app.AppId, src); if (result != null) { img.Attributes["src"].Value = result.url; } img.Attributes.Remove("width"); img.Attributes.Remove("height"); SetStyle(img, "width:100%!important;height:auto!important"); } } return(html.DocumentNode.InnerHtml); }
/// <summary> /// 获取素材 /// </summary> /// <param name="type">素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)</param> /// <param name="pageIndex">从全部素材的该偏移位置开始返回,0表示从第一个素材 返回</param> /// <param name="pageSize">返回素材的数量,取值在1到20之间</param> /// <returns></returns> public WeChatOtherMaterial GetMaterial(string type, int pageIndex, int pageSize) { var result = WeChatApi.BatchGetMaterial(type, pageIndex, pageSize); var materialList = JsonConvert.DeserializeObject <WeChatOtherMaterial>(result); if (materialList == null || materialList.item == null || materialList.item.Count <= 0) { return(materialList); } materialList.item.Each(item => { item.UpdateTime = item.update_time.ToDateTimeString(); }); return(materialList); }
private bool CheckWechatValidity(WeChatApi api) { if (!Application.isMobilePlatform) { YxMessageBox.Show("非移动设备暂时不支持分享!"); return(false); } if (!api.IsInstalledWechat()) { YxMessageBox.Show("您的设备没有安装微信,请安装后再分享!"); return(false); } if (!api.IsCheckWechatApiLevel()) { YxMessageBox.Show("您的设备上的微信版本不符合微信最低版本,\n请更新微信后再分享!"); return(false); } return(true); }
/// <summary> /// 上传素材(已上传则直接返回) /// </summary> /// <param name="type"></param> /// <param name="fileId"></param> /// <returns></returns> public WeChatSuccessUploadResponse CreateData(MaterialType type, string fileId) { var file = new SysFileService().GetData(fileId); AssertUtil.CheckBoolean <SpException>(file == null, $"根据fileid:{fileId}未找到记录", "36B5F5C9-ED65-4CAC-BE60-712278056EA9"); // 检查素材库是否已经上传 var data = Broker.Retrieve <wechat_material>("select * from wechat_material where sys_fileid = @sys_fileid", new Dictionary <string, object>() { { "@sys_fileid", file.sys_fileId } }); if (data != null) { return(new WeChatSuccessUploadResponse() { media_id = data.media_id, url = data.url }); } // 获取文件流 var config = StoreConfig.Config; var stream = ServiceContainer.Resolve <IStoreStrategy>(config?.Type).GetStream(fileId); var media = WeChatApi.AddMaterial(type, stream, file.name, file.content_type); stream.Dispose(); // 创建素材记录 var material = new wechat_material() { wechat_materialId = Guid.NewGuid().ToString(), media_id = media.media_id, url = media.url, sys_fileid = fileId, local_url = SysFileService.GetDownloadUrl(fileId), name = file.name, type = type.ToMaterialTypeString() }; CreateData(material); return(media); }
/// <summary> /// 修改图文素材 /// </summary> /// <param name="t"></param> public override void UpdateData(wechat_news t) { var model = new { media_id = t.media_id, index = 0, articles = new { title = t.name, thumb_media_id = t.thumb_media_id, author = t.author, digest = t.digest, show_cover_pic = 1, content = new WeChatNewsMaterialService(Broker).ConvertLocalUrlToWeChatUrl(t.html_content), content_source_url = "" } }; WeChatApi.UpdateNews(JsonConvert.SerializeObject(model)); base.UpdateData(t); }
public void Execute(PersistBrokerPluginContext context) { var entity = context.Entity as wechat_material; switch (context.Action) { case EntityAction.PreCreate: case EntityAction.PreUpdate: // 如果素材未上传到系统,则根据url请求图片保存 if (string.IsNullOrEmpty(entity.sys_fileid)) { var result = HttpUtil.DownloadImage(entity.url, out var contentType); var id = Guid.NewGuid().ToString(); var stream = StreamUtil.BytesToStream(result); var hash_code = SHAUtil.GetFileSHA1(stream); var config = StoreConfig.Config; ServiceContainer.Resolve<IStoreStrategy>(config?.Type).Upload(stream, entity.name, out var filePath); var sysImage = new sys_file() { sys_fileId = id, name = entity.name, real_name = entity.name, hash_code = hash_code, file_type = "wechat_material", content_type = contentType, objectId = entity.Id }; new SysFileService(context.Broker).CreateData(sysImage); entity.sys_fileid = id; entity.local_url = SysFileService.GetDownloadUrl(id); } break; case EntityAction.PreDelete: WeChatApi.DeleteMaterial(entity.GetAttributeValue<string>("media_id")); context.Broker.Delete("sys_file", entity.GetAttributeValue<string>("sys_fileid")); break; default: break; } }
/// <summary> /// 创建图文消息素材 /// </summary> /// <param name="fileid"></param> /// <returns></returns> public string CreateData(string fileid) { var file = Broker.Retrieve <sys_file>(fileid); var data = Broker.Retrieve <wechat_news_material>("SELECT * FROM wechat_news_material WHERE fileid = @id", new Dictionary <string, object>() { { "@id", fileid } }); if (data == null) { var stream = ServiceContainer.Resolve <IStoreStrategy>(StoreConfig.Config.Type).GetStream(fileid); data = new wechat_news_material() { Id = Guid.NewGuid().ToString(), fileid = fileid }; data.media_url = WeChatApi.UploadImg(stream, file.name, file.content_type)?.url; data.local_url = SysFileService.GetDownloadUrl(fileid, false); CreateData(data); } return(data.media_url); }
public ActionResult LoginByWeiXin(string code, string state = null) { string returnresultstr = string.Empty; int returncode = 0; //Func<string, string, ActionResult> error = (content, detail) => //{ // return this.ToError("错误", detail, Url.Action("Login", "Account")); //}; IConfig config = new ConfigWeChatWork(); WeChatApi wechat = new WeChatApi(config); AccessTokenResult result; CommonBll cbll = new CommonBll(); DataTable codetb = cbll.GetWxCodeCheck(code, 0); try { if (string.IsNullOrWhiteSpace(code)) { //return error("请求有误", "Code不能为空"); returnresultstr = "请求错误!"; } else if (codetb.Rows.Count <= 0) { //PlasCommon.Common.AddLog("", "开始请求access_token", "开始请求access_token", ""); cbll.AddWxCode(code, 0); //PlasCommon.Common.AddLog("", "开始请求access_token", "请求access_token结束", ""); //PlasCommon.Common.AddLog("", "开始请求access_token", "开始请求access_token", ""); result = wechat.GetAccessTokenSns(code); //PlasCommon.Common.AddLog("", "请求access_token成功", "请求access_token成功", ""); var openID = result.OpenID; if (state == "openid") { PlasCommon.Common.AddLog("", "access_token", result.AccessToken, ""); config.AccessToken = result.AccessToken; //Response.Cookies["WeChatOpenID"].Value = openID; //AccountData.WeChatOpenID = openID; //PlasCommon.Common.AddLog("", "获取用户信息开始1", "获取用户信息开始1", ""); var userInfo = wechat.GetUserInfoSns(openID); //PlasCommon.Common.AddLog("", "获取用户信息成功", "获取用户信息成功", ""); string returnstr = mbll.WxOrQQLoginBll(openID, "0"); if (returnstr != "Fail") { string[] resultstr = returnstr.Split(','); //如果微信已经存在则登录 if (resultstr.Length > 0) { mbll.UpdateUserInfobll("HeadImage", userInfo.HeadImgUrl, resultstr[3]); mbll.UpdateUserInfobll("UserName", userInfo.NickName, resultstr[2]); if (resultstr[0].Equals("Success")) { //var returndata = new //{ // usid = resultstr[1], // phone = resultstr[4] //}; //把重要的用户信息进行加密,存放到cookie this.SetAccountData(new AccountData { UserID = resultstr[1], UserName = resultstr[2], HeadImage = resultstr[3], WeChatOpenID = openID }); //PlasCommon.Common.AddLog("", "微信登录成功", "登录成功", ""); //return RedirectToAction("Home", "Index"); //return new RedirectResult("/Home/Index"); returnresultstr = "登录成功!"; returncode = 1; } else { //return Json(Common.ToJsonResult("Fail", "登录失败"), JsonRequestBehavior.AllowGet); returnresultstr = "登录失败!"; } } else { //return Json(Common.ToJsonResult("Fail", "登录失败"), JsonRequestBehavior.AllowGet); returnresultstr = "登录失败!"; } } //不存在则注册,注册成功则返回用户id,注册失败则返回失败状态 else { cp_userview model = new cp_userview(); model.UserName = userInfo.NickName; model.wxopenid = openID; model.HeadImage = userInfo.HeadImgUrl; string registerresultstr = mbll.WxOrQQSaveRegister(model, "0"); //已经存在 if (registerresultstr == "AlreadyExist") { //return Json(Common.ToJsonResult("Fail", "登录失败"), JsonRequestBehavior.AllowGet); returnresultstr = "登录失败!"; } else if (registerresultstr == "Fail") { //return Json(Common.ToJsonResult("Fail", "登录失败"), JsonRequestBehavior.AllowGet); returnresultstr = "登录失败!"; } else if (registerresultstr == "Success") { string returnstr2 = mbll.WxOrQQLoginBll(openID, "0"); string[] resultstr2 = returnstr2.Split(','); if (resultstr2.Length > 0) { if (resultstr2[0].Equals("Success")) { //var returndata2 = new //{ // usid = resultstr2[1], // phone = resultstr2[4] //}; this.SetAccountData(new AccountData { UserID = resultstr2[1], UserName = resultstr2[2], HeadImage = resultstr2[3], WeChatOpenID = openID }); //PlasCommon.Common.AddLog("", "微信登录成功", "登录成功", ""); //return RedirectToAction("Index", "Home"); //return Redirect("/Home/Index"); returnresultstr = "登录成功!"; returncode = 2; //return new RedirectResult("/Home/Index"); } else { //return Json(Common.ToJsonResult("Fail", "登录失败"), JsonRequestBehavior.AllowGet); returnresultstr = "登录失败!"; } } else { //return Json(Common.ToJsonResult("Fail", "登录失败"), JsonRequestBehavior.AllowGet); returnresultstr = "登录失败!"; } } else { //return Json(Common.ToJsonResult("Fail", "登录失败"), JsonRequestBehavior.AllowGet); returnresultstr = "登录失败!"; } } } else { //return Json(Common.ToJsonResult("Error", "登录失败")); returnresultstr = "登录失败!"; } } else { returnresultstr = "登录成功!"; returncode = 3; } } catch (Exception ex) { //PlasCommon.Common.AddLog("", "微信请求错误", ex.Message, ""); //return error("请求有误", ex.Message); returnresultstr = "系统错误:" + ex.Message; } ViewBag.texing = returnresultstr; ViewBag.typecode = returncode; return(View()); }
/// <summary> /// 删除全部菜单 /// </summary> public static void DeleteMenu() { WeChatApi.DeleteMenu(); }
/// <summary> /// 查询菜单 /// </summary> /// <returns></returns> public static WeChatMenuModel GetMenu() { var resp = WeChatApi.GetMenu(); return(JsonConvert.DeserializeObject <WeChatMenuModel>(resp)); }
/// <summary> /// 创建菜单 /// </summary> /// <param name="menu"></param> public static void CreateMenu(SelfMenuInfo menu) { WeChatApi.CreateMenu(JsonConvert.SerializeObject(menu)); }
/// <summary> /// 你可以定义自己的Default方法(命名空间:Wlniao.WeChat.Extend.Base) /// </summary> /// <returns></returns> public string Default() { Model.Fans fans = BLL.Fans.GetBy("WeChatOpenId", FromId); Model.Rules rule = null; string msgtext = System.Data.KvTableUtil.GetString("NoMessage"); try { rule = BLL.Rules.GetRule(msgtext, FromId); } catch { } try { BLL.Fans.SetSession(FromId, "", rule.DoMethod, MsgArgs, rule.CallBackText); if (!string.IsNullOrEmpty(rule.DoMethod)) { String classname = rule.DoMethod.Substring(0, rule.DoMethod.LastIndexOf('.')); //获取类名 String methodname = rule.DoMethod.Substring(rule.DoMethod.LastIndexOf('.') + 1); //获取方法名 Type type = null; try { type = Type.GetType(String.Format("Wlniao.WeChat.Extend.{0}, Wlniao.WeChat.Extend", classname), false, true); if (type == null) { type = Type.GetType(String.Format("Wlniao.WeChat.Method.{0}, Wlniao.WeChat", classname), false, true); } } catch { } ActionBase action = (ActionBase)Activator.CreateInstance(type); action.FromId = FromId; action.MsgText = MsgText; action.MsgArgs = MsgArgs;; return(type.InvokeMember(methodname, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.IgnoreCase, null, action, new object[] { }).ToString()); } else { string where = "RuleGuid='" + rule.Guid + "'"; if (fans.AllowTest == 1) { where += " and (ContentStatus='normal' or ContentStatus='test')"; } else { where += " and ContentStatus='normal'"; } List <Model.RuleContent> listAll = Model.RuleContent.find(where + " order by LastStick desc").list(); List <Model.RuleContent> listText = Model.RuleContent.find(where + " and ContentType='text' order by LastStick desc").list(); List <Model.RuleContent> listPicText = Model.RuleContent.find(where + " and ContentType='pictext' order by LastStick desc").list(); List <Model.RuleContent> listMusic = Model.RuleContent.find(where + " and ContentType='music' order by LastStick desc").list(); if (rule.SendMode == "sendgroup" && listPicText != null && listPicText.Count > 0) { rule.ReContent = WeChatApi.ResponsePicTextMsg(FromId, ToId, listPicText); } else if (listAll.Count > 0) { int i = 0; if (rule.SendMode == "sendrandom") { i = new Random().Next(0, listAll.Count); } if (listAll[i].ContentType == "text") { rule.ReContent = listAll[i].TextContent; try { //更新推送次数 listAll[i].PushCount++; listAll[i].update("PushCount"); } catch { } } else if (listAll[i].ContentType == "music") { rule.ReContent = WeChatApi.ResponseMusicMsg(FromId, ToId, listAll[i].Title, listAll[i].TextContent, listAll[i].MusicUrl, listAll[i].MusicUrl); try { //更新推送次数 listAll[i].PushCount++; listAll[i].update("PushCount"); } catch { } } else if (listAll[i].ContentType == "pictext") { List <Model.RuleContent> listTemp = new List <Model.RuleContent>(); listTemp.Add(listAll[i]); rule.ReContent = WeChatApi.ResponsePicTextMsg(FromId, ToId, listTemp); } } return(rule.ReContent); } } catch { } return(""); }