/// <summary> /// 创建个新华菜单 /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId。当为AppId时,如果AccessToken错误将自动获取一次。当为null时,获取当前注册的第一个AppId。</param> /// <param name="buttonData">菜单内容</param> /// <returns></returns> public static CreateMenuConditionalResult CreateMenuConditional(string accessTokenOrAppId, ConditionalButtonGroup buttonData, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var urlFormat = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token={0}"; var jsonSetting = new JsonSetting(true); return CommonJsonSend.Send<CreateMenuConditionalResult>(accessToken, urlFormat, buttonData, timeOut: timeOut, jsonSetting: jsonSetting); }, accessTokenOrAppId); }
/// <summary> /// 将对象转为JSON字符串 /// </summary> /// <param name="data">需要生成JSON字符串的数据</param> /// <param name="jsonSetting">JSON输出设置</param> /// <returns></returns> public string GetJsonString(object data, JsonSetting jsonSetting = null) { JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); jsSerializer.RegisterConverters(new JavaScriptConverter[] { new WeixinJsonConventer(data.GetType(), jsonSetting), new ExpandoJsonConverter() }); var jsonString = jsSerializer.Serialize(data); //解码Unicode,也可以通过设置App.Config(Web.Config)设置来做,这里只是暂时弥补一下,用到的地方不多 MatchEvaluator evaluator = new MatchEvaluator(DecodeUnicode); var json = Regex.Replace(jsonString, @"\\u[0123456789abcdef]{4}", evaluator);//或:[\\u007f-\\uffff],\对应为\u000a,但一般情况下会保持\ return json; }
public void TestSerialzeEnumString() { //测试序列化枚举为字符串 CustomField customField = new CustomField { name_type = MemberCard_CustomField_NameType.FIELD_NAME_TYPE_ACHIEVEMEN, url = "http://weixin.senparc.com" }; SerializerHelper serializerHelper = new SerializerHelper(); JsonSetting jsonSetting = new JsonSetting(); var jsonString = serializerHelper.GetJsonString(customField, jsonSetting); Console.WriteLine(jsonString); Assert.IsTrue(jsonString.Contains("FIELD_NAME_TYPE_ACHIEVEMEN")); Assert.IsTrue(jsonString.Contains("http://weixin.senparc.com")); }
/// <summary> /// 生成卡券二维码 /// 获取二维码ticket 后,开发者可用ticket 换取二维码图片。换取指引参考:http://mp.weixin.qq.com/wiki/index.php?title=生成带参数的二维码 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="cardId">卡券ID</param> /// <param name="code">指定卡券code 码,只能被领一次。use_custom_code 字段为true 的卡券必须填写,非自定义code 不必填写。</param> /// <param name="openId">指定领取者的openid,只有该用户能领取。bind_openid 字段为true 的卡券必须填写,非自定义openid 不必填写。</param> /// <param name="expireSeconds">指定二维码的有效时间,范围是60 ~ 1800 秒。不填默认为永久有效。</param> /// <param name="isUniqueCode">指定下发二维码,生成的二维码随机分配一个code,领取后不可再次扫描。填写true 或false。默认false。</param> /// <param name="balance">红包余额,以分为单位。红包类型必填(LUCKY_MONEY),其他卡券类型不填。</param> /// <param name="outer_id">自定义应用场景ID(v13.7.3起支持)</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static CreateQRResultJson CreateQR(string accessTokenOrAppId, string cardId, string code = null, string openId = null, string expireSeconds = null, bool isUniqueCode = false, string balance = null, string outer_id=null, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var urlFormat = string.Format("https://api.weixin.qq.com/card/qrcode/create?access_token={0}", accessToken.AsUrlData()); var data = new { action_name = "QR_CARD", action_info = new { card = new { card_id = cardId, code = code, openid = openId, expire_seconds = expireSeconds, is_unique_code = false, balance = balance, outer_id = outer_id } } }; //var jsonSettingne = new JsonSetting(true); var jsonSetting = new JsonSetting(true, null, new List<Type>() { //typeof (Modify_Msg_Operation), //typeof (CardCreateInfo), data.action_info.card.GetType()//过滤Modify_Msg_Operation主要起作用的是这个 }); return CommonJsonSend.Send<CreateQRResultJson>(null, urlFormat, data, timeOut: timeOut, jsonSetting: jsonSetting); }, accessTokenOrAppId); }
/// <summary> /// 创建卡券 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="cardInfo">创建卡券需要的数据,格式可以看CardCreateData.cs</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static CardCreateResultJson CreateCard(string accessTokenOrAppId, BaseCardInfo cardInfo, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var urlFormat = string.Format("https://api.weixin.qq.com/card/create?access_token={0}", accessToken.AsUrlData()); CardCreateInfo cardData = null; CardType cardType = cardInfo.GetCardType(); switch (cardType) { case CardType.GENERAL_COUPON: cardData = new CardCreateInfo() { card = new Card_GeneralCoupon() { card_type = cardType.ToString(), general_coupon = cardInfo as Card_GeneralCouponData } }; break; case CardType.GROUPON: cardData = new CardCreateInfo() { card = new Card_Groupon() { card_type = cardType.ToString(), groupon = cardInfo as Card_GrouponData } }; break; case CardType.GIFT: cardData = new CardCreateInfo() { card = new Card_Gift() { card_type = cardType.ToString(), gift = cardInfo as Card_GiftData } }; break; case CardType.CASH: cardData = new CardCreateInfo() { card = new Card_Cash() { card_type = cardType.ToString(), cash = cardInfo as Card_CashData } }; break; case CardType.DISCOUNT: cardData = new CardCreateInfo() { card = new Card_DisCount() { card_type = cardType.ToString(), discount = cardInfo as Card_DisCountData } }; break; case CardType.MEMBER_CARD: cardData = new CardCreateInfo() { card = new Card_MemberCard() { card_type = cardType.ToString(), member_card = cardInfo as Card_MemberCardData } }; break; case CardType.SCENIC_TICKET: cardData = new CardCreateInfo() { card = new Card_ScenicTicket() { card_type = cardType.ToString(), scenic_ticket = cardInfo as Card_ScenicTicketData } }; break; case CardType.MOVIE_TICKET: cardData = new CardCreateInfo() { card = new Card_MovieTicket() { card_type = cardType.ToString(), movie_ticket = cardInfo as Card_MovieTicketData } }; break; case CardType.BOARDING_PASS: cardData = new CardCreateInfo() { card = new Card_BoardingPass() { card_type = cardType.ToString(), boarding_pass = cardInfo as Card_BoardingPassData } }; break; case CardType.LUCKY_MONEY: cardData = new CardCreateInfo() { card = new Card_LuckyMoney() { card_type = cardType.ToString(), lucky_money = cardInfo as Card_LuckyMoneyData } }; break; case CardType.MEETING_TICKET: cardData = new CardCreateInfo() { card = new Card_MeetingTicket() { card_type = cardType.ToString(), meeting_ticket = cardInfo as Card_MeetingTicketData } }; break; default: break; } var jsonSetting = new JsonSetting(true, null, new List<Type>() { //typeof (Modify_Msg_Operation), //typeof (CardCreateInfo), typeof (Card_BaseInfoBase)//过滤Modify_Msg_Operation主要起作用的是这个 }); var result = CommonJsonSend.Send<CardCreateResultJson>(null, urlFormat, cardData, timeOut: timeOut, //针对特殊字段的null值进行过滤 jsonSetting: jsonSetting); return result; }, accessTokenOrAppId); }
/// <summary> /// 此接口已取消,微信直接提供了十四种色值供选择,详见:http://mp.weixin.qq.com/wiki/8/b7e310e7943f7763450eced91fa793b0.html#.E5.8D.A1.E5.88.B8.E5.9F.BA.E7.A1.80.E4.BF.A1.E6.81.AF.E5.AD.97.E6.AE.B5.EF.BC.88.E9.87.8D.E8.A6.81.EF.BC.89 /// 获取颜色列表接口 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> //public static GetColorsResultJson GetColors(string accessTokenOrAppId, int timeOut = Config.TIME_OUT) //{ // return ApiHandlerWapper.TryCommonApi(accessToken => // { // var urlFormat = string.Format("https://api.weixin.qq.com/card/getcolors?access_token={0}", accessToken); // return CommonJsonSend.Send<GetColorsResultJson>(null, urlFormat, null, timeOut: timeOut); // }, accessTokenOrAppId); //} /// <summary> /// 生成卡券二维码 /// 获取二维码ticket 后,开发者可用ticket 换取二维码图片。换取指引参考:http://mp.weixin.qq.com/wiki/index.php?title=生成带参数的二维码 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="cardId">卡券ID</param> /// <param name="code">指定卡券code 码,只能被领一次。use_custom_code 字段为true 的卡券必须填写,非自定义code 不必填写。</param> /// <param name="openId">指定领取者的openid,只有该用户能领取。bind_openid 字段为true 的卡券必须填写,非自定义openid 不必填写。</param> /// <param name="expireSeconds">指定二维码的有效时间,范围是60 ~ 1800 秒。不填默认为永久有效。</param> /// <param name="isUniqueCode">指定下发二维码,生成的二维码随机分配一个code,领取后不可再次扫描。填写true 或false。默认false。</param> /// <param name="balance">红包余额,以分为单位。红包类型必填(LUCKY_MONEY),其他卡券类型不填。</param> /// <param name="timeOut">代理请求超时时间(毫秒)</param> /// <returns></returns> public static CreateQRResultJson CreateQR(string accessTokenOrAppId, string cardId, string code = null, string openId = null, string expireSeconds = null, bool isUniqueCode = false, string balance = null, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var urlFormat = string.Format("https://api.weixin.qq.com/card/qrcode/create?access_token={0}", accessToken); var data = new { action_name = "QR_CARD", action_info = new { card = new { card_id = cardId, code = code, openid = openId, expire_seconds = expireSeconds, is_unique_code = false, balance = balance } } }; var jsonSettingne=new JsonSetting(true); return CommonJsonSend.Send<CreateQRResultJson>(null, urlFormat, data, timeOut: timeOut,jsonSetting: jsonSettingne); }, accessTokenOrAppId); }
/// <summary> /// 更新会员信息 /// </summary> /// post数据: /// 可以传入积分、余额的差值 /// { /// "code": "12312313", /// "card_id":"p1Pj9jr90_SQRaVqYI239Ka1erkI", /// "record_bonus": "消费30元,获得3积分", /// "add_bonus": 3,//可以传入积分增减的差值 /// "add_balance": -3000,//可以传入余额本次增减的差值 /// "record_balance": "购买焦糖玛琪朵一杯,扣除金额30元。", /// "custom_field_value1": "xxxxx", /// } /// 或者直接传入积分、余额的全量值 /// /// { /// "code": "12312313", /// "card_id":"p1Pj9jr90_SQRaVqYI239Ka1erkI", /// "record_bonus": "消费30元,获得3积分", /// "bonus": 3000,//可以传入第三方系统记录的积分全量值 /// "balance": 3000,//可以传入第三方系统记录的余额全量值 /// "record_balance": "购买焦糖玛琪朵一杯,扣除金额30元。", /// "custom_field_value1": "xxxxx", /// } /// <param name="accessTokenOrAppId"></param> /// <param name="code">卡券Code码。</param> /// <param name="cardId">卡券ID。</param> /// <param name="addBonus">需要变更的积分,扣除积分用“-“表示。</param> /// <param name="addBalance">需要变更的余额,扣除金额用“-”表示。单位为分。</param> /// <param name="backgroundPicUrl">用户卡片的背景图片</param> /// <param name="bonus">需要设置的积分全量值,传入的数值会直接显示,如果同时传入add_bonus和bonus,则前者无效。</param> /// <param name="balance">需要设置的余额全量值,传入的数值会直接显示,如果同时传入add_balance和balance,则前者无效。</param> /// <param name="recordBonus">商家自定义积分消耗记录,不超过14个汉字。</param> /// <param name="recordBalance">商家自定义金额消耗记录,不超过14个汉字。</param> /// <param name="customFieldValue1">创建时字段custom_field1定义类型的最新数值,限制为4个汉字,12字节。</param> /// <param name="customFieldValue2">创建时字段custom_field2定义类型的最新数值,限制为4个汉字,12字节。</param> /// <param name="customFieldValue3">创建时字段custom_field3定义类型的最新数值,限制为4个汉字,12字节。</param> /// <param name="timeOut"></param> /// <returns></returns> public static UpdateUserResult UpdateUser(string accessTokenOrAppId, string code, string cardId, int addBonus, int addBalance, string backgroundPicUrl = null, int? bonus = null, int? balance = null, string recordBonus = null, string recordBalance = null, string customFieldValue1 = null, string customFieldValue2 = null, string customFieldValue3 = null, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var urlFormat = string.Format("https://api.weixin.qq.com/card/membercard/updateuser?access_token={0}", accessToken.AsUrlData()); var data = new { code = code, card_id = cardId, background_pic_url = backgroundPicUrl, // add_bonus = addBonus, bonus = bonus, record_bonus = recordBonus, // add_balance = addBalance, balance = balance, record_balance = recordBalance, custom_field_value1 = customFieldValue1, custom_field_value2 = customFieldValue2, custom_field_value3 = customFieldValue3, }; JsonSetting jsonSetting = new JsonSetting() { TypesToIgnore = new List<Type>() { data.GetType() } }; return CommonJsonSend.Send<UpdateUserResult>(null, urlFormat, data, timeOut: timeOut); }, accessTokenOrAppId); }
/// <summary> /// 设置开卡字段接口 /// </summary> /// <param name="accessTokenOrAppId"></param> /// <param name="data"></param> /// <param name="timeOut"></param> /// <returns></returns> public static WxJsonResult ActivateUserFormSet(string accessTokenOrAppId, ActivateUserFormSetData data, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var urlFormat = string.Format("https://api.weixin.qq.com/card/membercard/activateuserform/set?access_token={0}", accessToken.AsUrlData()); JsonSetting jsonSetting = new JsonSetting() { TypesToIgnore = new List<Type>() { typeof(ActivateUserFormSetData), typeof(BaseForm) } }; return CommonJsonSend.Send<WxJsonResult>(null, urlFormat, data, timeOut: timeOut); }, accessTokenOrAppId); }
public WeixinJsonConventer(Type type, JsonSetting jsonSetting = null) { this._jsonSetting = jsonSetting ?? new JsonSetting(); this._type = type; }
/// /// 发送卡券 查看card_ext字段详情及签名规则,特别注意客服消息接口投放卡券仅支持非自定义Code码的卡券。 /// public static WxJsonResult SendCard(string accessTokenOrAppId, string openId, string cardId, CardExt cardExt, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var data = new { touser = openId, msgtype = "wxcard", wxcard = new { card_id = cardId, card_ext = cardExt } }; JsonSetting jsonSetting = new JsonSetting() { TypesToIgnore = new List<System.Type>() { typeof(CardExt) } }; return CommonJsonSend.Send(accessToken, URL_FORMAT, data, timeOut: timeOut, jsonSetting: jsonSetting); }, accessTokenOrAppId); }
public WeixinJsonConventer(Type type, JsonSetting jsonSetting = null) { _jsonSetting = jsonSetting ?? new JsonSetting(); _type = type; }