微信JSApi支付(fu)~微信支付(fu)代理模式的實現(原(yuan)創(chuang))
起因(大叔原創)
對(dui)于微信(xin)支(zhi)付來說(shuo)(shuo),你的發(fa)起者(zhe)(zhe)需(xu)要配(pei)置對(dui)應的域(yu)名來獲取code(獲取用(yong)戶信(xin)息接(jie)(jie)口),而這(zhe)意(yi)味著,你的多個(ge)(ge)項目(mu)(mu)(域(yu)名不同(tong))不能(neng)同(tong)時(shi)使用(yong)一個(ge)(ge)公眾(zhong)(zhong)號,這(zhe)是一件(jian)很操蛋(dan)的事,對(dui)于我(wo)(wo)們(men)(men)開發(fa)人員來說(shuo)(shuo),當然不能(neng)接(jie)(jie)受,我(wo)(wo)們(men)(men)需(xu)要一種代(dai)理模(mo)式,代(dai)我(wo)(wo)們(men)(men)實現多個(ge)(ge)項目(mu)(mu)使用(yong)一個(ge)(ge)公眾(zhong)(zhong)號(一個(ge)(ge)支(zhi)付的域(yu)名),這(zhe)是必須的,說(shuo)(shuo)做(zuo)就做(zuo)。(支(zhi)付發(fa)起者(zhe)(zhe)可以多個(ge)(ge)域(yu)名,最多三個(ge)(ge),就是我(wo)(wo)們(men)(men)說(shuo)(shuo)的權限目(mu)(mu)錄那塊)
原理
開始-》
第三方網站重定向在代理服務器-》
代理服務器跳到微信服務器拿code-》
返回 code到代理服務器-》
代理服務器再發跳到微信服務器拿 openid和token-》
返回openid和token到代理服務器-》
當openid不為空時跳回第三方網站服務器-》
由第三方服務的支付完成最后的付款過程-》
結果
思維圖像
實現
#region 代理模式 /// <summary> /// 微信(xin)支付 /// 從(cong)代理服務器(qi)獲(huo)取openID /// 注(zhu)意:代理(li)服務器(qi)與本服務器(qi)需要有預定,雙方要告(gao)訴對應的URL地址(zhi),用(yong)來進行二次跳轉 /// </summary> /// <returns></returns> public ActionResult Weixin() { string openId = Request.QueryString["openId"]; if (string.IsNullOrWhiteSpace(openId)) { //第一次加(jia)載頁面,跳轉(zhuan)到代(dai)理服務器獲openid Logger.LoggerFactory.Instance.Logger_Info("openid為空"); Response.Redirect("//m.xxx.cn/order/GetOpenId"); } else { //由(you)代理服務器(qi)跳回來后,得到(dao)本用戶的openId Logger.LoggerFactory.Instance.Logger_Info("從m158拿到openid:" + openId); ViewBag.openId = openId; } return View(); } /// <summary> /// 微信支付的代理(li)服務 /// </summary> /// <returns></returns> public void WeixinProxy() { string openId = JsApiImplement.GetOpenId();//獲取當(dang)前openId string bussinessUrl = "";//業務網站支付地址 if (!string.IsNullOrWhiteSpace(openId)) Redirect(bussinessUrl + "?openId=" + openId); } /// <summary> /// 獲取支付JSON串 /// </summary> /// <param name="orderId"></param> /// <param name="money"></param> /// <param name="openId"></param> /// <returns></returns> public string GetPayJson(string orderId, int money, string openId) { try { Logger.LoggerFactory.Instance.Logger_Info("發(fa)送訂單(dan)號=" + orderId + ",openID=" + openId); //JsApiImplement.GetOpenId();加到主頁(ye)面上 return JsApiImplement.Send(money, orderId, openId); } catch (Exception ex) { Logger.LoggerFactory.Instance.Logger_Error(ex); return "出錯了"; } } #endregion
在測試過程(cheng)(cheng)中出現過一些問題,然后通(tong)過日志分析解決(jue)了,感覺在oauth權限過程(cheng)(cheng)中,頁面重(zhong)定(ding)向(xiang)成為(wei)了唯一的(de)方(fang)式,以后這種方(fang)式我們(men)應該在自己的(de)項目(mu)中多(duo)多(duo)使用!
感謝這個坑很多(duo)的微信!
沒(mei)有你(ni)的(de)坑,我(wo)們也不會學到(dao)這么(me)多知識!