C#微信公众号开发系列教程二(新手接入指南)

原文:C#微信公众号开发系列教程二(新手接入指南)

此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽。

目录

C#微信公众号开发系列教程一(调试环境部署)

C#微信公众号开发系列教程一(调试环境部署续:vs远程调试)

C#微信公众号开发系列教程二(新手接入指南)

 

微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先判断消息的合法性,判断成功后根据消息体的内容做相应的相应。原理很容易理解,接触过socket的可能理解起来更容易。

然而,微信的文档有的时候确实有点让人摸不着头脑,关于微信接入的文档写的确实不敢恭维啊。官方文档写的第一步是“申请消息接口”,这里是需要填写一个url的,此url用来处理微信发送的消息的,但微信把url中相关的配置写在了第二步,一不小心就把新手给坑了。下面我按照我的理解来进行解释。

首先,开发者在接入时,微信服务器将发送get请求到你填写的url上,此请求携带四个参数,分别signature(微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。),timestamp(时间戳),nonce(随机数),echostr(随机字符串).用 HttpContext.Current.Request.RawUrl可以获取当前请求的原始url,如下图所示:

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
下面是代码实现。
首先,在你的处理程序中(我是新建了一个一般处理程序wx.ashx),判断当前请求的类型,因为接入时,是发送的GET请求,消息处理是发送的POST请求。如下图:

这里我对验证url的方法进行封装。
/// <summary>
        /// 验证url权限, 接入服务器
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static bool ValidUrl(string token)
        {
            string echoStr = VqiRequest.GetQueryString("echoStr");
            if (CheckSignature(token))
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    Utils.ResponseWrite(echoStr);
                    return true;
                }

            }
            return false;
        }

/// <summary>
        /// 验证微信签名
        /// </summary>
        /// * 将token、timestamp、nonce三个参数进行字典序排序
        /// * 将三个参数字符串拼接成一个字符串进行sha1加密
        /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
        /// <returns></returns>
        public static bool CheckSignature(string token)
        {
            string signature = VqiRequest.GetQueryString("signature");
            string timestamp = VqiRequest.GetQueryString("timestamp");
            string nonce = VqiRequest.GetQueryString("nonce");
            string[] ArrTmp = { token, timestamp, nonce };
            Array.Sort(ArrTmp);     //字典排序
            string tmpStr = string.Join("", ArrTmp);
            tmpStr = Utils.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            tmpStr = tmpStr.ToLower();
            if (tmpStr == signature)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

 

注:代码VqiRequest.GetQueryString是封装的QueryString请求的方法,使用的时候可以改成QueryString[“”]

处理过程如图:

将signature,timestamp,nonce三个参数放在数组中,

排序后的ArrTmp:

将三个将三个参数字符串拼接成一个字符串:

将tmpStr进行sha1加密,加密后的字符串转换成小写:

然后和签名进行对比,相同则表示验证成功。

验证成功将echoStr返回给微信。

/// <summary>
        /// 根据指定的密码和哈希算法生成一个适合于存储在配置文件中的哈希密码
        /// </summary>
        /// <param name="str">要进行哈希运算的密码</param>
        /// <param name="type"> 要使用的哈希算法</param>
        /// <returns>经过哈希运算的密码</returns>
        public static string HashPasswordForStoringInConfigFile(string str, string type)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(str, type);
        }

        public static void ResponseWrite(string str)
        {
            HttpContext.Current.Response.Write(str);
            HttpContext.Current.Response.End();
        }

 

处理程序编写完毕后,部署到iis(方法请参照教程一),登录微信管理后台https://mp.weixin.qq.com/在开发者中心页,点击“修改配置按钮”填写URL、Token和EncodingAESKey,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效。加解密方式的默认状态为明文模式。加解密模式将在后期的系列中与大家共享,敬请期待。

如图所示:

 

点击提交后,微信服务器将get请求到上文中编写的url中。验证成功,则绑定成功。

 

 

