C# 微信公众号开发

1.验证token

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <param name="echostr"></param>
        /// <returns></returns>
        public ContentResult Wechat(string signature, string timestamp, string nonce, string echostr)
        {
            WechatBase wechat = WechatBase.GetWechat("wshl");

            if (string.IsNullOrEmpty(echostr))
            {
                using (Stream req = Request.InputStream)
                {
                    req.Seek(0, System.IO.SeekOrigin.Begin);
                    string xml = new StreamReader(req).ReadToEnd();
                    ///异步调用处理
                    System.Threading.Tasks.Task.Run(() =>
                    {
                        wechat.Subscribe(xml);
                    });
                }

                return Content("success");
            }
            else
            {
                if (wechat.CheckSignature(signature, timestamp, nonce, echostr))
                {
                    return Content(echostr);
                }
                return Content("Error!");
            }
        }
                /// <summary>
        /// 校验消息是否来源于微信
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <param name="echostr"></param>
        /// <returns></returns>
        public bool CheckSign(string signature, string timestamp, string nonce, string echostr)
        {
            List<string> signList = new List<string>();
            signList.Add(timestamp);
            signList.Add(nonce);
            signList.Add(_token);

            signList.Sort();

            string signStr = string.Join("", signList.ToArray());
            byte[] dataToHash = Encoding.ASCII.GetBytes(signStr);

            byte[] hashvalue = ((HashAlgorithm)CryptoConfig.CreateFromName("SHA1")).ComputeHash(dataToHash);

            StringBuilder sb = new StringBuilder();

            foreach (byte b in hashvalue)
            {
                sb.Append(b.ToString("x2"));
            }

            if (signature == sb.ToString())
            {
                return true;
            }
            else
            {
                return false;
            }
        }

2.回复文本消息

/// <summary>
        /// 给用户发送文本消息
        /// </summary>
        /// <param name="openID"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public bool SendTextMsg(string openID, string message)
        {
            string url = string.Format("{0}/cgi-bin/message/custom/send?access_token=={1}", _accessPoint, AccessToken);
            string backJson = string.Empty;
            string postJson = new
            {
                touser = openID,
                msgtype = "text",
                text = new 
                {
                    content = message
                }
            }.ToJson();

            if(_http.Post(ref backJson, url, postJson))
            {
                JsonBase result = backJson.Deserialize<JsonBase>();
                if(result.ErrCode == 0)
                {
                    return true;
                }
                return false;
            }
            else
            {
                return false;
            }
        }

3.回复图片信息

                /// <summary>
        /// 给用户发送图片消息
        /// </summary>
        /// <param name="openID"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public bool SendImgMsg(string openID, string message)
        {
            string url = string.Format("{0}/cgi-bin/message/custom/send?access_token=={1}", _accessPoint, AccessToken);
            string backJson = string.Empty;
            string postJson = new
            {
                touser = openID,
                template_id = "",
                data = ""
            }.ToJson();

            return true;
        }

4.单个发送模板信息

/// <summary>
        /// 单个发送模板消息
        /// </summary>
        /// <param name="openID"></param>
        /// <param name="templateID"></param>
        /// <param name="linkUrl"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public MessageJson SendTemplateMsg(string openID, string templateID, string linkUrl, object data, string color = "black")
        {
            try
            {
                string url = string.Format("{0}/cgi-bin/message/template/send?access_token={1}", _accessPoint, AccessToken);
                string backJson = string.Empty;
                string postJson = new
                {
                    touser = openID,
                    template_id = templateID,
                    data = data
                }.ToJson();

                if(_http.Post(ref backJson, url, postJson))
                {
                    MessageJson msg = backJson.Deserialize<MessageJson>();
                    if(msg == null)
                    {
                        msg = new MessageJson { ErrCode = 99999, ErrMsg = "Wechat:send template message return json:" + backJson };
                    }
                    return msg;
                }
                return new MessageJson { ErrCode = 99999, ErrMsg = "Wechat:send template message request failed!" }; ;
            }
            catch(Exception e)
            {
                Log.WriteLog(e.Message);
                return new MessageJson { ErrCode = 99999, ErrMsg = e.Message };
            }
        }

6.获取推广信息

/// <summary>
        /// 获取推广二维码 
        /// </summary>
        /// <param name="action">QR_LIMIT_SCENE/QR_LIMIT_STR_SCENE</param>
        /// <param name="objScene"></param>
        /// <returns></returns>
        public SceneQRResult GetQrUrl(string actionTp, object actionInfo)
        {
            try
            {
                string url = string.Format("{0}/cgi-bin/qrcode/create?access_token={1}", _accessPoint, AccessToken);
                string backJson = string.Empty;
                string postJson = new
                {
                    action_name = actionTp,
                    action_info = new
                    {
                        scene = actionInfo
                    }
                }.ToJson();

                if (_http.Post(ref backJson, url, postJson))
                {
                    SceneQRResult msg = backJson.Deserialize<SceneQRResult>();

                    if(msg == null)
                    {
                        return new SceneQRResult { ErrCode = 9999, ErrMsg = "Wechat:deserialize json exception!\r\n" + backJson };
                    }
                    return msg;
                }
                return new SceneQRResult { ErrCode = 9999, ErrMsg = "Wechat:QRCode request failed!" };
            }
            catch(Exception e)
            {
                Log.WriteLog(e.Message);
                return new SceneQRResult { ErrCode = 9999, ErrMsg = e.Message };
            }
        }

7.显示接收的微信图片
在head中增加 <meta name="referrer" content="never">

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容