首页 > 编程语言 >ASP.NET WEBAPI 接入微信公众平台总结,Token验证失败解决办法

ASP.NET WEBAPI 接入微信公众平台总结,Token验证失败解决办法

时间:2023-12-18 16:05:58浏览次数:36  
标签:WEBAPI nonce ASP string 微信 signature echostr timestamp


首先,请允许我说一句:shit!

因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少。都是PHP等等的。

我也是在看了某位大神的博客后有启发,一点点研究出来的。

来看正题!

1.微信公众平台的接入方法,无非4个参数(signature, timestamp, nonce, echostr)加1个Token(两边对应)

2.Token, timestamp, nonce字典排序后,按照字符串“SHA1”加密。得出一串字符串 tmpStr(转化为小写)

3.然后比对 tmpStr 是否等于 signature,如果相等,则表示此次请求是来自于微信。

4.确定请求来自于微信,则已经完成一大步了。剩下一个,将echostr参数传出给微信公众平台的工作了。(也正是这一步,耗费了3、4个小时)

PHP的代码就不说了,有例子,网上资料也很多。值得一提的是 ASP.NET MVC的操作,Senparc.Weixin.MP SDK 微信公众平台开发教程 索引

下面结合代码来详细解释我的 ASP.NET WebAPI 对微信公众平台接入的操作。

1.获取四个参数,此处可以看Log能否输出获取到的4个参数

///声明Log全局变量
     private static log4net.ILog Log = LogManager.GetLogger("WeChatConnect");
     ///声明Token
        public readonly string Token = "weixin";//与微信公众账号后台的Token设置保持一致,区分大小写。

        ///申请消息
        [HttpGet]
        public HttpResponseMessage ConnWeChat(string signature, string timestamp, string nonce, string echostr)
        {
            try
            {
                Log.Debug("测试输出: echostr = " + echostr);
                Log.Debug("测试输出: nonce = " + nonce);
                Log.Debug("测试输出: timestamp = " + timestamp);
                Log.Debug("测试输出: signature = " + signature);

                string EchoStr = Valid(signature, timestamp, nonce, echostr);

                if (!string.IsNullOrEmpty(EchoStr))
                {
                    Log.Debug("验证成功!");
                    return JsonTools.ToHttpMsgForWeChat(echostr);
                }
                else
                {
                    Log.Debug("验证失败!");
                    return JsonTools.ToHttpMsgForWeChat("验证失败!");
                }
            }
            catch (Exception ex)
            {
                Log.Error("Log 测试输出:异常!", ex);
                return JsonTools.ToHttpMsgForWeChat(ex.ToString());
            }
        }

2. Token, timestamp, nonce字典排序后,按照字符串“SHA1”加密。得出一串字符串 tmpStr(转化为小写),

    比对 tmpStr 是否等于 signature,如果相等,则表示此次请求是来自于微信。

private string Valid(string signature, string timestamp, string nonce, string echostr)
        {
            if (CheckSignature(signature,timestamp,nonce))
            {
                if (!string.IsNullOrEmpty(echostr))
                {
                    return echostr;
                }
            }

            return "";
        }

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

3.确定请求来自于微信,则只剩下将echostr参数传出给微信公众平台了。

//来看看我上面代码中的输出方式:HttpResponseMessage
public HttpResponseMessage ConnWeChat(string signature, string timestamp, string nonce, string echostr)
        
//输出语句
return JsonTools.ToHttpMsgForWeChat(echostr);


//返回字符串调用方法: 
public static HttpResponseMessage ToHttpMsgForWeChat(string strMsg) { 
  HttpResponseMessage result = new HttpResponseMessage { 
    Content = new StringContent(strMsg, Encoding.GetEncoding("UTF-8"), "application/x-www-form-urlencoded") 
  }; 
  return result; 
}

此处要强调一下,参照PHP的 echo $echoStr , WebFrom 的 Response.Write(echoStr)等。一次次的调试判断出微信的接受方式,只会以 "application/x-www-form-urlencoded" 来接受,所以我用HttpResponseMessage来指定其输出方式。最后测试成功!


网上各位大神给出的接入方法足以研究出接入规则,我通过某大神给的工具:Ngrok工具,成功部署本机80端口开放给外网,更加便于调试。感谢!

