最近研究了下服务号的服务器配置和企业号的回调模式。真正实现完后,觉得很简单,但一开始还是走了点弯路,所以写了个web程序,只用改下配置文件里的参数就可以直接用了。下面介绍下详细的用法以及实现步骤。

本文原文地址:用c#开发微信(1)服务号的服务器配置和企业号的回调模式 - url接入 (源码下载)

一、用法

1. 下载web程序

http://yunpan.cn/cjeTSAKwUVmv9  访问密码 7ab3

2. 修改配置文件web.config

<appSettings>

   <!--微信的Token-->

   <add key="WeixinToken" value="dd"/>

   <add key="AppId" value="wxdbddd2bc"/>

   <add key="AppSecret" value="82f7ddd88e196"/>

 

   <!--企业号配置信息-->

   <add key="CorpToken" value="fddd"/>

   <add key="CorpId" value="wx1156d982ddda8"/>

   <add key="EncodingAESKey" value="aNvJOkGYddyGwf5Rg"/>

 

 </appSettings>

3. 发布到你的服务器上

4. 服务号和企业号里分别填上url及参数:

企业号:

服务号:

二、实现方法

1. 新建一个web程序

2. 添加二个ashx文件(这里不用aspx页面,是为了更简便),参考官方文档,实现校验流程

服务号:

完整源码:

/// <summary>

        /// 处理微信服务器验证消息

        /// </summary>

        public void Auth()

        {

            string token = ConfigurationManager.AppSettings[Token].ToString();

            string signature = HttpContext.Current.Request.QueryString["signature"];

            string timestamp = HttpContext.Current.Request.QueryString["timestamp"];

            string nonce = HttpContext.Current.Request.QueryString["nonce"];

            string echostr = HttpContext.Current.Request.QueryString["echostr"];

 

            if (HttpContext.Current.Request.HttpMethod.ToUpper() == "GET")

            {

                //get method - 仅在微信后台填写URL验证时触发

                if (CheckSignature(signature, timestamp, nonce, token))

                {

                    WriteContent(echostr); //返回随机字符串则表示验证通过

                }

                else

                {

                    WriteContent("failed:" + signature + "," + GetSignature(timestamp, nonce, token) + "。" +

                                "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");

                }

                HttpContext.Current.Response.End();

            }

        }

 

        private void WriteContent(string str)

        {

            HttpContext.Current.Response.Output.Write(str);

        }

 

        /// <summary>

        /// 检查签名是否正确

        /// </summary>

        /// <param name="signature"></param>

        /// <param name="timestamp"></param>

        /// <param name="nonce"></param>

        /// <param name="token"></param>

        /// <returns></returns>

        public static bool CheckSignature(string signature, string timestamp, string nonce, string token)

        {

            return signature == GetSignature(timestamp, nonce, token);

        }

 

        /// <summary>

        /// 返回正确的签名

        /// </summary>

        /// <param name="timestamp"></param>

        /// <param name="nonce"></param>

        /// <param name="token"></param>

        /// <returns></returns>

        public static string GetSignature(string timestamp, string nonce, string token)

        {

            string[] arr = new[] { token, timestamp, nonce }.OrderBy(z => z).ToArray();

            string arrString = string.Join("", arr);

            System.Security.Cryptography.SHA1 sha1 = System.Security.Cryptography.SHA1.Create();

            byte[] sha1Arr = sha1.ComputeHash(Encoding.UTF8.GetBytes(arrString));

            StringBuilder enText = new StringBuilder();

            foreach (var b in sha1Arr)

            {

                enText.AppendFormat("{0:x2}", b);

            }

            return enText.ToString();

        }

官方接入文档: http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html

企业号:

完整源码:

public void ProcessRequest(HttpContext context)

       {

           string postString = string.Empty;

           if (HttpContext.Current.Request.HttpMethod.ToUpper() == "GET")

           {

               Auth();

           }

       }

 

/// <summary>

       /// 成为开发者的第一步,验证并相应服务器的数据

       /// </summary>

       private void Auth()

       {

           string token = ConfigurationManager.AppSettings["CorpToken"];//从配置文件获取Token

           

           string encodingAESKey = ConfigurationManager.AppSettings["EncodingAESKey"];//从配置文件获取EncodingAESKey

           

           string corpId = ConfigurationManager.AppSettings["CorpId"];//从配置文件获取corpId

 

           string echoString = HttpContext.Current.Request.QueryString["echoStr"];

           string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature

           string timestamp = HttpContext.Current.Request.QueryString["timestamp"];

           string nonce = HttpContext.Current.Request.QueryString["nonce"];

 

           string decryptEchoString = "";

           if (CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString))

           {

               if (!string.IsNullOrEmpty(decryptEchoString))

               {

                   HttpContext.Current.Response.Write(decryptEchoString);

                   HttpContext.Current.Response.End();

               }

           }

       }

 

/// <summary>

        /// 验证企业号签名

        /// </summary>

        /// <param name="token">企业号配置的Token</param>

        /// <param name="signature">签名内容</param>

        /// <param name="timestamp">时间戳</param>

        /// <param name="nonce">nonce参数</param>

        /// <param name="corpId">企业号ID标识</param>

        /// <param name="encodingAESKey">加密键</param>

        /// <param name="echostr">内容字符串</param>

        /// <param name="retEchostr">返回的字符串</param>

        /// <returns></returns>

        public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr)

        {

            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);

            int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);

            if (result != 0)

            {

                //LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result);

                return false;

            }

 

            return true;

 

            //ret==0表示验证成功,retEchostr参数表示明文,用户需要将retEchostr作为get请求的返回参数,返回给企业号。

            // HttpUtils.SetResponse(retEchostr);

        }

