最近做微信支付遇到的幾個(gè)問(wèn)題,記錄一下
1.成功支付后回調(diào)
支付成后回調(diào),由于是用wcf寫(xiě)的restful風(fēng)格的api,原本官方demo返回的是一個(gè)xml數(shù)據(jù),讀取方法是通過(guò)
HttpContext.Current.Request.InputStream來(lái)讀取的,監(jiān)聽(tīng)到回調(diào)方法獲取到InputStream的Length為0,
但是從WebServiceHostFactory監(jiān)聽(tīng)到的這個(gè)對(duì)象是有值的,于是就考慮是不是要修改webconfig配置,來(lái)
修改behavior,結(jié)果無(wú)功而返,后來(lái)從網(wǎng)上找到,wcf讀取post報(bào)文是用OperationContext.Current.RequestContext.RequestMessage,成功讀到對(duì)應(yīng)的值
2.退款問(wèn)題
一開(kāi)始退款功能開(kāi)發(fā)參看支付訂單的接口,直接用postman測(cè)試接口,發(fā)現(xiàn)接口怎么都調(diào)不通,一度想去咨詢微信客服,后來(lái)在開(kāi)發(fā)文檔中發(fā)現(xiàn),是需要雙向證書(shū)驗(yàn)證的,如圖
按照步驟去下載證書(shū)文件,并且按照指示雙擊安裝,下載了官方的demo正常跑起來(lái),
然后把同樣的方法寫(xiě)入自己的接口,結(jié)果還是連不通微信接口的,基礎(chǔ)連接關(guān)閉,百思不得其解,
同樣的代碼官方的winform程序能跑起來(lái),我的接口跑不起來(lái)次酌??代碼如下
于是就考慮是不是又和wcf的配置有關(guān),按照網(wǎng)上找的資料修改了webconfig,把a(bǔ)spNetCompatibilityEnabled="true",結(jié)果還是不行,后面想到會(huì)不會(huì)和iis有關(guān),上網(wǎng)一找,
基礎(chǔ)連接已關(guān)閉 連接被意外關(guān)閉 其實(shí)是沒(méi)訪問(wèn)到證書(shū)谷婆,會(huì)不會(huì)和IIS有關(guān)系能,后來(lái)得證果然證書(shū)是需要添加IIS_User角色,配置完成后,終于,正常調(diào)用了
解決方法是
1.開(kāi)始-運(yùn)行 輸入mmc
2.文件-添加/刪除管理單元 在可用的管理單元中選擇 證書(shū) 添加到右側(cè) 彈框選擇計(jì)算機(jī)帳戶
3.展開(kāi)個(gè)人-證書(shū) 選擇你導(dǎo)入的證書(shū)或從這里右鍵導(dǎo)入
4.右擊證書(shū)-所有任務(wù)-管理私鑰
5.添加IIS_IUser 勾選讀取就行
3.退款回調(diào)
這里也是一個(gè)小坑,退款回調(diào)里面有一個(gè)req_info的加密值,根據(jù)官方的介紹,需要base64解碼后根據(jù)商戶號(hào)相關(guān)的秘鑰再AES解密,如圖
后按照步驟base64解碼再AES解密,發(fā)現(xiàn)一只保存,提示存在非base64字符,于是監(jiān)聽(tīng)發(fā)現(xiàn),原來(lái)req_info本來(lái)就是base64,直接用MD5的key進(jìn)行AES解密,得到相關(guān)的信息
4.回調(diào)告知微信
2個(gè)回調(diào)通知,一個(gè)是退款回調(diào),需在微信后臺(tái)設(shè)置url,一個(gè)是支付回調(diào),在申請(qǐng)訂單的時(shí)候帶上,另外就是回調(diào)后如何告知微信端我已經(jīng)收到回調(diào),官方的解釋是返回一傳xml數(shù)據(jù)如下:
但是實(shí)際上回復(fù)succes或者fail即可,中間遇到的問(wèn)題是我回復(fù)了結(jié)果后,微信還是會(huì)多次回調(diào)結(jié)果給我,用SNAP抓包軟件查看一切正常,(微信IP->我的IP,我的IP返回結(jié)果給微信IP)后面把回調(diào)后我這邊的邏輯代碼注銷掉,回復(fù)結(jié)果就正常結(jié)束支付.再觀察SNAP,發(fā)現(xiàn)我的邏輯中間有一次調(diào)用第三方的接口,多了一個(gè)HttpWebRequest請(qǐng)求第三方充值的功能,(微信ip->我的IP,我的IP->第三方接口ip,第三方接口回復(fù)結(jié)果到我的ip,我的ip最后把處理結(jié)果反饋給微信ip)我把這一句注銷掉后也是正常,后面就考慮是否超時(shí)或者HTTPCONTEXT被改變了,結(jié)果我把這段邏輯代碼用asyn/await去做協(xié)程處理(之前有一個(gè)老哥告訴了我kotlin有協(xié)程這樣的一個(gè)概念,剛好運(yùn)用上了),于是加上了異步處理,把支付回調(diào)反饋給微信端的結(jié)果馬上response回去,這下就正常了,asyn的task也照樣能跑,但是最后還是搞不懂為什么同步下去的不會(huì)正晨得回饋給微信端……
最后
終于,完成了所有支付到退款的流程,感覺(jué)微信的策略還是很嚴(yán)謹(jǐn)靠譜的,但是坑太多,個(gè)人感覺(jué)還是阿里的API寫(xiě)得比較穩(wěn)一點(diǎn),以上還是把支付流程封住成一個(gè)類,并且記錄一下,以免以后再遇到同樣的坑,接下來(lái)繼續(xù)研究sip,開(kāi)源的C++項(xiàng)目……