.net 微信jsapi支付
配置参数
<!--支付微信appid-->
<add key="AppId" value="" />
<!--微信secret-->
<add key="secret" value="" />
<!--接收微信异步回调接口-->
<add key="notify_url" value="" />
<!--商户号-->
<add key="MchId" value="" />
<!--商户号KEY 用户登录商户平台自行设置的(32位)-->
<add key="key" value="" />
1.公众号 appid
2.微信支付平台 商户号 商户秘钥Key
3.配置目录 微信支付平台上面
配置好以上参数 就可以开始开发了
不多说 直接上代码 完整 看不懂的慢慢看 因为我做的是一码 多用 所以 前台页面会不一样 前台页面自行设置
using Aop.Api; using Common; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Web; using System.Web.Configuration; using System.Web.Http; using System.Web.Mvc; using System.Xml; using System.Xml.Linq; using Tea.Utils; namespace YouXingTuShuJu_V2.Controllers { /// <summary> /// 微信支付 /// </summary> public class WeChatAPIController : ApiController { static string _pre_order_url = "https://api.mch.weixin.qq.com/";//请求域名 static string _appid = AliPayConfig.AppId;//公众账号ID static string _mch_id = AliPayConfig.MchId;//商户号 static string _partnerKey = AliPayConfig.key;//商家私钥 /// <summary> /// /// </summary> /// <param name="dizhi"></param> /// <returns></returns> /// <summary> /// /// </summary> /// <param name="dizhi"></param> /// <returns></returns> public DataTable WeChatIndex(int dizhi) { int FId = dizhi; string signType = ""; string nonce_str = ""; string timeStamp = ""; string package = ""; string appId = ""; string paySign = ""; DataTable aa = new DataTable();//可以给表创建一个名字,tb //根据FId查询订单信息 Maticsoft.BLL.T_CreateOrderData createOrderDataBll = new Maticsoft.BLL.T_CreateOrderData(); DataTable dt = createOrderDataBll.GetcreateOrderDataInfo(FId); if (dt.Rows.Count > 0) { //附加数据 var _attach = "支付测试"; //商品描述 var _body = "账号激活"; //随机字符串 var _nonce_str = CreateNonce_str(); //回调地址 var _notify_url = "http://www.shangtuikeji.com/api/WeChatAPI/Notify_url"; //商户订单号 var _out_trade_no = Convert.ToString(dt.Rows[0]["FNumber"]); //终端IP var _spbill_create_ip = GetWebClientIp(); //订单金额 var _total_fee = Convert.ToDouble(dt.Rows[0]["FMoney"]);//元为单位 //交易类型 var _trade_type = "JSAPI"; //设备号 var _scene_info = $@"{{""h5_info"": {{""type"":""Wap"",""wap_url"": ""{_notify_url}"",""wap_name"": ""{_body}""}}}}"; //交易起始时间 var _time_start = DateTime.Now.ToString("yyyyMMddHHmmss"); //交易结束时间 var _time_expire = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss"); var openid = dt.Rows[0]["FMyUserOpenid"].ToString(); var sign_type = "MD5"; //下单 var pre_order_httpResult = UnifiedOrder(_appid, _attach, _body, _mch_id, _nonce_str, _notify_url, _out_trade_no, _spbill_create_ip, _total_fee, _trade_type, _scene_info, _time_start, _time_expire, openid, sign_type); var pre_order_resultStr = XElement.Parse(pre_order_httpResult); var pre_order_result_code = pre_order_resultStr.Element("return_code").Value; var pre_order_result_msg = pre_order_resultStr.Element("return_msg").Value; aa.Columns.Add("signType", typeof(System.String));//类型是可以变换的,比如System.Int32,System.Double.. aa.Columns.Add("nonce_str", typeof(System.String)); aa.Columns.Add("timeStamp", typeof(System.String)); aa.Columns.Add("package", typeof(System.String)); aa.Columns.Add("appId", typeof(System.String)); aa.Columns.Add("paySign", typeof(System.String)); if (pre_order_result_code == "SUCCESS") { signType = "MD5"; nonce_str = pre_order_resultStr.Element("nonce_str").Value; ///秒 TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); string ts = Convert.ToInt64(t.TotalSeconds).ToString(); timeStamp = ts; package = pre_order_resultStr.Element("prepay_id").Value; appId = pre_order_resultStr.Element("appid").Value; var stringADict = new Dictionary<string, string>(); stringADict.Add("signType", signType); stringADict.Add("nonceStr", nonce_str); stringADict.Add("timeStamp", timeStamp); stringADict.Add("package", "prepay_id=" + package); stringADict.Add("appId", appId); paySign = Sign(stringADict, _partnerKey); DataRow row = aa.NewRow(); row["signType"] = signType; row["nonce_str"] = nonce_str; row["timeStamp"] = timeStamp; row["package"] = package; row["appId"] = appId; row["paySign"] = paySign; aa.Rows.Add(row); } } return aa; } /// <summary> /// 下单 /// </summary> /// <param name="appid">公众账号ID</param> /// <param name="attach">附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据</param> /// <param name="body">String(32) 商品描述 商品或支付单简要描</param> /// <param name="mch_id">商户号</param> /// <param name="nonce_str">随机字符串</param> /// <param name="notify_url">接收微信支付异步通知回调地址,不可带参,与下面的Notify对应,开发者可自定义其他url地址 </param> /// <param name="out_trade_no">商户系统内部的订单号,32个字符内、可包含字母</param> /// <param name="spbill_create_ip">终端ip</param> /// <param name="total_fee">收钱总额 分为单位 前台传过来后需要处理成分</param> /// <param name="trade_type">交易类型H5支付的交易类型为MWEB</param> /// <param name="scene_info">场景信息 WAP网站应用{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}}</param> /// <param name="time_start">交易起始时间</param> /// <param name="time_expire">交易结束时间</param> /// <returns></returns> static string UnifiedOrder(string appid, string attach, string body, string mch_id, string nonce_str, string notify_url, string out_trade_no, string spbill_create_ip, double total_fee, string trade_type, string scene_info, string time_start, string time_expire, string openid, string sign_type) { var stringADict = new Dictionary<string, string>(); stringADict.Add("appid", appid); stringADict.Add("attach", attach); stringADict.Add("body", body); stringADict.Add("mch_id", mch_id); stringADict.Add("nonce_str", nonce_str); stringADict.Add("notify_url", notify_url); stringADict.Add("out_trade_no", out_trade_no); stringADict.Add("openid", openid); stringADict.Add("spbill_create_ip", spbill_create_ip); stringADict.Add("total_fee", Math.Round(Convert.ToDecimal(total_fee) * 100, 0).ToString());//元转分 stringADict.Add("trade_type", trade_type); stringADict.Add("scene_info", scene_info); stringADict.Add("time_start", time_start); stringADict.Add("time_expire", time_expire); stringADict.Add("sign_type", sign_type); var sign = Sign(stringADict, _partnerKey);//生成签名字符串 //组合xml内容 StringBuilder strBuilder = new StringBuilder(); strBuilder.Append("<xml>"); strBuilder.Append($"<appid>{appid}</appid>");//公众号id strBuilder.Append($"<attach>{attach}</attach>");//附加数据 strBuilder.Append($"<body>{body}</body>");//商品描述 strBuilder.Append($"<mch_id>{mch_id}</mch_id>");//商户号 strBuilder.Append($"<nonce_str>{nonce_str}</nonce_str>");//随机字符串 strBuilder.Append($"<notify_url>{notify_url}</notify_url>");//接收微信支付异步通知回调地址,不可带参,与下面的Notify对应,开发者可自定义其他url地址 strBuilder.Append($"<out_trade_no>{out_trade_no}</out_trade_no>");//商户系统内部的订单号,32个字符内、可包含字母 strBuilder.Append($"<openid>{openid}</openid>"); strBuilder.Append($"<spbill_create_ip>{spbill_create_ip}</spbill_create_ip>");//终端ip strBuilder.Append($"<total_fee>{Math.Round(Convert.ToDecimal(total_fee) * 100, 0).ToString()}</total_fee>");//收钱总额 分为单位 前台传过来后需要处理成分 strBuilder.Append($"<trade_type>{trade_type}</trade_type>");//交易类型H5支付的交易类型为MWEB strBuilder.Append($"<scene_info>{scene_info}</scene_info>"); strBuilder.Append($"<time_start>{time_start}</time_start>");//交易起始时间 strBuilder.Append($"<time_expire>{time_expire}</time_expire>");//交易结束时间 strBuilder.Append($"<sign>{sign}</sign>"); strBuilder.Append($"<sign_type>{sign_type}</sign_type>"); strBuilder.Append("</xml>"); //var url = _pre_order_url + "/sandboxnew/pay/unifiedorder";//沙箱 var url = _pre_order_url + "pay/unifiedorder"; var pre_order_httpResult = HttpPostRequestXml(url, strBuilder); return pre_order_httpResult; } /// <summary> /// 查询订单 /// </summary> /// <param name="appid">公众账号ID</param> /// <param name="mch_id">商户号</param> /// <param name="out_trade_no">商户系统内部的订单号或微信的订单号</param> /// <param name="nonce_str">随机字符串</param> /// <returns></returns> static string Orderquery(string appid, string mch_id, string out_trade_no, string nonce_str) { var stringADict = new Dictionary<string, string>(); stringADict.Add("appid", appid); stringADict.Add("mch_id", mch_id); stringADict.Add("out_trade_no", out_trade_no); stringADict.Add("nonce_str", nonce_str); var sign = Sign(stringADict, _partnerKey);//生成签名字符串 //组合xml内容 StringBuilder strBuilder = new StringBuilder(); strBuilder.Append("<xml>"); strBuilder.Append($"<appid>{appid}</appid>"); strBuilder.Append($"<mch_id>{mch_id}</mch_id>"); strBuilder.Append($"<out_trade_no>{out_trade_no}</out_trade_no>"); strBuilder.Append($"<nonce_str>{nonce_str}</nonce_str>"); strBuilder.Append($"<sign>{sign}</sign>"); strBuilder.Append("</xml>"); //接口地址 var url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; var pre_order_httpResult = HttpPostRequestXml(url, strBuilder); return pre_order_httpResult; } /// <summary> /// 发送post xml文件请求 /// </summary> /// <param name="Url"></param> /// <param name="strBuilder"></param> /// <returns></returns> static string HttpPostRequestXml(string Url, StringBuilder strBuilder) { string result = string.Empty; string data = strBuilder.ToString(); //进行utf-8编码 var encoding = Encoding.GetEncoding("utf-8"); byte[] buffer = encoding.GetBytes(data); //根据webURL创建HttpWebRequest对象 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "post"; //request.Headers.Add("charset:utf-8"); request.ContentLength = buffer.Length; request.ContentType = "text/xml"; StreamWriter myWriter = null; try { myWriter = new StreamWriter(request.GetRequestStream()); myWriter.Write(data); } catch (Exception e) { Console.WriteLine(e.Message); } finally { myWriter.Close(); } //读取服务器返回的信息 HttpWebResponse objResponse = (HttpWebResponse)request.GetResponse(); using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) { result = sr.ReadToEnd(); } return result; } private static string[] strs = new string[] { "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z", "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z" }; /// <summary> /// 创建随机字符串 /// </summary> /// <returns></returns> public static string CreateNonce_str() { Random r = new Random(); var sb = new StringBuilder(); var length = strs.Length; for (int i = 0; i < 15; i++) { sb.Append(strs[r.Next(length - 1)]); } return sb.ToString(); } /// <summary> /// 获取终端IP地址 /// </summary> /// <returns></returns> public static string GetWebClientIp() { string userIP = ""; try { if (System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Request == null || System.Web.HttpContext.Current.Request.ServerVariables == null) return ""; string CustomerIP = ""; //CDN加速后取到的IP simone 090805 CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"]; if (!string.IsNullOrEmpty(CustomerIP)) { return CustomerIP; } CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (!String.IsNullOrEmpty(CustomerIP)) { return CustomerIP; } if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null) { CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (CustomerIP == null) CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } else { CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } if (string.Compare(CustomerIP, "unknown", true) == 0) return System.Web.HttpContext.Current.Request.UserHostAddress; return CustomerIP; } catch { } return userIP; } /// <summary> /// 生成签名 /// 签名在线验证工具: /// http://mch.weixin.qq.com/wiki/tools/signverify/ /// </summary> /// <param name="stringADict">参与签名生成的参数列表</param> /// <param name="partnerKey">商家私钥</param> /// <returns></returns> public static string Sign(IDictionary<string, string> stringADict, string partnerKey) { var sb = new StringBuilder(); foreach (var sA in stringADict.OrderBy(x => x.Key))//参数名ASCII码从小到大排序(字典序); { if (string.IsNullOrEmpty(sA.Value)) continue;//参数的值为空不参与签名; if (string.Compare(sA.Key, "sign", true) == 0) continue; // 参数中为签名的项,不参加计算 sb.Append(sA.Key).Append("=").Append(sA.Value).Append("&"); } var string1 = sb.ToString(); string1 = string1.Remove(string1.Length - 1, 1); sb.Append("key=").Append(partnerKey);//在stringA最后拼接上key=(API密钥的值)得到stringSignTemp字符串 var stringSignTemp = sb.ToString(); // var sign = MD5Encrypt(stringSignTemp, "UTF-8").ToUpper();//对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 var sign = MD5Encrypt(stringSignTemp, "UTF-8").ToUpper();//对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 return sign; } /// <summary> /// Md5加密 /// </summary> /// <param name="myString"></param> /// <returns></returns> public string GetMD52(string myString) { //return BitConverter.ToString(MD5.Create().ComputeHash(Encoding.Default.GetBytes(myString))).Replace("-", ""); MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(myString)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); } /// <summary> /// 用MD5加密字符串 /// </summary> /// <param name="password">待加密的字符串</param> /// <returns></returns> public static string MD5Encrypt(string password, string encoding) { //MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); //byte[] hashedDataBytes; //hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding(encoding).GetBytes(password)); //StringBuilder tmp = new StringBuilder(); //foreach (byte i in hashedDataBytes) //{ // tmp.Append(i.ToString("x2")); //} //return tmp.ToString(); //return BitConverter.ToString(MD5.Create().ComputeHash(Encoding.Default.GetBytes(myString))).Replace("-", ""); MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(password)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); } public static IAopClient GetAlipayClient() { string appid = AliPayConfig.AppId; string secret = AliPayConfig.secret; string notify_url = AliPayConfig.notify_url; string MchId = AliPayConfig.MchId; string key = AliPayConfig.key; IAopClient client = new DefaultAopClient(appid, secret, notify_url, MchId, key); ; return client; } public class AliPayConfig { //微信secret public static string secret = WebConfigurationManager.AppSettings["secret"].ToString(); //微信appid public static string AppId = WebConfigurationManager.AppSettings["AppId"].ToString(); //商户号 public static string MchId = WebConfigurationManager.AppSettings["MchId"].ToString(); //商户号KEY 用户登录商户平台自行设置的(32位) public static string key = WebConfigurationManager.AppSettings["key"].ToString(); //微信异步回调地址 public static string notify_url = WebConfigurationManager.AppSettings["notify_url"].ToString(); // 日志记录 // public static string LogPath = WebConfigurationManager.AppSettings["AliLog"].ToString(); } /// <summary> /// 付款返回的数据 /// </summary> /// <returns></returns> public string Notify_url() { string xmlData = getPostStr(); PayResult(xmlData); return "SUCCESS"; } //获得Post过来的数据 public string getPostStr() { Int32 intLen = Convert.ToInt32(System.Web.HttpContext.Current.Request.InputStream.Length); byte[] b = new byte[intLen]; System.Web.HttpContext.Current.Request.InputStream.Read(b, 0, intLen); return System.Text.Encoding.UTF8.GetString(b); } /// <summary> /// 付款结果处理 /// </summary> public HttpResponseMessage PayResult(string ResultMsg) { HttpResponseMessage resp = new HttpResponseMessage(); try { if (!string.IsNullOrEmpty(ResultMsg)) { var xml = new XmlDocument(); xml.LoadXml(ResultMsg); //处理返回的值 DataSet ds = new DataSet(); StringReader stram = new StringReader(ResultMsg); XmlTextReader reader = new XmlTextReader(stram); ds.ReadXml(reader); string return_code = ds.Tables[0].Rows[0]["return_code"].ToString(); if (return_code.ToUpper() == "SUCCESS") { //通信成功 string result_code = ds.Tables[0].Rows[0]["result_code"].ToString();//业务结果 if (result_code.ToUpper() == "SUCCESS") { //微信appid string appid = ds.Tables[0].Rows[0]["appid"].ToString(); //商家数据包 string attach = ds.Tables[0].Rows[0]["attach"].ToString(); //商家号 string mch_id = ds.Tables[0].Rows[0]["mch_id"].ToString(); //用户openid string openid = ds.Tables[0].Rows[0]["openid"].ToString(); //订单金额 Int32 total_fee = Convert.ToInt32(ds.Tables[0].Rows[0]["total_fee"].ToString()); //微信支付订单号 string transaction_id = ds.Tables[0].Rows[0]["transaction_id"].ToString(); string out_trade_no = ds.Tables[0].Rows[0]["out_trade_no"].ToString(); //更新业务数据 并执行业务逻辑 out_trade_no Maticsoft.BLL.T_CreateOrderData t_CreateOrderDataBll = new Maticsoft.BLL.T_CreateOrderData(); string Token = ""; if (t_CreateOrderDataBll.PayOrderSucceed(out_trade_no, out Token) > 0) { //rides修改验证 var Redis = new RedisHelper(); if (!string.IsNullOrEmpty(Token)) { Redis.SetHashValue(Token, "RegisterPay", "1"); } resp.Content = new StringContent(JsonConvert.SerializeObject("success"), System.Text.Encoding.UTF8, "text/plian"); return resp; } else { resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian"); return resp; } } else { resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian"); return resp; ; } } else { //验证失败 resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian"); return resp; } } } catch (Exception ex) { LoggerHelper.Info("服务器微信异步通知页面", ex); resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian"); return resp; } return resp; } } }
让我们一起来学习C#吧~~~
浙公网安备 33010602011771号