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

  微信app支付需要以下參數,類封裝如下

public class WxPayModel
    {
        /// <summary>
        /// 應用ID
        /// </summary>
        public string appid { set; get; } = "";
        /// <summary>
        /// 商戶號
        /// </summary>
        public string partnerid{ set; get; } = "";
        /// <summary>
        /// 預支付交易會話ID
        /// </summary>
        public string prepayid { set; get; } = "";
        /// <summary>
        /// 擴展字段
        /// </summary>
        public string package { set; get; } = "Sign=WXPay";
        /// <summary>
        /// 隨機字符串
        /// </summary>
        public string noncestr { set; get; } = "";
        /// <summary>
        /// 時間戳
        /// </summary>
        public string timestamp { set; get; } = "";

        /// <summary>
        /// 簽名
        /// </summary>
        public string sign { set; get; } = "";
    }

  支付業務邏輯類如下,只需要傳遞訂單號out_trade_no,描述body,價格total_fee,客戶端ip,返回一個WxPayModel供app端調用。

/// <summary>
        /// 獲取微信APP支付需要的信息
        /// </summary>
        /// <param name="out_trade_no">訂單號</param>
        /// <param name="body">描述</param>
        /// <param name="total_fee">總價</param>
        /// <param name="ip">客戶IP</param>
        /// <returns></returns>
        public WxPayModel GetWxAppPayInfo(string out_trade_no, string body, string total_fee, string ip)
        {
            //構造返回內容,缺少prepayid和sign需要去微信服務器獲取
            WxPayModel wxPayModel = new WxPayModel()
            {
                appid = wxPayConfig.appid,
                partnerid = wxPayConfig.mchid,
                timestamp = Senparc.Weixin.Helpers.DateTimeHelper.GetWeixinDateTime(DateTime.Now) + "",
                noncestr = TenPayV3Util.GetNoncestr(),
            };

            //構造請求參數
            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", "APP");//APP支付

            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("【GetWxAppPayInfo】訂單:" + out_trade_no + ",請求得到的xml:" + result, "微信支付");

            var res = System.Xml.Linq.XDocument.Parse(result);//解析xml,爲了填充prepay_id參數和_paySign參數。
            try
            {
                //填充prepay_id參數
                wxPayModel.prepayid = res.Element("xml").Element("prepay_id").Value;

                SortedDictionary<string, object> sParams = new SortedDictionary<string, object>();

          sParams.Add("appid", wxPayModel.appid);
          sParams.Add("noncestr", wxPayModel.noncestr);
          sParams.Add("package", "Sign=WXPay");
          sParams.Add("partnerid", wxPayModel.partnerid);
          sParams.Add("prepayid", wxPayModel.prepayid);
          sParams.Add("timestamp", wxPayModel.timestamp);

//填充sign參數 
                wxPayModel.sign = GetSign(sParams, wxPayConfig.key);
            }
            catch (Exception ex)
            {
                Log.Info($"【GetWxAppPayInfo】訂單:{out_trade_no },異常:{ ex.ToString()}", "微信支付");
            }
            return wxPayModel;
        }

  其中獲取微信簽名方法如下

#region 獲取微信簽名
        /// <summary>
        /// 獲取微信簽名
        /// </summary>
        /// <param name="sParams"></param>
        /// <returns></returns>
        public string GetSign(SortedDictionary<string, object> sParams, string key)
        {
            string sign = string.Empty;
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, object> temp in sParams)
            {
                if (string.IsNullOrEmpty(temp.Value +"") || temp.Key.ToLower() == "sign")
                {
                    continue;
                }
                sb.Append(temp.Key.Trim() + "=" + temp.Value.ToString() + "&");
            }
            sb.Append("key=" + key.Trim() + "");
            string signkey = sb.ToString();
            sign = Senparc.Weixin.Helpers.EncryptHelper.GetMD5(signkey);
            return sign;
        }

        #endregion

  這樣只要應用開通了微信app支付功能,就能正確返回app sdk支付所需要的數據。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章