文章出處
文章列表
起因(大叔原創)
對于微信支付來說,你的發起者需要配置對應的域名來獲取code(獲取用戶信息接口),而這意味著,你的多個項目(域名不同)不能同時使用一個公眾號,這是一件很操蛋的事,對于我們開發人員來說,當然不能接受,我們需要一種代理模式,代我們實現多個項目使用一個公眾號(一個支付的域名),這是必須的,說做就做。(支付發起者可以多個域名,最多三個,就是我們說的權限目錄那塊)
原理
開始-》
第三方網站重定向在代理服務器-》
代理服務器跳到微信服務器拿code-》
返回 code到代理服務器-》
代理服務器再發跳到微信服務器拿 openid和token-》
返回openid和token到代理服務器-》
當openid不為空時跳回第三方網站服務器-》
由第三方服務的支付完成最后的付款過程-》
結果
思維圖像
實現
#region 代理模式 /// <summary> /// 微信支付 /// 從代理服務器獲取openID /// 注意:代理服務器與本服務器需要有預定,雙方要告訴對應的URL地址,用來進行二次跳轉 /// </summary> /// <returns></returns> public ActionResult Weixin() { string openId = Request.QueryString["openId"]; if (string.IsNullOrWhiteSpace(openId)) { //第一次加載頁面,跳轉到代理服務器獲openid Logger.LoggerFactory.Instance.Logger_Info("openid為空"); Response.Redirect("http://m.xxx.cn/order/GetOpenId"); } else { //由代理服務器跳回來后,得到本用戶的openId Logger.LoggerFactory.Instance.Logger_Info("從m158拿到openid:" + openId); ViewBag.openId = openId; } return View(); } /// <summary> /// 微信支付的代理服務 /// </summary> /// <returns></returns> public void WeixinProxy() { string openId = JsApiImplement.GetOpenId();//獲取當前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("發送訂單號=" + orderId + ",openID=" + openId); //JsApiImplement.GetOpenId();加到主頁面上 return JsApiImplement.Send(money, orderId, openId); } catch (Exception ex) { Logger.LoggerFactory.Instance.Logger_Error(ex); return "出錯了"; } } #endregion
在測試過程中出現過一些問題,然后通過日志分析解決了,感覺在oauth權限過程中,頁面重定向成為了唯一的方式,以后這種方式我們應該在自己的項目中多多使用!
感謝這個坑很多的微信!
沒有你的坑,我們也不會學到這么多知識!
文章列表
全站熱搜