官方接入文档:  http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%BC%8F

3. 配置文件

<system.web>

   <compilation debug="true" targetFramework="4.0" />

   <httpHandlers>

     <add verb="*" path="MPService.ashx" type="Wechat.Config.MPService,Wechat.Config" validate="true"/>

     <add verb="*" path="QYService.ashx" type="Wechat.Config.QYService,Wechat.Config" validate="true"/>

     <add verb="*" path="TestAccountService.ashx" type="Wechat.Config.TestAccountService,Wechat.Config" validate="true"/>

   </httpHandlers>

 </system.web>

如果直接用Senparc.Weixin微信开发框架来实现,就更简单了:

 

rotected void Page_Load(object sender, EventArgs e)

 

       private readonly string Token = ConfigurationManager.AppSettings["token"];//与微信公众账号后台的Token设置保持一致,区分大小写。

   string signature = Request["signature"];

   string timestamp = Request["timestamp"];

   string nonce = Request["nonce"];

   string echostr = Request["echostr"];

   if (Request.HttpMethod == "GET")

   {

       //get method - 仅在微信后台填写URL验证时触发

       if (CheckSignature.Check(signature, timestamp, nonce, Token))

       {

           Response.Output.Write(echostr); //返回随机字符串则表示验证通过

       }

       else

       {

           Response.Output.Write("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +

                       "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");

       }

       Response.End();

    }

}

用c#开发微信 系列汇总

用c#开发微信(1)服务号的服务器配置和企业号的回调模式 - url接入 (源码下载)的更多相关文章

  1. 用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)

    本文讲述使用Senparc.Weixin框架来快速处理各种接收事件推送.这里的消息指的是传统的微信公众平台消息交互,微信用户向公众号发送消息后,公众号回复消息给微信用户.包括以下类型: 1 subsc ...

  2. 用c#开发微信(3)基于Senparc.Weixin框架的接收普通消息处理 (源码下载)

    本文讲述使用Senparc.Weixin框架来快速处理各种接收的普通消息.这里的消息指的是传统的微信公众平台消息交互,微信用户向公众号发送消息后,公众号回复消息给微信用户.包括以下7种类型: 1 文本 ...

  3. 使用Xamarin开发即时通信系统 -- 基础篇(大量图文讲解 step by step,附源码下载)...

    如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!而且,Xamarin已经被微 ...

  4. openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  5. Android 上实现像微信一样的用Fragment来实现的Tab切页效果 提供源码下载

    网有不少的例子,但是要么是像微信一样可是没有使用Fragment实现,要么是只实现了一个很简单的切换,没有下面的菜单页.这个例子有实现了,我觉得暂时够我用了##实现类:+ MainTabFragmen ...

  6. VopSdk一个高逼格微信公众号开发SDK(源码下载)

    看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...

  7. 近期热门微信小程序demo源码下载汇总

    近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...

  8. 基于Android开发的天气预报app(源码下载)

    原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...

  9. SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载)

    场景 SpringCloud学习之运行第一个Eureka程序: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90611451 S ...

随机推荐

  1. 8.adr与ldr伪指令的区别

    ldr和adr都是伪指令,区别是ldr是长加载.adr是短加载. 重点:adr指令加载符号地址,加载的是运行时地址: ldr指令加载符号地址时,加载的是链接地址.

  2. 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)

    使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...

  3. redis3.0.5集群部署安装详细步骤

    Redis集群部署文档(centos6系统) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) ...

  4. ORACLE rowid,file# 和 rfile#

    rowid简介 rowid就是唯一标志记录物理位置的一个id,在oracle 8版本以前,rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# , ...

  5. AESwithJCE http://www.coderanch.com/how-to/content/AES_v1.html

    Using AES with Java Technology By Rags SrinivasJune 2003 In September 2000, the National Institute o ...

  6. iOS7.0适配问题

    self.navigationController.navigationBar.translucent = YES,导航栏透明 extendedLayoutIncludesOpaqueBars = Y ...

  7. RGBA 与opacity

    RGBA是一种表示颜色的方式,初次看到觉得很奇怪,与RGB的区别是什么?后面查了下,才发现RGBA的好处. RGBA各个字母的含义为: R:红色值,正整数 | 百分数: G:绿色值,正整数 | 百分数 ...

  8. 快速排序(java实现)

    快速排序 算法思想:基于分治的思想,是冒泡排序的改进型.首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(lo指向起 ...

  9. $watch监听数据变化和run方法

    angular中$watch方法可以监听数据的变化. $scope.$watch('phone',function(){ $scope.phone.fre = $scope.phone.num> ...

  10. three.js 源码注释(三十九)Light/HemisphereLight.js 半球光、 自然光(天光效果)

    /*** * HemisphereLight类 是在场景中创建半球光,就是天光效果,经常用在室外,将各个位置的物体都照亮,室内的光线大多是方向性的, * 无论是窗口还是灯槽,用平面光很方便,室外用平面 ...