END

 

如有疑问加群一起交流,我需要广大屌丝小伙伴的反馈与建议,  

如果觉得本文对你有帮助,请点击文章下面的推荐哦,去帮助更多的小伙伴了解微信开发的流程。

如果你是土豪,想支持笔者继续更新本系列教程,可以扫描下面的二维码悬赏一下,你的支持是笔者继续更新下去的动力。

时间: 2024-10-31 04:59:29

C#微信公众号开发系列教程二(新手接入指南)的相关文章

C#微信公众号开发系列教程三(消息体签名及加解密)

原文:C#微信公众号开发系列教程三(消息体签名及加解密)   C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太

微信公众号开发系列教程一(调试环境部署续:vs远程调试)

原文:微信公众号开发系列教程一(调试环境部署续:vs远程调试) 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)   前几天决定写个微信公众平台开发系列,在发布第一篇博文后,收到了很多园友的反馈和建议,在这里感谢大家的支持,我会坚持写完这个系列,希望能帮助更多的小伙伴.特别要感谢下@ZIP,是他的一个提醒才有了这篇博文.也希望更多的小伙伴能把你的想法反馈给我. 上一篇中主要介绍的是使用花

C#微信公众号开发系列教程五(接收事件推送与消息排重)

原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/

微信公众号开发系列-开发模式创建自定义菜单

通过程序方式实现自定义菜单,通过http请求封装类交互微信自定义菜单接口 1.得到AccessToken access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效.由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务. 请开发者

微信公众号开发系列-获取微信OpenID

在微信开发时候在做消息接口交互的时候需要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID,接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获取OpenId(接收事件推送方式),以下事件中都可以获取到OpenID 关注/取消关注事件 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL.方便开发者给用户下发欢迎消息或者做帐号的解绑. 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 关于重试的消息排

微信公众号开发系列-启用开发模式

微信公众平台分为两种模式:编辑模式与开发模式: 微信公众帐号申请成功后,要想用程序接收处理用户的请求,就必须要在"高级功能"里进行配置,点击"高级功能". 从微信开发平台开发者中心中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种模式是互斥关系,即两种模式不能同时开启.那两种模式有什么区别呢,作为开发人员到底要开启哪一种呢? 编辑模式:主要针对非编程人员及信息发布类公众帐号使用.开启该模式后,可以方便地通过界面配置"自定义菜单"和&

微信公众号开发系列-网页授权获取用户基本信息

OAuth2.0网页授权这个也是在做微信公众平台用到最多的,可以利用授权接口对自己平台内用户进行绑定,实现用户扫描码和微信分享.微信签到.微信商城购物等: 1.高级接口OAuth2.0网页授权设置 a.进入高级接口列表-OAuth2.0-点击修改设置授权域名,域名可以上一级域名和二级域名 b.填写要设置授权域名,我这里用的的是二级域名 体授权Url规则见下面详细描述,主要摘自微信公众平台开发文档,点击进入 2.网页授权获取用户基本信息说明 如果用户在微信中(Web微信除外)访问公众号的第三方网页

微信公众号开发系列-微信企业号开发相关参数

微信企业号出来之后,本人也抱着前面开发订阅号和服务号的经验来探究了一番,这里整理了下再开发企业号时候碰到的一些接口参数.企业号开发文档详见http://qydev.weixin.qq.com/wiki/index.php?title=首页 1.创建自定义菜单参数解释: 菜单管理的创建操作,官方定义如下所示. 请求说明 Https请求方式: POST https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN&

微信公众号开发系列-Http请求封装基类

HttpHelper请求封装基类,支持get请求和POS请求,方便微信开发接口交互,为后面接口交互做准备. 1.HttpHelper帮助基类 [csharp] view plaincopy using System;   using System.Collections.Generic;   using System.IO;   using System.Linq;   using System.Text;   using System.Net;   using System.Net.Secur