C#微信开发小白成长教程二(新手接入指南,附视频)
距離第一講又已經(jīng)過去了一個(gè)多星期了,本打算一周更新一講的,奈何實(shí)在太忙。最近也在群里發(fā)現(xiàn)有一部分人已經(jīng)可以熟練調(diào)用微信的部分接口但卻不是很清楚微信公眾平臺(tái)接收消息的一個(gè)處理機(jī)制。本講就來介紹下怎么接入開發(fā)者的服務(wù)器。
接入微信公眾平臺(tái)開發(fā),開發(fā)者需要按照如下步驟完成:
1、填寫服務(wù)器配置2、驗(yàn)證服務(wù)器地址的有效性3、依據(jù)接口文檔實(shí)現(xiàn)業(yè)務(wù)邏輯 舉個(gè)形象的例子:比如在抗戰(zhàn)時(shí)期,各個(gè)軍隊(duì)之間需要進(jìn)行通訊,在戰(zhàn)場(chǎng)上軍情的保密是很重要的。所以A、B兩個(gè)軍隊(duì)事先約定好了接頭的暗號(hào)(token),所有的書信都是需要使用密文的(加密方式也已經(jīng)約定好了)。假如現(xiàn)在A(微信服務(wù)器)收到上級(jí)(用戶)命令需要和B(開發(fā)者服務(wù)器)聯(lián)合作戰(zhàn),但上級(jí)與B軍隊(duì)之間無法進(jìn)行直接的溝通,那么現(xiàn)在就由A將指令告訴給B,B收到指定后,根據(jù)事先約定好的解密方式和暗號(hào)(token)解密成功后,派個(gè)通訊兵告訴A,說已經(jīng)收到他們的信息了,那么A和B之間的通訊就建立起來了。假如A和B之間的加密方式被敵軍C竊取到了,但C不知道他們之間的暗號(hào),所以C就算知道了加密方式也無法冒充A與B進(jìn)行通訊。所以,在整個(gè)通訊的過程中,token是至關(guān)重要的。填寫服務(wù)器配置
此操作的目的就是告訴微信服務(wù)器開發(fā)者的服務(wù)器在哪兒,已經(jīng)他們之間的通訊口令。 ? 校驗(yàn)服務(wù)器地址的有效性 開發(fā)者在接入時(shí),微信服務(wù)器將發(fā)送get請(qǐng)求到你填寫的url上,此請(qǐng)求攜帶四個(gè)參數(shù),分別signature(微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請(qǐng)求中的timestamp參數(shù)、nonce參數(shù)。),timestamp(時(shí)間戳),nonce(隨機(jī)數(shù)),echostr(隨機(jī)字符串).用HttpContext.Current.Request.RawUrl可以獲取當(dāng)前請(qǐng)求的原始url,如下圖所示: ? ?
開發(fā)者通過檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)(下面有校驗(yàn)方式)。若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
加密/校驗(yàn)流程如下: 1. 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序 2. 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密 3. 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信。 ? 下面我們一步步來實(shí)現(xiàn)這個(gè)流程 1、獲取token、timestamp、nonce,并字典序排序 var signature = context.Request.QueryString["signature"]; var timestamp = context.Request.QueryString["timestamp"]; var nonce = context.Request.QueryString["nonce"]; var echostr = context.Request.QueryString["echostr"];var arr = new[] {token, timestamp, nonce};Array.Sort(arr);??? 2. 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
var tempstr = string.Join("", arr);var tempsign = FormsAuthentication.HashPasswordForStoringInConfigFile(tempstr, "sha1").ToLower();?? 3. 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信。
if (signature == tempsign) {context.Response.Write(echostr); }? 由于接入的時(shí)候,微信服務(wù)器發(fā)送的是get請(qǐng)求,接入之后轉(zhuǎn)發(fā)的消息是post的請(qǐng)求,所以可以根據(jù)請(qǐng)求的方式來判斷當(dāng)前是接入還是接入后的消息推送。
完整的代碼如下所示:
public void ProcessRequest(HttpContext context){string token = "qqq";if (context.Request.HttpMethod == "GET"){//說明是接入請(qǐng)求var signature = context.Request.QueryString["signature"];var timestamp = context.Request.QueryString["timestamp"];var nonce = context.Request.QueryString["nonce"];var echostr = context.Request.QueryString["echostr"];var arr = new[] {token, timestamp, nonce};Array.Sort(arr);var tempstr = string.Join("", arr);var tempsign = FormsAuthentication.HashPasswordForStoringInConfigFile(tempstr, "sha1").ToLower();if (signature == tempsign){context.Response.Write(echostr);}}else{//接收消息處理}? ? ?注:可能由于微信服務(wù)器的緩存問題,接入成功后,現(xiàn)在不會(huì)立即生效。
???? 附視頻教程:http://pan.baidu.com/s/1GwsVk
???? 本人才疏學(xué)淺,人丑錢少臉皮薄,所以文章或視頻中有錯(cuò)誤或不妥之處,歡迎各位同仁指教。
???? 如有疑問加群一起交流,我需要廣大屌絲小伙伴的反饋與建議,??
???? 如果覺得本文對(duì)你有幫助,請(qǐng)點(diǎn)擊文章下面的推薦哦,去幫助更多的小伙伴了解微信開發(fā)的流程。
???? 如果你是土豪,想支持筆者繼續(xù)更新本系列教程,可以掃描下面的二維碼懸賞一下,你的支持是筆者繼續(xù)更新下去的動(dòng)力。
???? 如果你司需求微信開發(fā)項(xiàng)目合作,可以私聊我QQ。
轉(zhuǎn)載于:https://www.cnblogs.com/zskbll/p/4562373.html
總結(jié)
以上是生活随笔為你收集整理的C#微信开发小白成长教程二(新手接入指南,附视频)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [git]git忽略文件
- 下一篇: Brainfuck解释器(C#)