使用C# .net开发微信公众号之服务器URL配置

服务器URL配置 是微信公众号开发里非常重要的一个步骤。

虽然微信公众平台已经给了我们很多 必要的功能 像:查看用户,查看用户消息,给用户回复消息,自动给用户回复消息,根据用户消息内容回复给用户图文消息等等等。。。但是 有些我们需要实现的很多业务功能 微信公众号的后台是实现不了的。比如我们要根据用户的消息、菜单的点击事件来实现相应的业务逻辑是没办法实现的。那么这个时候,我们就要用到微信提供给我们的 配置服务器URL的功能了。这个URL可以是 一个aspx页面 比如:www.xxxx.com/index.aspx  还可以是一个webservice的地址。 当然不管是页面还是webservice 都要部署在一个对外的服务器上(需要外网ip或者域名),这样微信的服务器才能给我们设置的的URL地址发送消息。下面是微信开发手册里的内容,对于一些个别特别的内容我给大家解释一下(大家可以跳过下面的说明因为是从微信开发手册复制来的说明后面有一些我认为会对大家造成疑惑的地方的一些介绍):

接入指南

接入概述

接入微信公众平台开发,开发者需要按照如下步骤完成:

1、填写服务器配置

2、验证服务器地址的有效性

3、依据接口文档实现业务逻辑

下面详细介绍这3个步骤。

第一步:填写服务器配置

登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。

 使用C# .net开发微信公众号之服务器URL配置_第1张图片

第二步:验证消息的确来自微信服务器

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

 

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

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

 

检验signature的PHP示例代码:

private function checkSignature()

{

        $signature = $_GET["signature"];

        $timestamp = $_GET["timestamp"];

        $nonce = $_GET["nonce"];

        

$token = TOKEN;

$tmpArr = array($token, $timestamp, $nonce);

sort($tmpArr, SORT_STRING);

$tmpStr = implode( $tmpArr );

$tmpStr = sha1( $tmpStr );

 

if( $tmpStr == $signature ){

return true;

}else{

return false;

}

}

PHP示例代码下载:下载

第三步:依据接口文档实现业务逻辑

验证URL有效性成功后即接入生效,成为开发者。你可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。

成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。

公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明。返回错误时,可根据返回码来查询错误原因。全局返回码说明

用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。

此外,由于开发者经常有需在多个平台(移动应用、网站、公众帐号)之间共通用户帐号,统一帐号体系的需求,微信开放平台(open.weixin.qq.com)提供了UnionID机制。开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个应用(移动应用、网站应用和公众帐号,公众帐号只有在被绑定到微信开放平台帐号下后,才会获取UnionID),可通过获取用户基本信息中的UnionID来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的UnionID是唯一的。换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。详情请在微信开放平台的资源中心-移动应用开发-微信登录-授权关系接口调用指引-获取用户个人信息(UnionID机制)中查看。

----------------------------------------下面进入正题-------------------------------------------

注意,微信公众号接口必须以“http://”或“https://”开头,分别支持80端口和443端口。

第一步中:

1. 填写服务器地址(URL)这个URL就是我们发布到我们服务器上的一个网站 或者WebService或者WebAPI的地址。这个地址必须要以http:// 或https:// 开头

2. Token 这个Token我们可以随便填 这个Token是必填字段(这个Token的作用说重要也不重要,说不重要吧,他还和安全有点关系,起到一个验证的作用 所以我们先设置一个吧)

3. EncodingAESKey 是一个加密解密的密钥   如果我们对 消息有安全方面的要求的话,我们可以根据这个密钥来加解密消息。如果我们在下一个选项中选择了 安全模式的话 那么我们接受到的消息都是微信根据密钥加密过的,我们在使用的时候要根据密钥来解密,发送消息是要根据密钥加密; 而如果我们使用明文方式 就不在需要加解密这个步骤,但是安全性自然低很多。。大家根据需要来选择就行了。

第二步中:

1.我们在第一步设置完URL直接点保存 会出现这样的提示:

图片什么时候挂掉了..... 就是验证失败的提示,因为我们还没有部署我们的网站或者websevice,自然验证不了

我们只是设置了地址,在这个地址我们还要写一些接入的代码。我们接着往下看第二步。

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上

我们在提交配置的时候 微信服务器会发送一个get请求到我们设置的URL地址 请求的GET请求携带的参数如下所示:

 

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

 

我们需要对微信发送来的请求进行校验  校验的流程如下:

 

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

我把我写的代码贴出来供大家参考:

public void getMessage()
{
string token = "123456";
            if (string.IsNullOrEmpty(token))
            {
                return;
            }
            string echoString = HttpContext.Current.Request.QueryString["echoStr"];
            string signature = HttpContext.Current.Request.QueryString["signature"];
            string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
            string nonce = HttpContext.Current.Request.QueryString["nonce"];
            
            if (!string.IsNullOrEmpty(echoString))
            {
                HttpContext.Current.Response.Write(echoString);
                HttpContext.Current.Response.End();
            }
}

其中signature是 微信根据我们第一步中设置的token 和 timestamp 还有 nonce 先进行 字典排序 然后再经过sha1

加密后生成的。 我上面的代码是没有进行验证这个步骤的。   如果我们要进行安全验证就要 把我们设置的token 、接

收到的timestamp、接收到的nonce 进行字典排序 然后 sha1加密  后与接收到的signature 进行比对 如果比对成功

则返回 echoString 否则 什么都不返回 或者 返回空。 这些代码我们可以写在  aspx 页面的后台代码 aspx.cs 的 

page_load 里。如果我们写的是webservice 那么我们在设置URL的时候一定要在URL中把方法名带上 比如: 

www.xxxx.xom/getmsg.asmx/getMessage

以上就是我们配置URL的全部步骤,到此我们就完成了配置URL。以后不管是用户的消息,还是微信推送的消息 微信

服务器都会转发到我们设置的这个服务器地址来。。。但是这也带来了别的问题,就是微信服务器给我们的服务器转

发消息,我们必须给他回复,不然就会有比较严重的问题出现。 比如用户给我们的公众号发送消息,然后微信服务器

转发消息到我们的服务器 但是我们没有给这个消息回复内容,这个用户就会看到 此公众号暂时无法提供服务 的提

示,然后我们就要对消息进行一些处理了。

这一篇就先讲到这下一篇  使用C# .net开发微信公众号之自动回复消 中我再给大家讲解 在我们服务器端进行消息回复。欢迎大家持续关注!! 谢谢。

此方式或许有不妥之处,热烈欢迎大家吐槽。。。 错误之处也请大家指正,谢谢  -----    WeepingWeeper

谢谢大家观看参考,让我们一同进步。

微信的其他接口调用在持续更新中。。。欢迎关注持续关注。。

你可能感兴趣的:(微信)