侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ASP.NET微信开发(接口指南)

微信(小程序)  /  管理员 发布于 7年前   143

公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:

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

signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

加密/校验流程:

  • 1. 将token、timestamp、nonce三个参数进行字典序排序
  • 2. 将三个参数字符串拼接成一个字符串进行sha1加密
  • 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

/// <summary>  /// 验证签名  /// </summary>  /// <param name="signature"></param>  /// <param name="timestamp"></param>  /// <param name="nonce"></param>  /// <returns></returns>  public static bool CheckSignature(String signature, String timestamp, String nonce)  {  String[] arr = new String[] { token, timestamp, nonce };  // 将token、timestamp、nonce三个参数进行字典序排序  Array.Sort<String>(arr);   StringBuilder content = new StringBuilder();  for (int i = 0; i < arr.Length; i++)  {   content.Append(arr[i]);  }   String tmpStr = SHA1_Encrypt(content.ToString());    // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信  return tmpStr != null ? tmpStr.Equals(signature) : false;  }    /// <summary>  /// 使用缺省密钥给字符串加密  /// </summary>  /// <param name="Source_String"></param>  /// <returns></returns>  public static string SHA1_Encrypt(string Source_String)  {  byte[] StrRes = Encoding.Default.GetBytes(Source_String);  HashAlgorithm iSHA = new SHA1CryptoServiceProvider();  StrRes = iSHA.ComputeHash(StrRes);  StringBuilder EnText = new StringBuilder();  foreach (byte iByte in StrRes)  {   EnText.AppendFormat("{0:x2}", iByte);  }  return EnText.ToString();  } 

接入后是消息推送当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL上。

 protected void Page_Load(object sender, EventArgs e)  {   if (Request.HttpMethod.ToUpper() == "GET")  {   // 微信加密签名   string signature = Request.QueryString["signature"];   // 时间戳   string timestamp = Request.QueryString["timestamp"];   // 随机数   string nonce = Request.QueryString["nonce"];   // 随机字符串   string echostr = Request.QueryString["echostr"];   if (WeixinServer.CheckSignature(signature, timestamp, nonce))   {   Response.Write(echostr);   }   }  else if (Request.HttpMethod.ToUpper() == "POST")  {    StreamReader stream = new StreamReader(Request.InputStream);   string xml = stream.ReadToEnd();    processRequest(xml);  }    }    /// <summary>  /// 处理微信发来的请求  /// </summary>  /// <param name="xml"></param>  public void processRequest(String xml)  {  try  {    // xml请求解析   Hashtable requestHT = WeixinServer.ParseXml(xml);    // 发送方帐号(open_id)   string fromUserName = (string)requestHT["FromUserName"];   // 公众帐号   string toUserName = (string)requestHT["ToUserName"];   // 消息类型   string msgType = (string)requestHT["MsgType"];    //文字消息   if (msgType == ReqMsgType.Text)   {   // Response.Write(str);    string content = (string)requestHT["Content"];   if(content=="1")   {    // Response.Write(str);    Response.Write(GetNewsMessage(toUserName, fromUserName));    return;   }   if (content == "2")   {    Response.Write(GetUserBlogMessage(toUserName, fromUserName));    return;   }   if (content == "3")   {    Response.Write(GetGroupMessage(toUserName, fromUserName));    return;   }   if (content == "4")   {    Response.Write(GetWinePartyMessage(toUserName, fromUserName));    return;   }   Response.Write(GetMainMenuMessage(toUserName, fromUserName, "你好,我是vinehoo,"));    }   else if (msgType == ReqMsgType.Event)   {   // 事件类型   String eventType = (string)requestHT["Event"];   // 订阅   if (eventType==ReqEventType.Subscribe)   {       Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));      }   // 取消订阅   else if (eventType==ReqEventType.Unsubscribe)   {    // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息   }   // 自定义菜单点击事件   else if (eventType==ReqEventType.CLICK)   {    // TODO 自定义菜单权没有开放,暂不处理该类消息   }   }   else if (msgType == ReqMsgType.Location)   {   }    }  catch (Exception e)  {    }  }<pre name="code" class="csharp"> protected void Page_Load(object sender, EventArgs e)  {   if (Request.HttpMethod.ToUpper() == "GET")  {   // 微信加密签名   string signature = Request.QueryString["signature"];   // 时间戳   string timestamp = Request.QueryString["timestamp"];   // 随机数   string nonce = Request.QueryString["nonce"];   // 随机字符串   string echostr = Request.QueryString["echostr"];   if (WeixinServer.CheckSignature(signature, timestamp, nonce))   {   Response.Write(echostr);   }   }  else if (Request.HttpMethod.ToUpper() == "POST")  {    StreamReader stream = new StreamReader(Request.InputStream);   string xml = stream.ReadToEnd();    processRequest(xml);  }    }    /// <summary>  /// 处理微信发来的请求  /// </summary>  /// <param name="xml"></param>  public void processRequest(String xml)  {  try  {    // xml请求解析   Hashtable requestHT = WeixinServer.ParseXml(xml);    // 发送方帐号(open_id)   string fromUserName = (string)requestHT["FromUserName"];   // 公众帐号   string toUserName = (string)requestHT["ToUserName"];   // 消息类型   string msgType = (string)requestHT["MsgType"];    //文字消息   if (msgType == ReqMsgType.Text)   {   // Response.Write(str);    string content = (string)requestHT["Content"];   if(content=="1")   {    // Response.Write(str);    Response.Write(GetNewsMessage(toUserName, fromUserName));    return;   }   if (content == "2")   {    Response.Write(GetUserBlogMessage(toUserName, fromUserName));    return;   }   if (content == "3")   {    Response.Write(GetGroupMessage(toUserName, fromUserName));    return;   }   if (content == "4")   {    Response.Write(GetWinePartyMessage(toUserName, fromUserName));    return;   }   Response.Write(GetMainMenuMessage(toUserName, fromUserName, "你好,我是vinehoo,"));    }   else if (msgType == ReqMsgType.Event)   {   // 事件类型   String eventType = (string)requestHT["Event"];   // 订阅   if (eventType==ReqEventType.Subscribe)   {       Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));      }   // 取消订阅   else if (eventType==ReqEventType.Unsubscribe)   {    // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息   }   // 自定义菜单点击事件   else if (eventType==ReqEventType.CLICK)   {    // TODO 自定义菜单权没有开放,暂不处理该类消息   }   }   else if (msgType == ReqMsgType.Location)   {   }    }  catch (Exception e)  {    }  }</pre><br> <pre></pre> <br> <br> 

本文已被整理到了《ASP.NET微信开发教程汇总》,欢迎大家学习阅读。

以上就是关于ASP.NET微信开发接口指南的相关内容介绍,希望对大家的学习有所帮助。


  • 上一条:
    asp.net实现微信公众账号接口开发教程
    下一条:
    asp.net微信开发(永久素材管理)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 微信模板消息改版后发送规则记录(微信订阅消息参数值内容限制说明)(1个评论)
    • 微信支付v3对接所需工具及命令(0个评论)
    • 2023年9月1日起:微信小程序必须备案才能上线运营(0个评论)
    • 腾讯官方客服回应了:微信好友上限约10000个!(1个评论)
    • 2023年做微信小程序的老铁注意:新增收费项、微信小程序获取手机号也收费了(2个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-10
    • 2018-01
    • 2020-03
    • 2021-06
    • 2021-10
    • 2022-03
    • 2023-02
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客