asp.net core 微信公衆號支付(掃碼支付,H5支付,公衆號支付,app支付)之3

  在微信公衆號中訪問手機網站,當須要調用支付時候沒法使用H5支付,只有使用微信公衆號支付,使用公衆號支付用戶必須關注該公衆號同時該公衆號必須開通公衆號支付功能。html

  1.獲取用戶的OpenId ,參考以前寫的隨筆 http://www.javashuo.com/article/p-psgbefin-cp.html前端

  2.微信公衆號支付喚起須要一下幾個參數api

            //定義參數名
            string _appId = "appId";
            string _nonceStr = "nonceStr";
            string _package = "package";
            string _signType = "signType";
            string _timeStamp = "timeStamp";
            string _paySign = "paySign";        

  若是不使用工具類Senparc.Weixin.MP.TenPayLibV3.RequestHandler去生成簽名的話須要注意生成簽名時候字符串拼接的順序微信

  3.微信公共號支付業務類方法微信開發

  

     /// <summary>
        /// 獲取微信內置H5支付須要的信息,公衆號支付返回的是個有序字典,利用字典的各個值調用jssdk獲取微信內的公衆號支付
        /// </summary>
        /// <param name="out_trade_no">訂單號</param>
        /// <param name="body">描述</param>
        /// <param name="total_fee">總價</param>
        /// <param name="ip">客戶IP</param>
        /// <param name="product_id">商品id</param>
        /// <param name="openid">openid</param>
        /// <returns></returns>
        public SortedDictionary<string, string> GetWxGZHPayInfo(string out_trade_no, string body, string total_fee, string ip, string product_id, string openid = "")
        {
            //定義參數名
            string _appId = "appId";
            string _nonceStr = "nonceStr";
            string _package = "package";
            string _signType = "signType";
            string _timeStamp = "timeStamp";
            string _paySign = "paySign";

            //構造返回參數字典
            SortedDictionary<string, string> dicResult = new SortedDictionary<string, string>();
            dicResult.Add(_appId, wxPayConfig.appid);
            dicResult.Add(_timeStamp, Senparc.Weixin.Helpers.DateTimeHelper.GetWeixinDateTime(DateTime.Now)+ "");
            dicResult.Add(_nonceStr, Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr());
            dicResult.Add(_package, "");
            dicResult.Add(_signType, "MD5");
            dicResult.Add(_paySign, "");
            
            //構造請求參數
            Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler();

            #region 構造請求參數
            packageReqHandler.SetParameter("appid", wxPayConfig.appid);//APPID
            packageReqHandler.SetParameter("mch_id", wxPayConfig.mchid);//商戶號
            packageReqHandler.SetParameter("nonce_str", Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr());//隨機串
            packageReqHandler.SetParameter("body", body);
            packageReqHandler.SetParameter("out_trade_no", out_trade_no);//訂單號
            packageReqHandler.SetParameter("total_fee", (int)(Convert.ToDecimal(total_fee) * 100) + ""); //金額,以分爲單位
            packageReqHandler.SetParameter("spbill_create_ip", ip);//IP
            packageReqHandler.SetParameter("notify_url", wxPayConfig.notify_url); //回調地址
            packageReqHandler.SetParameter("trade_type", "JSAPI");//公共號支付
            packageReqHandler.SetParameter("product_id", product_id);//商品ID
            packageReqHandler.SetParameter("openid", openid);//OPENID
            packageReqHandler.SetParameter("sign", packageReqHandler.CreateMd5Sign("key", wxPayConfig.key));//商戶API密鑰(簽名) 
            #endregion

            //將參數轉爲xml字符串
            string data = packageReqHandler.ParseXML(); //發起post異步請求,獲取返回的內容
             var result = PostWithStringFile(wxPayConfig.api_url, data);

            Log.Info("【GetWxGZHPayInfo】訂單:" + out_trade_no + ",請求獲得的xml:" + result, "微信支付");

            var res = System.Xml.Linq.XDocument.Parse(result);//解析xml,爲了填充prepay_id參數和_paySign參數。
            try
            {
                //填充prepay_id參數
                string prepay_id = res.Element("xml").Element("prepay_id").Value;
                Log.Info("【GetWxGZHPayInfo】訂單:" + out_trade_no + ",請求獲得的prepay_id:" + prepay_id, "微信支付");
                dicResult[_package] = "prepay_id=" + prepay_id;

                //獲取MD5簽名字符串,注意順序不能錯
                string _stringSignTemp = "appId=" + dicResult[_appId] + "&nonceStr=" + dicResult[_nonceStr] + "&package=" + dicResult[_package] + "&signType=" + dicResult[_signType] + "&timeStamp=" + dicResult[_timeStamp] + "&key=" + wxPayConfig.key;
                Log.Info("【GetWxGZHPayInfo】_stringSignTemp=" + _stringSignTemp, "微信支付");

                //填充_paySign參數
                string _sign = Senparc.Weixin.Helpers.EncryptHelper.GetMD5(_stringSignTemp);
                dicResult[_paySign] = _sign;
                return dicResult;
            }
            catch (Exception ex)
            {
                Log.Info($"【GetWxGZHPayInfo】訂單:{out_trade_no },異常:{ ex.ToString()}", "微信支付");
                return dicResult;
            }
        }

  方法內容爲構造一個返回字典dicResult,但package和paySign參數須要請求微信api去獲取,構造請求工具類packageReqHandler,請求微信api獲取獲得xml文件解析獲得prepay_id參數,將內容"prepay_id=" + prepay_id填充到package參數。最後就剩下簽名字段,構造簽名字符串_stringSignTemp(必定注意拼接順序,微信開發接口有提供簽名校驗,網址:https://pay.weixin.qq.com/wiki/tools/signverify/),使用md5簽名獲得paysign,最後返回字典給控制器傳給前端便可。注(PostWithStringFile方法和wxPayConfig類在掃碼支付篇有貼出)app

相關文章
相關標籤/搜索