文章出處

返回目錄

起因(大叔原創)

對于微信支付來說,你的發起者需要配置對應的域名來獲取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權限過程中,頁面重定向成為了唯一的方式,以后這種方式我們應該在自己的項目中多多使用!

感謝這個坑很多的微信!

沒有你的坑,我們也不會學到這么多知識!

返回目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()