zoukankan      html  css  js  c++  java
  • C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台

    微信公众平台接入:其实很简单,把两个参数(地址和token)填入微信公众平台后台,暂时选择明文模式 ,其中token自己定义。微信服务器会根据后台填写的地址访问,并且带上对于的参数 如 url+&signature=0dab3e6f983b6bdccfdbe3ceca01526f1522748a&timestamp=1436257899&nonce=1868246535&echostr=echostr 根据参数用微信文档中指定的方法加密检验是否来自微信然后返回随机数echostr(当然你可以直接返回随机数,好处是简单,但是这样非微信服务器也可以访问你的服务器

    此处的方法是:新建一个一般处理程序(通常的做法是有伪静态处理,不生成伪静态地址也可以)代码如下 token自定义,token类似密码,如果泄露和微信的密钥一样可以修改。因为接入非常简单这里就不多写,可以直接看代码。

    我写的demo测试地址为:http://wxdemo.sohovan.com/API.ashx  token:sohovan 下载源码的github地址:https://github.com/xiejun-net/weixin

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.Security;
    
    namespace sohovan.com.wxdemo
    {
        /// <summary>
        /// API 的摘要说明
        /// </summary>
        public class API : IHttpHandler, IRequiresSessionState
        {
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                if (context.Request.HttpMethod.ToLower() == "post")
                {
                    //回复消息的时候也需要验证消息,这个很多开发者没有注意这个,存在安全隐患  
                    //微信中 谁都可以获取信息 所以 关系不大 对于普通用户 但是对于某些涉及到验证信息的开发非常有必要
                    if (CheckSignature())
                    {
                        //接收消息
                    }
                    else
                    {
                        HttpContext.Current.Response.Write("消息并非来自微信");
                        HttpContext.Current.Response.End();
                    }
                }
                else
                {
                    CheckWechat();
                }
            }
    
            #region 验证微信签名
            /// <summary>
            /// 返回随机数表示验证成功
            /// </summary>
            private void CheckWechat()
            {
                if (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["echoStr"]))
                {
                    HttpContext.Current.Response.Write("消息并非来自微信");
                    HttpContext.Current.Response.End();
                }
                string echoStr = HttpContext.Current.Request.QueryString["echoStr"];
                if (CheckSignature())
                {
                    HttpContext.Current.Response.Write(echoStr);
                    HttpContext.Current.Response.End();
                }
            }
    
            /// <summary>
            /// 验证微信签名
            /// </summary>
            /// <returns></returns>
            /// * 将token、timestamp、nonce三个参数进行字典序排序
            /// * 将三个参数字符串拼接成一个字符串进行sha1加密
            /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
            private bool CheckSignature()
            {
                string access_token = "sohovan";
    
                string signature = HttpContext.Current.Request.QueryString["signature"].ToString();
                string timestamp = HttpContext.Current.Request.QueryString["timestamp"].ToString();
                string nonce = HttpContext.Current.Request.QueryString["nonce"].ToString();
                string[] ArrTmp = { access_token, timestamp, nonce };
                Array.Sort(ArrTmp);     //字典排序
                string tmpStr = string.Join("", ArrTmp);
                tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
    
                if (tmpStr.ToLower() == signature)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            #endregion
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }

    本文版权归作者(谢俊)和博客园所有,欢迎转载,转载请标明出处。

    原文地址:http://www.cnblogs.com/net-xiejun/

    微信开发群C#.NETWEB程序开发交流

    完整源码下载:https://github.com/xiejun-net/weixin

    个人公众账号:

  • 相关阅读:
    关于js计算非等宽字体宽度的方法
    [NodeJs系列]聊一聊BOM
    Vue.js路由管理器 Vue Router
    vue 实践技巧合集
    微任务、宏任务与Event-Loop
    事件循环(EventLoop)的学习总结
    Cookie、Session和LocalStorage
    MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
    MySQL 树形结构 根据指定节点 获取其所有父节点序列
    MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators
  • 原文地址:https://www.cnblogs.com/net-xiejun/p/4628489.html
Copyright © 2011-2022 走看看