博客开了3年,第一次规规矩矩的写一次技术博文。不足的地方,望大家多多谅解。

专注于研究ASP.NET技术,最近迷上ASP.NET WebAPI。


标签:WEBAPI,nonce,ASP,string,微信,signature,echostr,timestamp
From: https://blog.51cto.com/u_3073223/8874628

相关文章

  • 一个能用的微信小程序抓包方式
    [一个能用的微信小程序抓包方式(亲测)-『精品软件区』-吾爱破解-LCG-LSG|安卓破解|病毒分析|www.52pojie.cn](https://www.52pojie.cn/thread-1849166-1-2.html)今天接到复测微信小程序的任务,需要对微信小程序进行抓包,从上午到现在试了很多方式,分别为Burp+Proxifier、Burp......
  • .net 温故知新【16】:Asp.Net Core WebAPI 筛选器
    一、筛选器通过使用筛选器可在请求处理管道中的特定阶段之前或之后运行代码。这即是我们经常听到的面向切面编程AOP(AspectOrientedProgramming)技术,AOP通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。筛选器在ASP.NETCore操作调用管道(有时称为筛选......
  • 微信小程序 文字超过行后隐藏显示省略号
    1、只需要显示一行,超过的省略号处理text{overflow:hidden;//超出一行文字自动隐藏text-overflow:ellipsis;//文字隐藏后添加省略号white-space:nowrap;//强制不换行}2、如果在多行的情况下注解一定要加注解一定要加注解一定要加重要的事情......
  • 苹果微信换图标方法!教你微信快速改任意图标教程(附图标)
    微信作为如今的社交大哥,使用人数早已突破了十亿人次,可见其用户体量之多堪称第一!用户量越多大家的需求也就越多,就像苹果微信想要实现安卓微信的各种功能,因为iOS系统的限制很多都是实现不了的。就比如更换微信图标这件事,安卓只需要更换一个喜欢的系统主题足以,但对于iPhone来说......
  • asp.net基于WEB层面的云LIS系统平台源码
    随着计算机技术在检验管理方面的广泛应用,以及各种先进的检验仪器在检验医学领域的使用,检验科室对信息化管理提出了更高的要求。正是在这样的背景下开发出了实验室信息管理系统(简称LIS)结合当今各检验科管理及实验室规模的不同状况,充分吸收当今IT科技的最新成就,开发出以高度产品化......
  • 微信小程序代码构成及每一个代码文件的作用(附图)
    一、微信小程序有四种类型文件:1.JSON配置文件(.json后缀)2.WXML模板文件(.wxml后缀)3.WXSS样式文件(.wxss后缀)4.JS脚本逻辑文件(.js后缀) 二、JSON配置:1.JSON配置:JSON是一种数据格式,用来静态配置。app.json 小程序配置project.config.json 工具配置 page.json页面......
  • 运营微信视频号要注意哪些问题?
    视频号运营的5个雷点你别踩!今天和你说的视频号运营的5大雷点你踩过没?这5点虽然和野花似的但也不能踩哦雷点1:违规行为雷点2:抄袭剽窃雷点3:没有明确目标受众雷点4:短视频质量过低雷点5:缺少社交互动......
  • 提升社交网络曝光,助力客户关系的必备神器——微信互动助手
    在当今数字化时代,社交网络已经成为企业推广和客户关系建立的关键平台。作为一家软件开发公司老板,您必须不断创新,以提高业务效率并加强与客户的联系。为了满足您的需求,我们自豪地推出了全新版本的微信互动助手V2.0.1,为您的业务发展提供强大支持。功能说明微信朋友圈互动助手V2.0.......
  • .NET微信网页开发之通过UnionID机制解决多应用用户帐号统一问题
    背景随着公司微信相关业务场景的不断拓展,从最初的一个微信移动应用、然后发展成微信公众号应用、然后又有了微信小程序应用。但是随着应用的拓展,如何保证相同用户的微信用户在不同应用中登录的同一个账号呢?今天的主题就来了.NET微信网页开发之通过UnionID机制解决多应用用户帐号......
  • 微信终于支持“上锁”了
    有时候偶尔需要离开工位电脑又不想关机的时候怎么办......