最近比較工作比較輕松,幫一個(gè)朋友的基于ecshop開(kāi)發(fā)的商城加入微信掃描支付功能,本以為是很簡(jiǎn)單的事兒——下載官方sdk或開(kāi)發(fā)幫助文檔,按著里面的做就ok了,誰(shuí)知折騰了兩三天的時(shí)間才算搞定,中間也帶著疑問(wèn)在網(wǎng)上找了不少技術(shù)文章,卻發(fā)現(xiàn)都只是比較粗略的寫(xiě)他們是怎么開(kāi)發(fā)接入的,并沒(méi)有解決我遇到的問(wèn)題...,唉,有時(shí)候真心的感覺(jué)‘只能靠自己'。
本文就是想把自己遇到的問(wèn)題及解決辦法寫(xiě)出來(lái),讓做這方面開(kāi)發(fā)的朋友有所幫助!
開(kāi)發(fā)之前,先查看官方【掃碼支付】開(kāi)發(fā)文檔,掃碼支付分為以下兩種模式:
△模式一:
遇到的問(wèn)題:第一次掃描二維碼還能正常掃描,未付款再次掃描會(huì)提示:ok 或 請(qǐng)求商戶(hù)信息超時(shí)HttpCode非200——此問(wèn)題嘗試通過(guò)各種途徑尋找解決辦法都無(wú)果,在這里希望有知道朋友能給與解答,謝謝!
△模式二:
注意:不可以直接用商城的訂單號(hào)作為交易訂單號(hào)(out_trade_no),否則再次生成微信掃碼支付二維碼時(shí),接口會(huì)提示:商戶(hù)訂單號(hào)重復(fù),無(wú)法重新生成。
那么醬紫問(wèn)題來(lái)了,應(yīng)該怎樣設(shè)置交易訂單號(hào),還能保證后面通過(guò)接口查詢(xún)微信商戶(hù)平臺(tái)里的相應(yīng)訂單信息或?qū)崿F(xiàn)對(duì)賬?可行的辦法是:掃碼之前的統(tǒng)一下單接口,out_trade_no不要傳入商城訂單系統(tǒng)的訂單號(hào),而是重新生成一個(gè)新的唯一流水;再增加一個(gè)訂單號(hào)和微信支付交易訂單號(hào)(out_trade_no)對(duì)應(yīng)表,如下:
上表中有個(gè)serial_is_paid字段:用于標(biāo)記此交易是否已完成,即:在支付成功通知回調(diào)處理中,根據(jù)回傳的out_trade_no更新支付狀態(tài);至于怎么查詢(xún)訂單支付狀態(tài),想必你應(yīng)該也知道了...
好了,很久沒(méi)寫(xiě)技術(shù)博客有些找不到感覺(jué),寫(xiě)的可能比較粗略,有不清楚的朋友可以留意&交流!
到處都是坑的微信支付V3之 微信支付回調(diào)頁(yè)面
據(jù)上次 到處都是坑的微信支付V3 后很多園友在被虐了千百遍后終于跳轉(zhuǎn)到了親切的微信支付界面,但輸入密碼支付后卻不知道怎么處理了,接下來(lái)補(bǔ)上支付后的處理流程。
1. html中根據(jù)前臺(tái)支付后反饋信息成功與否跳轉(zhuǎn)到相關(guān)頁(yè)面
1
2
3
4
5
6
|
if (res.err_msg == "get_brand_wcpay_request:ok" ) { // message: "微信支付成功!", window.location.replace( "@Url.Content(" ~/WxPay/Success?ordercode=@(Model.order_no)")); } else if (res.err_msg == "get_brand_wcpay_request:cancel" ) { // message: "已取消微信支付!" } |
2. 支付開(kāi)發(fā)教程(微信商戶(hù)平臺(tái)版) 中下載 微信支付接口文檔及demo(公眾賬號(hào)).zip
返回的參數(shù)參考接口文檔中 4.2.通用通知接口 一節(jié)。
通知 URL是 4.1 節(jié)中提交的參數(shù) notify_url ,支付完成后,微信 會(huì)把相關(guān)和用戶(hù)信息發(fā)送到該URL,商戶(hù)需要接收處理信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
//支付回調(diào)頁(yè)面 public ActionResult notice_url() { string resultFromWx = getPostStr(); //設(shè)置支付參數(shù) RequestHandler paySignReqHandler = new RequestHandler(null); WriteLog( " 微支付notice resultFromWx=" + resultFromWx); var res = XDocument.Parse(resultFromWx); //通信成功 if (res.Element( "xml" ).Element( "return_code" ).Value == "SUCCESS" ) { if (res.Element( "xml" ).Element( "result_code" ).Value == "SUCCESS" ) { //交易成功 paySignReqHandler.SetParameter( "return_code" , "SUCCESS" ); paySignReqHandler.SetParameter( "return_msg" , "OK" ); string ordecode = res.Element( "xml" ).Element( "out_trade_no" ).Value; BLL.orders Bll = new BLL.orders(); try { if (Bll.Update(ordecode )) { WriteLog( " 微支付交易成功=" + ordecode); } else { WriteLog( " 微支付交易失敗=" + ordecode); } } catch (Exception ex) { WriteLog(ex, " 微支付交易異常=" + ordecode); } } else { paySignReqHandler.SetParameter( "return_code" , "FAIL" ); paySignReqHandler.SetParameter( "return_msg" , "交易失敗" ); } } else { paySignReqHandler.SetParameter( "return_code" , "FAIL" ); paySignReqHandler.SetParameter( "return_msg" , "簽名失敗" ); } string data = paySignReqHandler.ParseXML(); var result = TenPayV3.Unifiedorder(data); WriteLog( " 微支付notice result=" + result); return View(); } |
注意:
因此接收到成功支付后需要返回代碼中紅色的部分來(lái)提醒微信服務(wù)器已處理,否則會(huì)不斷收到微信服務(wù)器的反饋。
getPostStr()方法:
1
2
3
4
5
6
7
8
|
//獲得Post過(guò)來(lái)的數(shù)據(jù) public string getPostStr() { Int32 intLen = Convert.ToInt32(Request.InputStream.Length); byte[] b = new byte[intLen]; Request.InputStream.Read(b, 0, intLen); return System.Text.Encoding.UTF8.GetString(b); } |
現(xiàn)在前后臺(tái)都打通了,主要還是要耐心調(diào)試,祝君好運(yùn)~