微信支付V2 统一下单 .NET CORE
微信支付V2 统一下单 .NET CORE
一个小功能总是拖拖拖。。唉。。。今天2024年01月15日终于调成功了,以下是代码,能取到预支付订单号就行了。。
/// <summary> /// 微信支付-微信小程序 /// </summary> /// <returns></returns> [HttpGet("Wxpay_app")] public async Task<ApiResult> Wxpay_app() { try { //微信支付V2-统一下单文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1 //1.准备提交数据 Hashtable ht = new Hashtable(); ht.Add("appid", "wxd64fd8b6111111"); ht.Add("mch_id", "149111111"); ht.Add("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); ht.Add("sign_type", "MD5"); ht.Add("body", "腾讯充值中心-QQ会员充值"); ht.Add("out_trade_no", DateTime.Now.ToString("yyyyMMddHHmmss") + Guid.NewGuid().ToString().Substring(0, 4)); ht.Add("total_fee", 1); ht.Add("spbill_create_ip", HttpContext.UserHostAddress().ToString()); ht.Add("notify_url", "https://xx.xxx.net/wx/notify"); ht.Add("trade_type", "JSAPI"); ht.Add("openid", "oOGeG6xoflRianAWRn8UpyCgyZiM"); //2.签名: 排序、拼接、MD5, 把生成的签名加入到提交数据的sign中 string pinjie = ""; SortedDictionary<string, string> sortedDictionary = new SortedDictionary<string, string>(); foreach (DictionaryEntry entry in ht) { sortedDictionary.Add(entry.Key.ToString(), entry.Value.ToString()); } foreach (KeyValuePair<string, string> pair in sortedDictionary) { if (string.IsNullOrEmpty(pair.Value)) { continue; } pinjie += $"{pair.Key}={pair.Value}&"; } pinjie += "key=32021fdds325346433243254322"; _logger.LogInformation("拼接好的串:\r\n"+pinjie+"\r\n"); string sign = Tool.MD5Hash(pinjie).ToUpper(); ht.Add("sign", sign); //3.把提交的数据转为XML XmlDocument xmlDoc = new XmlDocument(); XmlElement rootElement = xmlDoc.CreateElement("xml"); xmlDoc.AppendChild(rootElement); foreach (DictionaryEntry entry in ht) { XmlElement element = xmlDoc.CreateElement(entry.Key.ToString()); element.InnerText = entry.Value.ToString(); rootElement.AppendChild(element); } string postdata = xmlDoc.OuterXml; _logger.LogInformation("提交的XML:\r\n"+postdata+"\r\n"); //4.把XML数据POST提交到微信支付V2的接口地址,得到返回的预支付订单号,小程序端再通过预支付订单号调起微信支付 string aaa = ""; using (var client = new HttpClient()) { var content = new StringContent(postdata, Encoding.UTF8, "application/xml"); var response =await client.PostAsync("https://api.mch.weixin.qq.com/pay/unifiedorder", content); if (response.IsSuccessStatusCode) { aaa = await response.Content.ReadAsStringAsync(); _logger.LogInformation("远程返回:\r\n"+aaa+"\r\n"); } else { throw new Exception($"StatusCode: {response.StatusCode}"); } } return new ApiResult() { code = 0, msg = aaa }; } catch (Exception ex) { return new ApiResult() { code = 1, msg = "出错:" + ex.Message }; } }
注意MD5加密那里得用utf8,原来是ascii的总是签名错误
/// <summary> /// netcore下的实现MD5加密 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string MD5Hash(string input) { using (var md5 = MD5.Create()) { var result = md5.ComputeHash(Encoding.UTF8.GetBytes(input)); //用Encoding.ASCII的话在微信支付V2那里的签名不匹配 var strResult = BitConverter.ToString(result); return strResult.Replace("-", ""); } }
撸码:复制、粘贴,拿起键盘就是“干”!!!