微信開放平臺全網發布時,檢測失敗 —— 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.pswp.cn/news/254830.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254830.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254830.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

halcon reduce_ocr_class_svm 縮減基于SVM的OCR分類器。

目錄reduce_ocr_class_svm&#xff08;算子&#xff09;描述參數reduce_ocr_class_svm&#xff08;算子&#xff09; reduce_ocr_class_svm - 縮減基于SVM的OCR分類器。 reduce_ocr_class_svm&#xff08;:: OCRHandle&#xff0c;Method&#xff0c;MinRemainingSV&#xff…

Zabbix 釘釘報警

話不多說&#xff0c;咱們直接進入正題釘釘報警時基于zabbix&#xff0c;訪問釘釘應用接口去推送的報警消息&#xff0c;所以我們需要一個在釘釘創建一個報警應用1、 我做的釘釘報警是基于釘釘自定義應用進行推送的所以需要登錄釘釘管理后臺進行創建&#xff08;zabbix自定義應…

七大因素阻礙非標自動化行業發展,那么應對的策略是什么呢?

&#xfeff;&#xfeff; 非標自動化機械相對于標準機械而言&#xff0c;是可以根據企業需要量身定做的設備&#xff0c;可以實現標準機械所不能實現的一些功能&#xff0c;實現標準件不可能達到的產量。例如在注塑行業中&#xff0c;眾多注塑企業根據自身實際情況通過制造業自…

單播、多播(組播)和廣播的區別

單播、多播和廣播單播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“廣播”&#xff08;Broadcast&#xff09;這三個術語都是用來描述網絡節點之間通訊方式的術語。那么這些術語究竟是什么意思&#xff1f;區別何在&#xff1f;1.單播&am…

數據庫資源博客---小麥苗BEST

http://blog.csdn.net/lihuarongaini/article/details/60584577 http://blog.csdn.net/lihuarongaini/article/details/68485838轉載于:https://www.cnblogs.com/zengkefu/p/6718754.html

halcon write_ocr_class_svm 將OCR分類器寫入文件

目錄write_ocr_class_svm&#xff08;運算符&#xff09;描述參數write_ocr_class_svm&#xff08;運算符&#xff09; write_ocr_class_svm - 將OCR分類器寫入文件。 write_ocr_class_svm&#xff08;:: OCRHandle&#xff0c;FileName ? 描述 write_ocr_class_svm將OCR分…

jQuery插件備忘

jQuery BlockUI Plugin 遮罩插件 http://malsup.com/jquery/block/ artDialog是一個基于javascript編寫的對話框組件&#xff0c;它擁有精致的界面與友好的接口 …

于敦德:途牛五大戰略縱深不懼同質化競爭

&#xfeff;&#xfeff;于敦德說&#xff0c;途牛已經在目的地、出發地、產品系列、客戶和品牌五個領域建立起了縱深壁壘&#xff0c;不擔心任何局部競爭&#xff0c;將堅決把局部同質化戰爭打到底。 一個行業的兩種公司 包括旅游在內的很多行業通常都有兩種公司&#xff1a;…

活在當下吧

‘’你得為你自己而活&#xff0c;想要什么就去爭取&#xff0c;不要干等著以為別人會施舍給你&#xff0c;也不要在意別人的眼光和看法&#xff0c;你首先得考慮的是你自己。” “你要明白&#xff0c;只有當你自己在乎自己的時候&#xff0c;別人才會用正眼看你&#xff0c;才…

ptime概述

官方給出的ptime的定義是&#xff1a;ptime gives the length of time in milliseconds represented by themedia in a packet。簡單來講就是一個數據包中媒體的時長&#xff0c;以毫秒為單位。比如&#xff1a;ptime:20就是定義為20毫秒。 每種媒體的時間是不一樣。比如&#…

halcon clear_ocr_class_svm 清除基于SVM的OCR分類器

目錄clear_ocr_class_svm&#xff08;算子&#xff09;描述參數&#xff1a;clear_ocr_class_svm&#xff08;算子&#xff09; clear_ocr_class_svm - 清除基于SVM的OCR分類器。 clear_ocr_class_svm&#xff08;:: OCRHandle ? 描述 clear_ocr_class_svm清除OCRHandle給…

自定義線程的方式

2019獨角獸企業重金招聘Python工程師標準>>> package com.javaxxz.test;public class Demo extends Thread {/*** 創建線程的方式* 方式一&#xff1a;* 1、自定義一個類繼承Thread類* 2、重寫Thread類的run方法,把自定線程的任務代碼寫在run方法中* …

如何使用思維導圖

&#xfeff;&#xfeff;思?維?導?圖?比?較?容?易?,?因?為?我?們?平?時?都?是?這?樣?思?考?,?但?參?考?一?些?思?維?導?圖?練?習?案?例?,?還?是?有?幫?助?的?,?使?我?們?做?的?更?好?!

Linux下基于C/C++的Socket編程基礎

什么是Socket Socket接口是TCP/IP網絡的API&#xff0c;Socket接口定義了許多函數或例程&#xff0c;程序員可以用它們來開發TCP/IP網絡上的應用程序。要學Internet上的TCP/IP網絡編程&#xff0c;必須理解Socket接口。 Socket接口設計者最先是將接口放在Unix操作系統里面的。如…

tyvj 1059 過河 dp

P1059 過河時間: 1000ms / 空間: 131072KiB / Java類名: Main背景 NOIP2005 提高組 第二道描述 在河上有一座獨木橋&#xff0c;一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子&#xff0c;青蛙很討厭踩在這些石子上。由于橋的長度和青蛙一次跳過的距離都 是正整…

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…

《信息系統安全等級保護定級報告》

《信息系統安全等級保護定級報告》一、XXX信息系統描述簡述確定該系統為定級對象的理由。從三方面進行說明&#xff1a;一是描述承擔信息系統安全責任的相關單位或部門&#xff0c;說明本單位或部門對信息系統具有信息安全保護責任&#xff0c;該信息系統為本單位或部門的定級對…

安裝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;打開“…

Linux下C++ UDP Socket例子

這里我們給出了linux下C的socket代碼如下&#xff1a; #include <iostream> #include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h> #include <…