示例#1
0
        /// <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"));
        }
示例#2
0
        /// <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;
                }
            }
        }
示例#3
0
        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;
            }
        }
示例#4
0
        /// <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 });
        }
示例#5
0
        /// <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")
            });
        }
示例#6
0
        /// <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()));
        }
示例#7
0
        /// <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));
        }
示例#9
0
        /// <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"));
        }
示例#10
0
        /// <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));
        }
示例#11
0
        /// <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)));
        }
示例#12
0
        /// <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"));
        }
示例#13
0
        /// <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>());
        }
示例#14
0
        /// <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);
        }
示例#15
0
        /// <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);
        }
示例#16
0
        /// <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);
        }
示例#17
0
        /// <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"));
        }
示例#18
0
        /// <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()));
        }
示例#19
0
        /// <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>());
        }
示例#20
0
        /// <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);
        }
示例#21
0
        /// <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);
        }
示例#22
0
        /// <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()));
        }
示例#23
0
        /// <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());
        }
示例#24
0
        /// <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);
        }
示例#25
0
        /// <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>());
        }
示例#26
0
        /// <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"));
            }
        }
示例#27
0
        /// <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());
        }
示例#28
0
        /// <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
            });
        }
示例#29
0
        /// <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());
        }
示例#30
0
        /// <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")
            });
        }