/// <summary> /// 获取发送模板的Id。 /// </summary> /// <param name="templateShortId">模板短Id。</param> /// <returns>发送模板的Id。</returns> public string GetTemplateId(string templateShortId) { var postUrl = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=" + _accountModel.GetAccessToken(); var content = WeiXinHttpHelper.PostString(postUrl, new { template_id_short = templateShortId }); return(JObject.Parse(content).Value <string>("template_id")); }
/// <summary> /// 设置选项值。 /// </summary> /// <param name="optionName">选项名称。</param> /// <param name="optionValue">选项值。</param> /// <param name="authorizerAppId">授权者AppId。</param> /// <remarks> /// location_report(地理位置上报选项)(0 无上报 1 进入会话时上报2 每5s上报) /// voice_recognize(语音识别开关选项)(0 关闭语音识别 1 开启语音识别) /// customer_service(客服开关选项)(0 关闭多客服1 开启多客服) /// </remarks> public void SetOptionValue(string optionName, string optionValue, string authorizerAppId) { Action <string> set = accessToken => { WeiXinHttpHelper.PostString( "https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option?component_access_token=" + accessToken, new { component_appid = _accountModel.AppId, authorizer_appid = authorizerAppId, option_name = optionName, option_value = optionValue }); }; try { set(GetAccessToken().AccessToken); } catch (WeiXinException exception) { if (exception.ErrorCode == 40001 || exception.Message == "invalid credential, access_token is invalid or not latest") { set(GetAccessToken(true).AccessToken); } else { throw; } } }
private PublicAccountAuthorizerInfo InternalGetPublicAccountAuthorizerInfo(string authorizationCode) { var get = new Func <string, PublicAccountAuthorizerInfo>(accessToken => { var content = WeiXinHttpHelper.PostString( "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=" + accessToken, new { component_appid = _accountModel.AppId, authorization_code = authorizationCode }); var obj = JObject.Parse(content)["authorization_info"]; var model = JsonConvert.DeserializeObject <PublicAccountAuthorizerInfo>(obj.ToString()); model.Rights = GetRights(obj); return(model); }); try { return(get(GetAccessToken().AccessToken)); } catch (WeiXinException exception) { if (exception.ErrorCode == 40001 || exception.Message == "invalid credential, access_token is invalid or not latest") { return(get(GetAccessToken(true).AccessToken)); } throw; } }
/// <summary> /// 根据菜单Id删除自定义菜单。 /// </summary> /// <param name="menuId">菜单Id。</param> public void DeleteByMenuId(int menuId) { var url = "https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token=" + _accountModel.GetAccessToken(); WeiXinHttpHelper.PostString(url, new { menuid = menuId }); }
/// <summary> /// 查询code。 /// </summary> /// <param name="code">单张卡券的唯一标识。</param> /// <param name="cardId">卡券ID代表一类卡券。</param> /// <remarks>调用查询code接口可获取code的有效性(非自定义code),该code对应的用户openid、卡券有效期等信息。 自定义code(use_custom_code为true)的卡券调用接口时,post数据中需包含card_id,非自定义code不需上报。</remarks> /// <returns>查询结果。</returns> public SearchCodeResult SearchCode(string code, string cardId = null) { var url = "https://api.weixin.qq.com/card/code/get?access_token=" + _accountModel.GetAccessToken(); object postData; if (string.IsNullOrWhiteSpace(cardId)) { postData = new { code }; } else { postData = new { code, card_id = cardId }; } var content = WeiXinHttpHelper.PostString(url, postData); var obj = JObject.Parse(content); var card = obj["card"]; return(new SearchCodeResult { BeginTime = DateTimeHelper.GetTimeByTimeStamp(card.Value <long>("begin_time")), CardId = card.Value <string>("card_id"), EndTime = DateTimeHelper.GetTimeByTimeStamp(card.Value <long>("end_time")), OpenId = obj.Value <string>("openid") }); }
/// <summary> /// 批量获取用户信息。 /// </summary> /// <param name="filters">筛选信息。</param> /// <returns>用户信息集合。</returns> public UserInfo[] GetUserInfoList(params GetUserListFilterItem[] filters) { var url = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=" + _accountModel.GetAccessToken(); var content = WeiXinHttpHelper.PostString(url, new { user_list = filters }); return(JsonConvert.DeserializeObject <UserInfo[]>(JObject.Parse(content)["user_info_list"].ToString())); }
/// <summary> /// 获取选项值。 /// </summary> /// <param name="optionName">选项名称。</param> /// <param name="authorizerAppId">授权者AppId。</param> /// <returns>选项值。</returns> /// <remarks> /// location_report(地理位置上报选项)(0 无上报 1 进入会话时上报2 每5s上报) /// voice_recognize(语音识别开关选项)(0 关闭语音识别 1 开启语音识别) /// customer_service(客服开关选项)(0 关闭多客服1 开启多客服) /// </remarks> public string GetOptionValue(string optionName, string authorizerAppId) { Func <string, string> get = accessToken => WeiXinHttpHelper.PostString( "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=" + accessToken, new { component_appid = _accountModel.AppId, authorizer_appid = authorizerAppId, option_name = optionName }); string content; try { content = get(GetAccessToken().AccessToken); } catch (WeiXinException exception) { if (exception.ErrorCode == 40001 || exception.Message == "invalid credential, access_token is invalid or not latest") { content = get(GetAccessToken(true).AccessToken); } else { throw; } } return(JObject.Parse(content).Value <string>("option_value")); }
private GroupSendResult SendMessage(GroupMessage message, Action <JObject> action) { var url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=" + _accountModel.GetAccessToken(); string msgtype; switch (message.Type) { case GroupMessageType.News: msgtype = "mpnews"; break; case GroupMessageType.Card: msgtype = "wxcard"; break; case GroupMessageType.Image: msgtype = "image"; break; case GroupMessageType.Music: msgtype = "music"; break; case GroupMessageType.Text: msgtype = "text"; break; case GroupMessageType.Video: msgtype = "mpvideo"; var videoMessage = (GroupMessageVideo)message; var uploadVideoUrl = "https://file.api.weixin.qq.com/cgi-bin/media/uploadvideo?access_token=" + _accountModel.GetAccessToken(); var result = WeiXinHttpHelper.PostString(uploadVideoUrl, new { media_id = videoMessage.MediaId, title = videoMessage.Title, description = videoMessage.Description }); videoMessage.MediaId = JObject.Parse(result)["media_id"].Value <string>(); break; case GroupMessageType.Voice: msgtype = "voice"; break; default: throw new NotSupportedException("不支持的消息类型:" + message.Type); } var postObj = new JObject(); action(postObj); postObj["msgtype"] = msgtype; postObj[msgtype] = JObject.Parse(JsonConvert.SerializeObject(message)); var content = WeiXinHttpHelper.PostString(url, Encoding.UTF8.GetBytes(postObj.ToString())); return(JsonConvert.DeserializeObject <GroupSendResult>(content)); }
/// <summary> /// 解码Code。 /// </summary> /// <param name="encryptCode">编码的Code值。</param> /// <returns>解码的Code值。</returns> public string DecryptCode(string encryptCode) { var url = "https://api.weixin.qq.com/card/code/decrypt?access_token=" + _accountModel.GetAccessToken(); var content = WeiXinHttpHelper.PostString(url, new { encrypt_code = encryptCode }); return(JObject.Parse(content).Value <string>("code")); }
/// <summary> /// 获取指定用户的自定义菜单信息。 /// </summary> /// <param name="openIdOrWeChatAccount">用户的Id或是微信账号。</param> /// <returns>自定义菜单数组。</returns> public CustomMenuButtonBase[] GetList(string openIdOrWeChatAccount) { var url = "https://api.weixin.qq.com/cgi-bin/menu/trymatch?access_token=" + _accountModel.GetAccessToken(); var content = WeiXinHttpHelper.PostString(url, new { user_id = openIdOrWeChatAccount }); return(GetListByJson(content)); }
/// <summary> /// 创建分组。 /// </summary> /// <param name="name">分组名称(30字以内)</param> /// <returns>创建分组结果模型。</returns> public CreateGroupResultModel Create(string name) { var url = "https://api.weixin.qq.com/cgi-bin/groups/create?access_token=" + _accountModel.GetAccessToken(); var content = WeiXinHttpHelper.PostString(url, new { group = new { name } }); return(CreateGroupResultModel.Create(JObject.Parse(content))); }
/// <summary> /// 更新卡券。 /// </summary> /// <param name="cardId">卡券Id。</param> /// <param name="model">卡券更新模型。</param> /// <returns>此次更新是否需要审核。</returns> public bool Update(string cardId, CardUpdateModel model) { var url = "https://api.weixin.qq.com/card/update?access_token=" + _accountModel.GetAccessToken(); var obj = new JObject(); obj["card_id"] = cardId; obj["member_card"] = JObject.Parse(JsonConvert.SerializeObject(model)); var content = WeiXinHttpHelper.PostString(url, Encoding.UTF8.GetBytes(obj.ToString())); return(JObject.Parse(content).Value <bool>("send_check")); }
/// <summary> /// 上传图片。 /// </summary> /// <param name="data">图片数据(大小限制1MB,支持JPG格式)。</param> /// <returns>如果上传成功则返回图片的绝对url地址。</returns> public string UploadImage(byte[] data) { var url = "http://file.api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + _accountModel.GetAccessToken(); var createBytes = new CreateBytes(); var postData = createBytes.JoinBytes(new List <byte[]> { createBytes.CreateFieldData("buffer", FileHelper.GetRandomFileName(data), "image/jpeg", data) }); var json = WeiXinHttpHelper.PostString(url, postData, createBytes.ContentType); return(JObject.Parse(json)["url"].Value <string>()); }
/// <summary> /// 获取公众账号授权信息。 /// </summary> /// <param name="authorizationCode">授权码。</param> /// <param name="ignoreCached">是否忽略缓存。</param> /// <returns>公众账号授权信息。</returns> public PublicAccountAuthorizerInfo GetPublicAccountAuthorizerInfo(string authorizationCode, bool ignoreCached = false) { Func <string, PublicAccountAuthorizerInfo> getFunc = accessToken => { var content = WeiXinHttpHelper.PostString( "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=" + accessToken, new { component_appid = _accountModel.AppId, authorization_code = authorizationCode }); var obj = JObject.Parse(content)["authorization_info"]; var model = JsonConvert.DeserializeObject <PublicAccountAuthorizerInfo>(obj.ToString()); model.Rights = GetRights(obj); return(model); }; var get = new Lazy <PublicAccountAuthorizerInfo>(() => { try { return(getFunc(GetAccessToken().AccessToken)); } catch (WeiXinException exception) { if (exception.ErrorCode == 40001 || exception.Message == "invalid credential, access_token is invalid or not latest") { return(getFunc(GetAccessToken(true).AccessToken)); } throw; } }); return(_objectCacheDictionary.AddOrUpdate("GetPublicAccountAuthorizerInfo_" + authorizationCode, k => get.Value, (k, v) => { var model = v as PublicAccountAuthorizerInfo; //无效、过期、忽略缓存则重新获取。 if (model == null || model.IsExpired() || ignoreCached) { if (model != null && get.Value.AccessToken == model.AccessToken) { return model; } return get.Value; } return model; }) as PublicAccountAuthorizerInfo); }
/// <summary> /// 获取公众账号信息。 /// </summary> /// <param name="authorizerAppId">授权者AppId。</param> /// <returns>公众账号信息。</returns> public PublicAccountInfo GetPublicAccountInfo(string authorizerAppId) { Func <string, string> getContent = accessToken => WeiXinHttpHelper.PostString( "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=" + accessToken, new { component_appid = _accountModel.AppId, authorizer_appid = authorizerAppId }); string content; try { content = getContent(GetAccessToken().AccessToken); } catch (WeiXinException exception) { if (exception.ErrorCode == 40001 || exception.Message == "invalid credential, access_token is invalid or not latest") { content = getContent(GetAccessToken(true).AccessToken); } else { throw; } } var obj = JObject.Parse(content); var authorizerInfo = obj["authorizer_info"]; var authorizationInfo = obj["authorization_info"]; var model = new PublicAccountInfo { Authorizer = JsonConvert.DeserializeObject <PublicAccountInfo.AuthorizerInfo>(authorizerInfo.ToString()), Authorization = JsonConvert.DeserializeObject <PublicAccountInfo.AuthorizationInfo>(authorizationInfo.ToString()), }; model.Authorization.Rights = GetRights(authorizationInfo); model.Authorizer.ServiceType = (PublicAccountInfo.ServiceTypeEnum) Enum.Parse(typeof(PublicAccountInfo.ServiceTypeEnum), authorizerInfo.SelectToken("service_type_info.id").Value <string>()); model.Authorizer.AuthenticateType = (PublicAccountInfo.AuthenticateTypeEnum) Enum.Parse(typeof(PublicAccountInfo.AuthenticateTypeEnum), authorizerInfo.SelectToken("verify_type_info.id").Value <string>()); return(model); }
/// <summary> /// 获取门店信息。 /// </summary> /// <param name="storeId">门店Id(服务器推送的数据)。</param> /// <returns>门店信息。</returns> public StoreInfoModel Get(ulong storeId) { var url = "http://api.weixin.qq.com/cgi-bin/poi/getpoi?access_token=" + _accountModel.GetAccessToken(); var json = WeiXinHttpHelper.PostString(url, new { poi_id = storeId }); var infoObj = JObject.Parse(json)["business"]["base_info"]; var infoJson = infoObj.ToString(); var model = JsonConvert.DeserializeObject <StoreInfoModel>(infoJson); model.PhotoList = infoObj["photo_list"].Select(i => i["photo_url"].Value <string>()).ToArray(); return(model); }
/// <summary> /// 发送模板消息。 /// </summary> /// <param name="openId">用户Id。</param> /// <param name="templateId">模板Id。</param> /// <param name="url">跳转的url。</param> /// <param name="topColor">顶部颜色。</param> /// <param name="data">模板数据。</param> /// <returns>消息Id。</returns> public long Send(string openId, string templateId, string url, string topColor, object data) { var postUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + _accountModel.GetAccessToken(); var json = WeiXinHttpHelper.PostString(postUrl, new { touser = openId, template_id = templateId, url, topcolor = topColor, data }); return(JObject.Parse(json).Value <long>("msgid")); }
/// <summary> /// 更新门店。 /// </summary> /// <param name="model">更新门店模型。</param> public void Update(UpdateStoreModel model) { var url = "http://api.weixin.qq.com/cgi-bin/poi/updatepoi?access_token=" + _accountModel.GetAccessToken(); var json = JsonConvert.SerializeObject(model); var obj = JObject.Parse(json); if (model.PhotoList != null) { obj["photo_list"] = new JArray(model.PhotoList.Select(i => new { photo_url = i })); } WeiXinHttpHelper.PostString(url, Encoding.UTF8.GetBytes(obj.ToString())); }
/// <summary> /// 上传卡券Logo。 /// </summary> /// <param name="bytes">文件字节组(大小限制1MB,像素为300*300,支持JPG格式。)。</param> /// <returns></returns> public string UploadLogo(byte[] bytes) { var url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + _accountModel.GetAccessToken(); var createBytes = new CreateBytes(); var data = createBytes.JoinBytes(new ArrayList { createBytes.CreateFieldData("buffer", FileHelper.GetRandomFileName(bytes), FileHelper.GetContentType(bytes), bytes) }); var json = WeiXinHttpHelper.PostString(url, data, createBytes.ContentType); return(JObject.Parse(json)["url"].Value <string>()); }
/// <summary> /// 修改库存。 /// </summary> /// <param name="cardId">卡券Id。</param> /// <param name="increaseValue">增加的值。</param> /// <param name="reduceValue">减少的值。</param> /// <remarks>调用修改库存接口增减某张卡券的库存。</remarks> public void UpdateStock(string cardId, int?increaseValue, int?reduceValue) { var url = "https://api.weixin.qq.com/card/modifystock?access_token=" + _accountModel.GetAccessToken(); object postData = null; if (!increaseValue.HasValue && !reduceValue.HasValue) { throw new ArgumentException("增加库存的值与减少库存的值不能都为null"); } if (!increaseValue.HasValue) { increaseValue = 0; } if (!reduceValue.HasValue) { reduceValue = 0; } if (increaseValue.Value == reduceValue.Value) { throw new ArgumentException("增加库存的值不能等于减少库存的值,因为这样没有任何意义。"); } if (increaseValue.Value > 0 && reduceValue.Value > 0) { postData = new { card_id = cardId, increase_stock_value = increaseValue.Value, reduce_stock_value = reduceValue.Value } } ; else if (increaseValue.Value > 0) { postData = new { card_id = cardId, increase_stock_value = increaseValue.Value } } ; else if (reduceValue.Value > 0) { postData = new { card_id = cardId, reduce_stock_value = reduceValue.Value } } ; if (postData == null) { throw new ArgumentException("无效的参数值,请检查。"); } WeiXinHttpHelper.PostString(url, postData); }
/// <summary> /// 设置卡券失效。 /// </summary> /// <param name="cardId">卡券ID。</param> /// <param name="code">设置失效的Code码。</param> /// <remarks> /// 为满足改票、退款等异常情况,可调用卡券失效接口将用户的卡券设置为失效状态。 注:设置卡券失效的操作不可逆,即无法将设置为失效的卡券调回有效状态,商家须慎重调用该接口。 /// </remarks> public void Invalid(string cardId, string code) { var url = "https://api.weixin.qq.com/card/code/unavailable?access_token=" + _accountModel.GetAccessToken(); object postData; if (string.IsNullOrWhiteSpace(cardId)) { postData = new { code }; } else { postData = new { code, card_id = cardId }; } WeiXinHttpHelper.PostString(url, postData); }
/// <summary> /// 创建门店。 /// </summary> /// <param name="model">门店模型。</param> public void Create(CreateStoreModel model) { var url = "http://api.weixin.qq.com/cgi-bin/poi/addpoi?access_token=" + _accountModel.GetAccessToken(); var json = JsonConvert.SerializeObject(new { business = new { base_info = model } }); var obj = JObject.Parse(json); var baseObj = obj["business"]["base_info"]; baseObj["photo_list"] = JArray.Parse(JsonConvert.SerializeObject(model.PhotoList.Select(i => new { photo_url = i }))); baseObj["offset_type"] = 1; WeiXinHttpHelper.PostString(url, Encoding.UTF8.GetBytes(obj.ToString())); }
/// <summary> /// 获取门店列表。 /// </summary> /// <param name="skip">跳过多少条数据。</param> /// <param name="take">获取多少条数据(最大为50)。</param> /// <returns>门店信息数组。</returns> public StoreInfoModel[] GetList(uint skip = 0, ushort take = 20) { var url = "http://api.weixin.qq.com/cgi-bin/poi/getpoilist?access_token=" + _accountModel.GetAccessToken(); var json = WeiXinHttpHelper.PostString(url, new { begin = skip, limit = take }); var array = (JArray)JObject.Parse(json)["business_list"]; return(array.Select(i => { var baseInfo = i["base_info"]; var model = JsonConvert.DeserializeObject <StoreInfoModel>(baseInfo.ToString()); var photoList = (JArray)baseInfo["photo_list"]; model.PhotoList = photoList.Select(z => z["photo_url"].Value <string>()).ToArray(); return model; }).ToArray()); }
/// <summary> /// 将一个url地址转换成一个短地址。 /// </summary> /// <param name="url">url地址。</param> /// <returns>短地址Url。</returns> public string GenerateShortAddress(string url) { Uri uri; if (!Uri.TryCreate(url, UriKind.Absolute, out uri)) { throw new ArgumentException(url + " 不是一个有效的Url。", "url"); } if (new[] { "http", "https", "weixin" }.All(i => !i.Equals(uri.Scheme, StringComparison.OrdinalIgnoreCase))) { throw new ArgumentException("Url 中的 Scheme必需是(http、https、weixin)当中的一种,而当前是:" + uri.Scheme, "url"); } var postUrl = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=" + _accountModel.GetAccessToken(); var content = WeiXinHttpHelper.PostString(postUrl, new { action = "long2short", long_url = url }); var shortAddress = JObject.Parse(content)["short_url"].Value <string>(); return(shortAddress); }
/// <summary> /// 创建卡券。 /// </summary> /// <param name="model">卡券模型。</param> /// <returns>卡券Id。</returns> public string Create(CardModel model) { var url = "https://api.weixin.qq.com/card/create?access_token=" + _accountModel.GetAccessToken(); var type = GetCardTypeString(model.Type); var postData = new { card = new { card_type = type } }; var postJson = JsonConvert.SerializeObject(postData); var postObj = JObject.Parse(postJson); postObj["card"][type.ToLower()] = JObject.Parse(JsonConvert.SerializeObject(model)); var content = postObj.ToString(); var json = WeiXinHttpHelper.PostString(url, Encoding.UTF8.GetBytes(content)); return(JObject.Parse(json)["card_id"].Value <string>()); }
/// <summary> /// 设置自定义菜单。 /// </summary> /// <param name="menus">自定义菜单数组。</param> /// <param name="matchRule">匹配规则。</param> /// <exception cref="ArgumentNullException"><paramref name="menus"/> 为null。</exception> /// <exception cref="ArgumentException"><paramref name="menus"/> 长度超过3。</exception> /// <returns>如果是个性化菜单会返回菜单Id。</returns> public int?Set(CustomMenuButtonBase[] menus, CustomMeunMatchRule matchRule) { if (menus.NotNull("menus").Length > 3) { throw new ArgumentException("顶级菜单项不能超过3个。", nameof(menus)); } if (matchRule == null) { var url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + _accountModel.GetAccessToken(); WeiXinHttpHelper.Post(url, new { button = menus.Select(GetMenuItem) }); return(null); } else { var url = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=" + _accountModel.GetAccessToken(); var result = WeiXinHttpHelper.PostString(url, new { button = menus.Select(GetMenuItem), matchrule = matchRule }); return(JObject.Parse(result).Value <int>("menuid")); } }
/// <summary> /// 获取聊天记录。 /// </summary> /// <param name="startTime">查询开始时间</param> /// <param name="endTime">查询结束时间,每次查询不能跨日查询</param> /// <param name="pageSize">每页大小,每页最多拉取50条</param> /// <param name="pageIndex">查询第几页,从1开始</param> /// <param name="openId">普通用户的标识,对当前公众号唯一</param> /// <returns>服务记录数组。</returns> public ServiceRecord[] GetRecords(DateTime startTime, DateTime endTime, ushort pageSize = 50, ushort pageIndex = 1, string openId = null) { if ((endTime - startTime) > TimeSpan.FromDays(1)) { throw new ArgumentException("查询的结束时间过长,每次查询不能跨日查询。", "endTime"); } if (pageIndex <= 0) { throw new ArgumentOutOfRangeException("pageIndex", pageIndex, "查询页最小为1。"); } if (pageSize <= 0 || pageSize > 50) { throw new ArgumentOutOfRangeException("pageSize", pageSize, "每页的数据必需在1~50之间(含50)。"); } var url = "https://api.weixin.qq.com/customservice/msgrecord/getrecord?access_token=" + _accountModel.GetAccessToken(); var content = WeiXinHttpHelper.PostString(url, new { openid = openId, starttime = DateTimeHelper.GetTimeStampByTime(startTime), endtime = DateTimeHelper.GetTimeStampByTime(endTime), pagesize = pageSize, pageindex = pageIndex }); var array = (JArray)JObject.Parse(content)["recordlist"]; return(array.Select(i => new ServiceRecord { OpenId = i.Value <string>("openid"), OperCode = i.Value <ushort>("opercode"), Text = i.Value <string>("text"), Timestamp = i.Value <ulong>("time"), Account = i.Value <string>("worker") }).ToArray()); }
/// <summary> /// 创建领取卡券的二维码。 /// </summary> /// <param name="model">创建领取卡券二维码模型。</param> /// <returns>创建领取卡券二维码结果。</returns> public CreateCardQrCodeResult CreateQrCode(CreateCardQrCodeModel model) { var url = "https://api.weixin.qq.com/card/qrcode/create?access_token=" + _accountModel.GetAccessToken(); dynamic cardData = new ExpandoObject(); if (!string.IsNullOrWhiteSpace(model.OpenId)) { cardData.openid = model.OpenId; } if (!string.IsNullOrWhiteSpace(model.Code)) { cardData.code = model.Code; } cardData.card_id = model.CardId; if (model.ExpireSeconds.HasValue) { cardData.expire_seconds = 60; } cardData.is_unique_code = model.IsUniqueCode; cardData.outer_id = model.OuterId; var content = WeiXinHttpHelper.PostString(url, new { action_name = "QR_CARD", action_info = new { card = cardData } }); var ticket = JObject.Parse(content).Value <string>("ticket"); return(new CreateCardQrCodeResult { QrCodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket, Ticket = ticket }); }
/// <summary> /// 获取用户的卡券列表。 /// </summary> /// <param name="openId">用户Id。</param> /// <param name="cardId">卡券Id。</param> /// <returns></returns> public UserCardModel[] GetUserCardList(string openId, string cardId = null) { var url = "https://api.weixin.qq.com/card/user/getcardlist?access_token=" + _accountModel.GetAccessToken(); object postData; if (string.IsNullOrWhiteSpace(cardId)) { postData = new { openid = openId }; } else { postData = new { openid = openId, card_id = cardId }; } var content = WeiXinHttpHelper.PostString(url, postData); var obj = JObject.Parse(content); return(((JArray)obj["card_list"]).Select( i => new UserCardModel { CardId = i.Value <string>("card_id"), Code = i.Value <string>("code") }).ToArray()); }
/// <summary> /// 核销卡券。 /// </summary> /// <param name="code">需核销的Code码。</param> /// <param name="cardId">卡券ID。创建卡券时use_custom_code填写true时必填。非自定义Code不必填写。</param> /// <returns>核销卡券结果。</returns> public ConsumeResult Consume(string code, string cardId = null) { var url = "https://api.weixin.qq.com/card/code/consume?access_token=" + _accountModel.GetAccessToken(); object postData; if (string.IsNullOrWhiteSpace(cardId)) { postData = new { code }; } else { postData = new { code, card_id = cardId }; } var content = WeiXinHttpHelper.PostString(url, postData); var obj = JObject.Parse(content); return(new ConsumeResult { CardId = obj.SelectToken("card.card_id").Value <string>(), OpenId = obj.Value <string>("openid") }); }