/// <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;
        }
Example #3
0
        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"));

        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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);
        }
Example #6
0
        /// <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);
        }
Example #7
0
        ///  <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);
        }
Example #8
0
        /// <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;
 }
Example #10
0
        ///
        /// 发送卡券 查看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);
        }
Example #11
0
 public WeixinJsonConventer(Type type, JsonSetting jsonSetting = null)
 {
     _jsonSetting = jsonSetting ?? new JsonSetting();
     _type = type;
 }