/// <summary> /// 微信支付验证签名 /// </summary> /// <param name="dic">接收到的所有参数</param> /// <param name="key">商户 key</param> /// <returns></returns> public static bool VerifySign(SortedDictionary <string, string> dic, string key) { string sign = dic["sign"]; dic.Remove("sign"); if (MD5SignUtil.VerifySignature(FormatBizQueryParaMap(dic, false), sign, key))//验证签名 { return(true); } return(false); }
/// <summary> /// 获取微信JSAPI支付对象 /// </summary> /// <param name="orderId">订单号</param> /// <param name="totalAmount">订单金额</param> /// <param name="appId">微信公众号AppId</param> /// <param name="mchId">微信商户号</param> /// <param name="key">支付密钥</param> /// <param name="openId">用户OpenId</param> /// <param name="ip">用户的IP</param> /// <param name="notifyUrl">通知地址</param> /// <param name="body">订单内容</param> /// <param name="tradeType">交易类型</param> /// <returns></returns> public static WXPayRequest GetBrandWcPayRequest(string orderId, decimal totalAmount, string appId, string mchId, string key, string openId, string ip, string notifyUrl, out bool isSuccess, string body = "", string tradeType = "") { isSuccess = false; string backStr = ""; try { string nonStr = CommonUtil.CreateNoncestr();//随机串 #region 获取微信支付预支付ID //第一次签名 SortedDictionary <string, string> dicStep1 = new SortedDictionary <string, string>(); dicStep1.Add("appid", appId); dicStep1.Add("body", !string.IsNullOrEmpty(body) ? body : string.Format("订单号:{0}", orderId)); dicStep1.Add("mch_id", mchId); dicStep1.Add("nonce_str", nonStr); dicStep1.Add("out_trade_no", orderId); dicStep1.Add("openid", openId); dicStep1.Add("spbill_create_ip", ip); dicStep1.Add("total_fee", (totalAmount * 100).ToString("F0")); dicStep1.Add("notify_url", notifyUrl); if (!string.IsNullOrEmpty(tradeType)) { dicStep1.Add("trade_type", tradeType); } else { dicStep1.Add("trade_type", "JSAPI"); } string strTemp1 = CommonUtil.FormatBizQueryParaMap(dicStep1, false); string sign = MD5SignUtil.Sign(strTemp1, key); //dicStep1 = (from entry in dicStep1 // orderby entry.Key ascending // select entry).ToDictionary(pair => pair.Key, pair => pair.Value); dicStep1.Add("sign", sign); string postData = CommonUtil.ArrayToXml(dicStep1); string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); byte[] requestBytes = System.Text.Encoding.UTF8.GetBytes(postData); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = requestBytes.Length; System.IO.Stream requestStream = req.GetRequestStream(); requestStream.Write(requestBytes, 0, requestBytes.Length); requestStream.Close(); System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8); backStr = sr.ReadToEnd(); sr.Close(); res.Close(); var result = System.Xml.Linq.XDocument.Parse(backStr); var returnCode = result.Element("xml").Element("return_code").Value; if (returnCode.ToUpper() == "FAIL") { return(null); } string preId = ""; var rusultCode = result.Element("xml").Element("result_code").Value; if (returnCode.ToUpper().Equals("SUCCESS") && (rusultCode.ToUpper().Equals("SUCCESS"))) { preId = result.Element("xml").Element("prepay_id").Value; } #endregion #region 生成微信支付请求 WXPayRequest wxPayReq = new WXPayRequest(); string timesStamp = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString(); wxPayReq.appId = appId; wxPayReq.nonceStr = nonStr; wxPayReq.package = "prepay_id=" + preId; wxPayReq.signType = "MD5"; wxPayReq.timeStamp = timesStamp; //第二次签名 SortedDictionary <string, string> dicStep2 = new SortedDictionary <string, string>(); dicStep2.Add("appId", wxPayReq.appId); dicStep2.Add("timeStamp", wxPayReq.timeStamp); dicStep2.Add("nonceStr", wxPayReq.nonceStr); dicStep2.Add("package", wxPayReq.package); dicStep2.Add("signType", "MD5"); string strTemp2 = CommonUtil.FormatQueryParaMap(dicStep2); string paySign = MD5SignUtil.Sign(strTemp2, key); wxPayReq.paySign = paySign; isSuccess = true; return(wxPayReq); #endregion } catch (Exception ex) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter(@"E:\WXPay\Error.txt", true, Encoding.GetEncoding("UTF-8"))) { sw.WriteLine(backStr); } //return System.Xml.Linq.XDocument.Parse(backStr).Element("xml").Element("return_msg").Value; return(null); } }