.NET开发,企业微信URL验证报错:echostr校验失败,请您检查是否正确解密并输出明文echostr

乐于编程 2018-08-30 06:48:26
这是从微信官网开发文档下载的源码,修改成自己的自定义应用的ID等信息,
请求的URL是:http://oa.cyszxyy.com:9988/Treasure.ashx (我在域名后加了端口号不知道影响不)
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";

//公众平台上开发者设置的token, corpID, EncodingAESKey
string sToken = "EONy623344FgnnQl6D"; // 工资查询
string sCorpID = "wx11111222441";
string sEncodingAESKey = "lTCrwOd446777uLKVNValFbdcPJiiVsi";

/*
------------使用示例一:验证回调URL---------------
*企业开启回调模式时,企业号会向验证url发送一个get请求
假设点击验证时,企业收到类似请求:
* GET /cgi-bin/wxpush?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3×tamp=1409659589&nonce=263014780&
* echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D
* HTTP/1.1 Host: qy.weixin.qq.com

* 接收到该请求时,企业应 1.解析出Get请求的参数,包括消息体签名(msg_signature),时间戳(timestamp),
* 随机数字串(nonce)以及公众平台推送过来的随机加密字符串(echostr),
这一步注意作URL解码。
2.验证消息体签名的正确性
3.解密出echostr原文,将原文当作Get请求的response,返回给公众平台
第2,3步可以用公众平台提供的库函数VerifyURL来实现。
*/

WeiXinNET.Common.WXBizMsgCrypt wxcpt = new WeiXinNET.Common.WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
string sVerifyMsgSig = context.Request.Params["msg_signature"].ToString();

string sVerifyTimeStamp = context.Request.Params["timestamp"].ToString();
string sVerifyNonce = context.Request.Params["nonce"].ToString();

// string sVerifyEchoStr = context.Request.Params["echostr"].ToString();
string sVerifyEchoStr = context.Server.UrlDecode(context.Request.Params["echostr"].ToString());
int ret = 0;
string sEchoStr = "";
ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr);

if (ret != 0)
{
System.Console.WriteLine("ERR: VerifyURL fail, ret: " + ret);

return;
}
//ret==0表示验证成功,sEchoStr参数表示明文,用户需要将sEchoStr作为get请求的返回参数,返回给企业号。
// HttpUtils.SetResponse(sEchoStr);
HttpContext.Current.Response.Write(ret);
}

用微信的接口调试工具 就提示,“echostr校验失败,请您检查是否正确解密并输出明文echostr”,
已经困扰近一个月了,都上火了,不知道怎么办?
...全文
654 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅翰GG 2020-10-19
  • 打赏
  • 举报
回复
楼主,怎么通过的,我也是url:echostr校验失败(未将对象引入到实例) 这是我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web; using System.Web.Security; namespace SendMessage { public partial class asd2 : System.Web.UI.Page { const string Token = "abcdefg";//定义一个局部变量不可以被修改,这里定义的变量要与接口配置信息中填写的Token一致 protected void Page_Load(object sender, EventArgs e) { Valid();//校验签名 } private void Valid() { string echoStr = Request.Params["echoStr"].ToString(); //string echoStr = Request.QueryString["echoStr"].ToString(); if (CheckSignature()) { if (!string.IsNullOrEmpty(echoStr)) { Response.Write(echoStr); Response.End(); } } } /// <summary> /// 验证微信签名 /// </summary> /// <returns></returns> private bool CheckSignature() { string signature = Request.QueryString["signature"].ToString(); string timestamp = Request.QueryString["timestamp"].ToString(); string nonce = Request.QueryString["nonce"].ToString(); string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp);//字典排序 string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//对该字符串进行sha1加密 tmpStr = tmpStr.ToLower();//对字符串中的字母部分进行小写转换,非字母字符不作处理 if (tmpStr.ToUpper() == signature.ToUpper())//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。开发者通过检验signature对请求进行校验,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败 { Response.Write("true"); return true; } else return false; } } }
乐于编程 2018-08-30
  • 打赏
  • 举报
回复
调试通过,这个与域名的端口号没有关系。
哈哈,弄了近一个月的 URL检验,今天终于成功了!
睡觉!

3,154

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