微信开放平台全网发布时,检测失败 —— C#

主要就是三个:返回API文本消息,返回普通文本消息,发送事件消息   --会出现失败的情况

(后续补充说明:出现检测出错,不一定是代码出现了问题,也有可能是1.微信方面检测时出现服务器请求失败,2.我们程序反应过慢,服务器处理超过微信方面的接收时长,导致微信方面未接收信息,报错

 

今天大概一下午坐着查这个了,眼睛疼得要命

图忘记截了,现在只剩下成功的图了,明天大概就会有结果了

先把当前成功的代码发布上来

用的C# MVC

public ActionResult Receive(string timestamp, string nonce, string encrypt_type){Log4NetHelper.Info("merchant message recive");var encryptMsg = string.Empty;try{string appid = "";if (!string.IsNullOrEmpty(Request["appid"])){appid = Request["appid"].Substring(1);}WeixinMessage message = null;var safeMode = Request.QueryString.Get("encrypt_type") == "aes";using (var streamReader = new StreamReader(Request.InputStream)){var decryptMsg = string.Empty;var msg = streamReader.ReadToEnd();#region 解密if (safeMode){var msg_signature = Request.QueryString.Get("msg_signature");var wxBizMsgCrypt = new WXBizMsgCrypt(CachedConfigContext.Current.WeixinOpenConfig.Token,CachedConfigContext.Current.WeixinOpenConfig.EncodingAESKey,CachedConfigContext.Current.WeixinOpenConfig.AppID);var ret = wxBizMsgCrypt.DecryptMsg(msg_signature, timestamp, nonce, msg, ref decryptMsg);if (ret != 0)//解密失败
                        {//TODO:开发者解密失败的业务处理逻辑//注意:本demo用log4net记录此信息,你可以用其他方法Log4NetHelper.Info(string.Format("decrypt message return {0}, request body {1}", ret, msg));WriteTxt.RecodeBug(string.Format("1商户接收信息,解密失败:decrypt message return {0}, request body {1}", ret, msg), "/merchant_receive.txt");}}else{decryptMsg = msg;}#endregion//将传入的数据流转成对象message = AcceptMessageAPI.Parse(decryptMsg);}#region 全网发布流进入 appid值为wx570bc396a51b8ff8if (appid.Contains("wx570bc396a51b8ff8"))//微信官方测试账号,用来全网发布测试的
                {var openId = message.Body.FromUserName.Value;var myUserName = message.Body.ToUserName.Value;WriteTxt.RecodeBug(string.Format("1官方微信测试账号进入 event={0},openID={1}, myUserName={2}", message.Type, openId, myUserName), "/merchant_receive.txt");#region 全网发布eventif (message.Type == WeixinMessageType.Event){string content = string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName>" +"<FromUserName><![CDATA[{1}]]></FromUserName>" +"<CreateTime>{2}</CreateTime>" +"<MsgType><![CDATA[text]]></MsgType>" +"<Content><![CDATA[{3}]]></Content></xml>",openId, myUserName, Util.CreateTimestamp(), message.Body.Event.Value.ToString() + "from_callback");WriteTxt.RecodeBug(string.Format("2全网发布事件返回内容content={0},safeMode={1}", content, safeMode), "/merchant_receive.txt");#region 加密if (safeMode){var msg_signature = Request.QueryString.Get("msg_signature");var wxBizMsgCrypt = new WXBizMsgCrypt(CachedConfigContext.Current.WeixinOpenConfig.Token,CachedConfigContext.Current.WeixinOpenConfig.EncodingAESKey,CachedConfigContext.Current.WeixinOpenConfig.AppID);var ret = wxBizMsgCrypt.EncryptMsg(content, timestamp, nonce, ref encryptMsg);if (ret != 0)//加密失败
                            {//TODO:开发者加密失败的业务处理逻辑//Log4NetHelper.Info(string.Format("encrypt message return {0}, response body {1}", ret, response));WriteTxt.RecodeBug(string.Format("2商户接收信息,加密失败:encrypt message return {0}, response body {1}", ret, encryptMsg), "/merchant_receive.txt");}else{WriteTxt.RecodeBug(string.Format("2商户接收信息,加密成功:encrypt message return {0}, response body {1}", ret, encryptMsg), "/merchant_receive.txt");}}else{encryptMsg = content;}#endregionreturn new ContentResult{Content = encryptMsg,ContentType = "text/xml",ContentEncoding = System.Text.UTF8Encoding.UTF8};} #endregion#region 全网发布textelse if (message.Type == WeixinMessageType.Text){string con = message.Body.Content.Value.ToString();WriteTxt.RecodeBug(string.Format("2全网发布Text中的content={0},\"TESTCOMPONENT_MSG_TYPE_TEXT\".Equals(con)={1}", con, "TESTCOMPONENT_MSG_TYPE_TEXT".Equals(con)), "/merchant_receive.txt");//全网发布中,立即返回信息到粉丝#region 全网发布text,立即返回if ("TESTCOMPONENT_MSG_TYPE_TEXT".Equals(con)){string content = string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName>" +"<FromUserName><![CDATA[{1}]]></FromUserName>" +"<CreateTime>{2}</CreateTime>" +"<MsgType><![CDATA[text]]></MsgType>" +"<Content><![CDATA[{3}]]></Content></xml>",openId, myUserName, Util.CreateTimestamp(), "TESTCOMPONENT_MSG_TYPE_TEXT_callback");WriteTxt.RecodeBug(string.Format("3全网发布TEXT 立即回复 content={0},safeMode={1}", content, safeMode), "/merchant_receive.txt");#region 加密if (safeMode){var msg_signature = Request.QueryString.Get("msg_signature");var wxBizMsgCrypt = new WXBizMsgCrypt(CachedConfigContext.Current.WeixinOpenConfig.Token,CachedConfigContext.Current.WeixinOpenConfig.EncodingAESKey,CachedConfigContext.Current.WeixinOpenConfig.AppID);var ret = wxBizMsgCrypt.EncryptMsg(content, timestamp, nonce, ref encryptMsg);if (ret != 0)//加密失败
                                {//TODO:开发者加密失败的业务处理逻辑//Log4NetHelper.Info(string.Format("encrypt message return {0}, response body {1}", ret, response));WriteTxt.RecodeBug(string.Format("2商户接收信息,加密失败:encrypt message return {0}, response body {1}", ret, encryptMsg), "/merchant_receive.txt");}else{WriteTxt.RecodeBug(string.Format("2商户接收信息,加密成功:encrypt message return {0}, response body {1}", ret, encryptMsg), "/merchant_receive.txt");}}else{encryptMsg = content;}#endregion//直接返回不太对,直接将加密判断给领过来了(上面)return new ContentResult{Content = encryptMsg,ContentType = "text/xml",ContentEncoding = System.Text.UTF8Encoding.UTF8};}#endregion#region 全网发布text 客服接口发送else{string content = message.Body.Content.Value.ToString();WriteTxt.RecodeBug(string.Format("3content={0}", content), "/merchant_receive.txt");if (content.StartsWith("QUERY_AUTH_CODE", true, System.Globalization.CultureInfo.CurrentCulture)){string temp = content.Split(':')[1];WriteTxt.RecodeBug(string.Format("QUERY_AUTH_CODE拿到的值={0}", temp), "/merchant_receive.txt");HttpContext.Response.Write("");WriteTxt.RecodeBug(string.Format("全网发布text客服回复start"), "/merchant_receive.txt");var ourPublic = ServiceContext.Current.WeixinOpenService.GetWxSetting();string componentAccessToken = ourPublic.ComponentAccessToken;QueryAuthData data = Qxun.Framework.Weixin.Open.ComponentAPI.QueryAuthorization(componentAccessToken, CachedConfigContext.Current.WeixinOpenConfig.AppID, temp);ReplayActiveMessageAPI.RepayText(data.authorization_info.authorizer_access_token, openId, temp + "_from_api");WriteTxt.RecodeBug(string.Format("4全网发布text客服回复end"), "/merchant_receive.txt");return Content("success");}}#endregion} #endregion}#endregion//进入消息获取分析方法 Executevar response = WeixinExecutor.Execute(message, mpn.MerchantID);#region 加密if (safeMode){var msg_signature = Request.QueryString.Get("msg_signature");var wxBizMsgCrypt = new WXBizMsgCrypt(CachedConfigContext.Current.WeixinOpenConfig.Token,CachedConfigContext.Current.WeixinOpenConfig.EncodingAESKey,CachedConfigContext.Current.WeixinOpenConfig.AppID);var ret = wxBizMsgCrypt.EncryptMsg(response, timestamp, nonce, ref encryptMsg);if (ret != 0)//加密失败
                    {//TODO:开发者加密失败的业务处理逻辑//Log4NetHelper.Info(string.Format("encrypt message return {0}, response body {1}", ret, response));WriteTxt.RecodeBug(string.Format("2商户接收信息,加密失败:encrypt message return {0}, response body {1}", ret, response), "/merchant_receive.txt");}}else{encryptMsg = response;}#endregion}catch (Exception e){WriteTxt.RecodeBug(string.Format("10Exception:商户接受信息,出现异常:{0}", e.Message), "/merchant_receive.txt");}return new ContentResult{Content = encryptMsg,ContentType = "text/xml",ContentEncoding = System.Text.UTF8Encoding.UTF8};}
微信全网发布相关代码

官网文档说明:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318611&lang=zh_CN

官网上的总结主要有以下几点:

1.微信会拿一个公众号来进行测试,其appid的值就是下面这个了,主要用来和原来的代码进行区分,不要将自己正常的运行也给弄进去了

  1. (1)appid: wx570bc396a51b8ff8

  2. (2)Username: gh_3c884a361561

2.这里的检测有三种,这里,由于百度的时候,有些都说不要加密,这一点我也不好直接说不对,不过之前有一次使用的时候,没有经过加密判断,就失败了

var safeMode = Request.QueryString.Get("encrypt_type") == "aes";
string encryptMsg="";
#region 加密if (safeMode){var msg_signature = Request.QueryString.Get("msg_signature");var wxBizMsgCrypt = new WXBizMsgCrypt(CachedConfigContext.Current.WeixinOpenConfig.Token,CachedConfigContext.Current.WeixinOpenConfig.EncodingAESKey,CachedConfigContext.Current.WeixinOpenConfig.AppID);var ret = wxBizMsgCrypt.EncryptMsg(content, timestamp, nonce, ref encryptMsg);if (ret != 0)//加密失败
                            {//TODO:开发者加密失败的业务处理逻辑//Log4NetHelper.Info(string.Format("encrypt message return {0}, response body {1}", ret, response));WriteTxt.RecodeBug(string.Format("2商户接收信息,加密失败:encrypt message return {0}, response body {1}", ret, encryptMsg), "/merchant_receive.txt");}else{WriteTxt.RecodeBug(string.Format("2商户接收信息,加密成功:encrypt message return {0}, response body {1}", ret, encryptMsg), "/merchant_receive.txt");}}else{encryptMsg = content;}#endregion
判断是否加密

 

第一种:推送事件消息,返回的信息Content值得是

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>

接收的Event的值+ "from_callback"

传回去的content 格式 ,我这边的设置,因为传回去的都是text类型,推送普通文本信息也是text的

 

string content = string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName>" +"<FromUserName><![CDATA[{1}]]></FromUserName>" +"<CreateTime>{2}</CreateTime>" +"<MsgType><![CDATA[text]]></MsgType>" +"<Content><![CDATA[{3}]]></Content></xml>",openId, myUserName, Util.CreateTimestamp(), message.Body.Event.Value.ToString() + "from_callback");

 

return new ContentResult{Content = content,ContentType = "text/xml",ContentEncoding = System.Text.UTF8Encoding.UTF8};

 

微信事件推送链接:

https://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html

第二种:返回普通文本消息

这个传进来和传回去的内容都是固定的,传入的值会是"TESTCOMPONENT_MSG_TYPE_TEXT",传回去的值必须是"TESTCOMPONENT_MSG_TYPE_TEXT_callback"

至于为什么固定了传入的值,是为了区分下面那种客服回复的情况。所以这种情况就要判断一下是否content是否等于TESTCOMPONENT_MSG_TYPE_TEXT,contains也是可以的

这个返回信息和上面那个差不多

第三种:返回API文本消息

传入的Content会是:QUERY_AUTH_CODE:$query_auth_code$ 这样的,$query_auth_code$是要用的的值,需要截取出来。用string.Split(':')[1]就可以了,反正微信那边传过来都是绝对符合格式的

因为这个需要先返回个空字符串,c#这边用这种写法就可以了。当然不能在这里就给return了,我们还得继续那客服发信息的接口呢。

需要拿到的有:我们公众号作为被授权方的 ComponentAccessToken,我们公众号的appid,以及之前截取的$query_auth_code$这个拿到的值

调用https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token={0}这个接口,post传值 :component_appid和authorization_code —— 这个是用来获取 authorization_info授权信息内的authorizer_access_token的

微信API文档地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=fdc4e8827bb64f7892affcca13cc451abc6581df&lang=zh_CN

 

拿到authorizer_access_token之后,就可以调用客服发送信息的接口了https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}

 

客服发送信息的官方接口:https://mp.weixin.qq.com/wiki/1/70a29afed17f56d537c833f89be979c9.html

以上三种就差不多了

当然,这些的前提是,项目测试授权正常。

 

总觉得没有失败的图不好,就跑去人家那边截了个图过来

 

 

上面的都是2016-07-27晚上八点左右写的

 

今天去查看了一下,已经发布成功了,过了十多个小时吧,一天内就通过了,微信处理挺快的呢

转载于:https://www.cnblogs.com/danlis/p/5712541.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix 钉钉报警

话不多说&#xff0c;咱们直接进入正题钉钉报警时基于zabbix&#xff0c;访问钉钉应用接口去推送的报警消息&#xff0c;所以我们需要一个在钉钉创建一个报警应用1、 我做的钉钉报警是基于钉钉自定义应用进行推送的所以需要登录钉钉管理后台进行创建&#xff08;zabbix自定义应…

于敦德:途牛五大战略纵深不惧同质化竞争

&#xfeff;&#xfeff;于敦德说&#xff0c;途牛已经在目的地、出发地、产品系列、客户和品牌五个领域建立起了纵深壁垒&#xff0c;不担心任何局部竞争&#xff0c;将坚决把局部同质化战争打到底。 一个行业的两种公司 包括旅游在内的很多行业通常都有两种公司&#xff1a;…

自定义线程的方式

2019独角兽企业重金招聘Python工程师标准>>> package com.javaxxz.test;public class Demo extends Thread {/*** 创建线程的方式* 方式一&#xff1a;* 1、自定义一个类继承Thread类* 2、重写Thread类的run方法,把自定线程的任务代码写在run方法中* …

20155204 2016-2017-2 《Java程序设计》第8周学习总结

学号 2016-2017-2 《Java程序设计》第X周学习总结 教材学习内容总结 想要取得channel的操作对象&#xff0c;可以使用channels类&#xff0c;它定义了静态方法newChannel()。Buffer的直接子类们都有一个alloocate()方法&#xff0c;可以让你指定Buffer容量。1.java.util.loggin…

HALCON示例程序train_characters_ocr.hdev使用SVM分类器训练字体

HALCON示例程序train_characters_ocr.hdev使用SVM分类器训练字体 小哥哥小姐姐觉得有用点个赞呗&#xff01; 示例程序源码&#xff08;加注释&#xff09; 蓝色字体均为算子解释链接&#xff0c;可以前往查看解答 关于显示类函数解释 read_image (Image, ‘ocr/chars_tra…

安装DirectX SDK时出现Error Code:s1023 的解决方案

&#xfeff;&#xfeff;安装DXSDK_Jun10时&#xff08;下载地址&#xff1a;http://www.microsoft.com/en-us/download/confirmation.aspx?id6812 ) 出现下图所示错误 Error Code:s1023 计算机上有安装过更新版的Microsoft Visual C 2010 Redistributable&#xff0c;打开“…

顶级数据库行会Percona阿里全面解析下一代云数据库技术

摘要&#xff1a; 几年前&#xff0c;数据库管理系统的企业市场似乎还如同铜墙铁壁&#xff0c;除了老牌厂商外&#xff0c;其他厂商休想打进来。随着移动互联、物联网技术的发展&#xff0c;多终端应用的时代悄然而至。结构化与非结构化数据的爆发&#xff0c;推动人类社会进入…

C#指定窗口显示位置的方法

小哥哥小姐姐觉得有用点个赞呗&#xff01; C#指定窗口显示位置的方法 1.使用StartPosition MainForm mainform; mainformnew MainForm (); dlgCtrl.StartPosition FormStartPosition.Manual;下面是FormStartPosition里边的定义与解释 // 指定窗体的初始位置。public …

C# 修改项目文件夹名称完全版

目录步骤1、打开项目&#xff0c;修改文件名称2、更改命名空间名称3、在解决方案中用txt1000替换所有test5004、使用记事本打开项目文件&#xff08;.sln文件&#xff09;修改路径5、更改项目文件夹名称6、删除之前的残留文件7、大功告成&#xff01;&#xff01;&#xff01;&…

js中遍历注册事件时索引怎么获取

注意&#xff1a;这种写法&#xff0c;是有问题的。注册事件是在页面加载完毕以后就完成了&#xff0c;但此时并没有触发事件。事件触发是由用户在页面上点击时才会触发&#xff0c;所以说当用户点击时&#xff0c;才会执行事件处理函数&#xff0c;那么此时的i已经变成了4&…

C#DotNetBar TabControl将水平标签设置成竖直

小哥哥小姐姐觉得有用点个赞呗&#xff01; 首先选中整个TabControl控件 更改属性&#xff1a; 完成

使用 Drone 构建 Coding 项目

2019独角兽企业重金招聘Python工程师标准>>> 使用 Drone 构建 Coding 项目 Drone 是一个轻量级的持续集成工具。它具备许多现代持续集成工具的特性&#xff1a;轻巧&#xff08;Docker 镜像不到 10M&#xff09;、部署方便&#xff08;docker-compose 一键部署&…

Visual Studio Code 常用插件整理

常用插件说明&#xff1a; 一、HTML Snippets 超级使用且初级的H5代码片段以及提示 二、HTML CSS Support 让HTML标签上写class智能提示当前项目所支持的样式 三、Debugger for Chrome 让vscode映射chrome的debug功能&#xff0c;静态页面都可以用vscode来打断点调试、配饰稍…

川崎机器人c#通讯(转)

由于本人在工业自动化行业做机器视觉的工作&#xff0c;所以除了图像处理方面要掌握外&#xff0c;还需要与工业机器人进行通信。最近学习了计算机与川崎机器人的TCP/IP通信&#xff0c;于是在这里记录一下。 除了直接与机器人通信外&#xff0c;有一种方式是通过PLC间接通信&a…

模板类 Template Classes 以及模板类编译时的处理

&#xfeff;&#xfeff;我们可以建立template classes&#xff0c;使它们能够神奇地操作任何类型的资料。下面这个例子是让CThree 类别储存三个成员变量&#xff0c;成员函数Min 传回其中的最小值&#xff0c;成员函数Max 则传回其中的最大值。我们把它设计为template class&…

行转列及列转行查询

开发过程中常遇到行转列或是列转行的问题&#xff0c;即需要将数据库中一张表信息进行行转列操作&#xff0c;再将每列&#xff08;即每个字段&#xff09;作为与其他表进行联表查询的字段进行显示。 一、行转列&#xff1a;将原来同一列下多行的不同内容作为多个字段&#xff…

一、Java语言基础(4)_方法和数组——数组

2018-04-25 不悔梦归处&#xff0c;只恨未尽心 数组 一、一维数组 数组的含义&#xff1a;具有相同类型的多个变量按有序形式组织起来的数据形式。&#xff08;数组是用来存储固定大小的同类型元素。&#xff09;数组的定义&#xff1a;方式1&#xff08;推荐使用&#xff09;&…

create_metrology_model创建测量几何形状所需的数据结构(原理)

目录create_metrology_model&#xff08;算子&#xff09;描述二维计量的基本原理创建计量模型数据结构提供近似值修改模型参数修改对象参数对齐计量模型应用测量访问结果清理记忆注意参数create_metrology_model&#xff08;算子&#xff09; create_metrology_model - 创建测…

iOS开发UI篇—字典转模型

一、能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 1 //2 // LFViewController.m3 // 03-应用管理4 //5 // Created by apple on 14-5-22.6 // Copyright (c) 2014年 heima. All rights reserved.7 //8 9 #import "LFViewController.h" 10 11 i…

Codechef:Path Triples On Tree

Path Triples On Tree 题意是求树上都不相交或者都相交的路径三元组数量。 发现blog里没什么树形dp题&#xff0c;也没有cc题&#xff0c;所以来丢一道cc上的树形dp题。 比较暴力&#xff0c;比较恶心 #include<cstdio> #include<algorithm> #define MN 300001 #de…