相关文档  https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1

需要准备 公众号ID、商户号、商家私钥

1、登录微信商户平台申请开通h5支付功能

2、在产品中心-开发配置添加域名配置

  1.  

static string _pre_order_url = "https://api.mch.weixin.qq.com";//请求域名

      static string _appid = "";//公众账号ID
      static string _mch_id = "";//商户号
      static string _partnerKey = "";//商家私钥

  1.  
  2.      #region 微信支付
  3. public static void WeChatIndex()
  4. {
  5. #region 下单
  6. var _attach = "支付测试";
  7. var _body = "H5支付测试";
  8. var _nonce_str = CreateNonce_str();
  9. var _notify_url = "https://www.baidu.com";
  10. var _out_trade_no = Guid.NewGuid().ToString("N");
  11. var _spbill_create_ip = GetWebClientIp()
  12. var _total_fee = 0.01;//元为单位
  13. var _trade_type = "MWEB";
  14. var _scene_info = $@"{{""h5_info"": {{""type"":""Wap"",""wap_url"": ""{_notify_url}"",""wap_name"": ""{_body}""}}}}";
  15. var _time_start = DateTime.Now.ToString("yyyyMMddHHmmss");
  16. var _time_expire = DateTime.Now.AddHours().ToString("yyyyMMddHHmmss");
  17.  
  18. var pre_order_httpResult = UnifiedOrder(_appid, _attach, _body, _mch_id, _nonce_str, _notify_url, _out_trade_no, _spbill_create_ip, _total_fee,
  19. _trade_type, _scene_info, _time_start, _time_expire);
  20. var pre_order_resultStr = XElement.Parse(pre_order_httpResult);
  21. var pre_order_result_code = pre_order_resultStr.Element("return_code").Value;
  22. var pre_order_result_msg = pre_order_resultStr.Element("return_msg").Value;
  23. if (pre_order_result_code == "SUCCESS")
  24. {
  25. var pre_order_result_mweb_url = pre_order_resultStr.Element("return_msg").Value;
  26. }
  27. #endregion
  28.  
  29. #region 查询订单
  30.  
  31. #endregion
  32.  
  33. Console.ReadKey();
  34. }
  35.  
  36. /// <summary>
  37. /// 下单
  38. /// </summary>
  39. /// <param name="appid">公众账号ID</param>
  40. /// <param name="attach">附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据</param>
  41. /// <param name="body">String(32) 商品描述 商品或支付单简要描</param>
  42. /// <param name="mch_id">商户号</param>
  43. /// <param name="nonce_str">随机字符串</param>
  44. /// <param name="notify_url">接收微信支付异步通知回调地址,不可带参,与下面的Notify对应,开发者可自定义其他url地址 </param>
  45. /// <param name="out_trade_no">商户系统内部的订单号,32个字符内、可包含字母</param>
  46. /// <param name="spbill_create_ip">终端ip</param>
  47. /// <param name="total_fee">收钱总额 分为单位 前台传过来后需要处理成分</param>
  48. /// <param name="trade_type">交易类型H5支付的交易类型为MWEB</param>
  49. /// <param name="scene_info">场景信息 WAP网站应用{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}}</param>
  50. /// <param name="time_start">交易起始时间</param>
  51. /// <param name="time_expire">交易结束时间</param>
  52. /// <returns></returns>
  53. static string UnifiedOrder(string appid,string attach,string body,string mch_id,string nonce_str,string notify_url,string out_trade_no,
  54. string spbill_create_ip,double total_fee,string trade_type,string scene_info,string time_start,string time_expire)
  55. {
  56. var stringADict = new Dictionary<string, string>();
  57. stringADict.Add("appid", appid);
  58. stringADict.Add("attach", attach);
  59. stringADict.Add("body", body);
  60. stringADict.Add("mch_id", mch_id);
  61. stringADict.Add("nonce_str", nonce_str);
  62. stringADict.Add("notify_url", notify_url);
  63. stringADict.Add("out_trade_no", out_trade_no);
  64. stringADict.Add("spbill_create_ip", spbill_create_ip);
  65. stringADict.Add("total_fee", Math.Round(Convert.ToDecimal(total_fee) * , ).ToString());//元转分
  66. stringADict.Add("trade_type", trade_type);
  67. stringADict.Add("scene_info", scene_info);
  68. stringADict.Add("time_start", time_start);
  69. stringADict.Add("time_expire", time_expire);
  70. var sign = Sign(stringADict, _partnerKey);//生成签名字符串
  71.  
  72. //组合xml内容
  73. StringBuilder strBuilder = new StringBuilder();
  74. strBuilder.Append("<xml>");
  75. strBuilder.Append($"<appid>{appid}</appid>");//公众号id
  76. strBuilder.Append($"<attach>{attach}</attach>");//附加数据
  77. strBuilder.Append($"<body>{body}</body>");//商品描述
  78. strBuilder.Append($"<mch_id>{mch_id}</mch_id>");//商户号
  79. strBuilder.Append($"<nonce_str>{nonce_str}</nonce_str>");//随机字符串
  80. strBuilder.Append($"<notify_url>{notify_url}</notify_url>");//接收微信支付异步通知回调地址,不可带参,与下面的Notify对应,开发者可自定义其他url地址
  81. strBuilder.Append($"<out_trade_no>{out_trade_no}</out_trade_no>");//商户系统内部的订单号,32个字符内、可包含字母
  82. strBuilder.Append($"<spbill_create_ip>{spbill_create_ip}</spbill_create_ip>");//终端ip
  83. strBuilder.Append($"<total_fee>{Math.Round(Convert.ToDecimal(total_fee) * 100, 0).ToString()}</total_fee>");//收钱总额 分为单位 前台传过来后需要处理成分
  84. strBuilder.Append($"<trade_type>{trade_type}</trade_type>");//交易类型H5支付的交易类型为MWEB
  85. strBuilder.Append($"<scene_info>{scene_info}</scene_info>");
  86. strBuilder.Append($"<time_start>{time_start}</time_start>");//交易起始时间
  87. strBuilder.Append($"<time_expire>{time_expire}</time_expire>");//交易结束时间
  88. strBuilder.Append($"<sign>{sign}</sign>");
  89. strBuilder.Append("</xml>");
  90.  
  91. //var url = _pre_order_url + "/sandboxnew/pay/unifiedorder";//沙箱
  92. var url = _pre_order_url + "/pay/unifiedorder";
  93. var pre_order_httpResult = HttpPostRequestXml(url, strBuilder);
  94. return pre_order_httpResult;
  95. }
  96.  
  97. /// <summary>
  98. /// 查询订单
  99. /// </summary>
  100. /// <param name="appid">公众账号ID</param>
  101. /// <param name="mch_id">商户号</param>
  102. /// <param name="out_trade_no">商户系统内部的订单号或微信的订单号</param>
  103. /// <param name="nonce_str">随机字符串</param>
  104. /// <returns></returns>
  105. static string Orderquery(string appid,string mch_id,string out_trade_no,string nonce_str)
  106. {
  107. var stringADict = new Dictionary<string, string>();
  108. stringADict.Add("appid", appid);
  109. stringADict.Add("mch_id", mch_id);
  110. stringADict.Add("out_trade_no", out_trade_no);
  111. stringADict.Add("nonce_str", nonce_str);
  112. var sign = Sign(stringADict, _partnerKey);//生成签名字符串
  113.  
  114. //组合xml内容
  115. StringBuilder strBuilder = new StringBuilder();
  116. strBuilder.Append("<xml>");
  117. strBuilder.Append($"<appid>{appid}</appid>");
  118. strBuilder.Append($"<mch_id>{mch_id}</mch_id>");
  119. strBuilder.Append($"<out_trade_no>{out_trade_no}</out_trade_no>");
  120. strBuilder.Append($"<nonce_str>{nonce_str}</nonce_str>");
  121. strBuilder.Append($"<sign>{sign}</sign>");
  122. strBuilder.Append("</xml>");
  123.  
  124. var url = _pre_order_url + "/pay/orderquery";
  125. var pre_order_httpResult = HttpPostRequestXml(url, strBuilder);
  126. return pre_order_httpResult;
  127. }
  128.  
  129. /// <summary>
  130. /// 发送post xml文件请求
  131. /// </summary>
  132. /// <param name="Url"></param>
  133. /// <param name="strBuilder"></param>
  134. /// <returns></returns>
  135. static string HttpPostRequestXml(string Url,StringBuilder strBuilder)
  136. {
  137. string result = string.Empty;
  138. string data = strBuilder.ToString();
  139. //进行utf-8编码
  140. var encoding = Encoding.GetEncoding("utf-8");
  141. byte[] buffer = encoding.GetBytes(data);
  142. //根据webURL创建HttpWebRequest对象
  143. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
  144. request.Method = "post";
  145. //request.Headers.Add("charset:utf-8");
  146. request.ContentLength = buffer.Length;
  147. request.ContentType = "text/xml";
  148.  
  149. StreamWriter myWriter = null;
  150. try
  151. {
  152. myWriter = new StreamWriter(request.GetRequestStream());
  153. myWriter.Write(data);
  154. }
  155. catch (Exception e)
  156. {
  157. Console.WriteLine(e.Message);
  158. }
  159. finally
  160. {
  161. myWriter.Close();
  162. }
  163. //读取服务器返回的信息
  164. HttpWebResponse objResponse = (HttpWebResponse)request.GetResponse();
  165. using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
  166. {
  167. result = sr.ReadToEnd();
  168. }
  169. return result;
  170. }
  171.  
  172. private static string[] strs = new string[]
  173. {
  174. "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",
  175. "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"
  176. };
  177.  
  178. /// <summary>
  179. /// 创建随机字符串
  180. /// </summary>
  181. /// <returns></returns>
  182. public static string CreateNonce_str()
  183. {
  184. Random r = new Random();
  185. var sb = new StringBuilder();
  186. var length = strs.Length;
  187. for (int i = ; i < ; i++)
  188. {
  189. sb.Append(strs[r.Next(length - )]);
  190. }
  191. return sb.ToString();
  192. }
  193.  
  194. /// <summary>
  195. /// 获取终端IP地址
  196. /// </summary>
  197. /// <returns></returns>
  198. public static string GetWebClientIp()
  199. {
  200. string userIP = "";
  201. try
  202. {
  203. if (System.Web.HttpContext.Current == null
  204. || System.Web.HttpContext.Current.Request == null
  205. || System.Web.HttpContext.Current.Request.ServerVariables == null)
  206. return "";
  207. string CustomerIP = "";
  208. //CDN加速后取到的IP simone 090805
  209. CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];
  210. if (!string.IsNullOrEmpty(CustomerIP))
  211. {
  212. return CustomerIP;
  213. }
  214. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
  215. if (!String.IsNullOrEmpty(CustomerIP))
  216. {
  217. return CustomerIP;
  218. }
  219. if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
  220. {
  221. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
  222. if (CustomerIP == null)
  223. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
  224. }
  225. else
  226. {
  227. CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
  228. }
  229. if (string.Compare(CustomerIP, "unknown", true) == )
  230. return System.Web.HttpContext.Current.Request.UserHostAddress;
  231. return CustomerIP;
  232. }
  233. catch { }
  234. return userIP;
  235. }
  236.  
  237. /// <summary>
  238. /// 生成签名
  239. /// 签名在线验证工具:
  240. /// http://mch.weixin.qq.com/wiki/tools/signverify/
  241. /// </summary>
  242. /// <param name="stringADict">参与签名生成的参数列表</param>
  243. /// <param name="partnerKey">商家私钥</param>
  244. /// <returns></returns>
  245. public static string Sign(IDictionary<string, string> stringADict, string partnerKey)
  246. {
  247. var sb = new StringBuilder();
  248. foreach (var sA in stringADict.OrderBy(x => x.Key))//参数名ASCII码从小到大排序(字典序);
  249. {
  250. if (string.IsNullOrEmpty(sA.Value)) continue;//参数的值为空不参与签名;
  251. if (string.Compare(sA.Key, "sign", true) == ) continue; // 参数中为签名的项,不参加计算
  252. sb.Append(sA.Key).Append("=").Append(sA.Value).Append("&");
  253. }
  254. var string1 = sb.ToString();
  255. string1 = string1.Remove(string1.Length - , );
  256. sb.Append("key=").Append(partnerKey);//在stringA最后拼接上key=(API密钥的值)得到stringSignTemp字符串
  257. var stringSignTemp = sb.ToString();
  258. var sign = MD5Encrypt(stringSignTemp, "UTF-8").ToUpper();//对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
  259. return sign;
  260. }
  261.  
  262. /// <summary>
  263. /// 用MD5加密字符串
  264. /// </summary>
  265. /// <param name="password">待加密的字符串</param>
  266. /// <returns></returns>
  267. public static string MD5Encrypt(string password, string encoding)
  268. {
  269. MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
  270. byte[] hashedDataBytes;
  271. hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding(encoding).GetBytes(password));
  272. StringBuilder tmp = new StringBuilder();
  273. foreach (byte i in hashedDataBytes)
  274. {
  275. tmp.Append(i.ToString("x2"));
  276. }
  277. return tmp.ToString();
  278. }
  279. #endregion
  1. /// <summary>
  2. /// 微信支付异步回调(修改请参考相关文档)
  3. /// </summary>
  4. /// <returns></returns>
  5. public ActionResult WechatpayAsynchronousReception()
  6. {
  7. StreamReader reader = new StreamReader(Request.InputStream);
  8. string xmlData = reader.ReadToEnd();
  9. new LogEntity().SetLogMessage("xmlData:" + xmlData);
  10. var xmlDataStr = XElement.Parse(xmlData);
  11. StringBuilder strBuilder = new StringBuilder();//组合xml内容
  12.  
  13. string return_code = "";//返回状态码
  14. string appid = "";//公众账号ID
  15. string mch_id = "";//商户号
  16. string nonce_str = "";//随机字符串
  17. string result_code = "";//业务结果
  18. string transaction_id = "";//微信支付订单号
  19. string out_trade_no = "";//商户订单号
  20.  
  21. return_code = xmlDataStr.Element("return_code").Value;
  22. if (return_code == "SUCCESS")
  23. {
  24. appid = xmlDataStr.Element("appid").Value;
  25. mch_id = xmlDataStr.Element("mch_id").Value;
  26. nonce_str = xmlDataStr.Element("nonce_str").Value;
  27. result_code = xmlDataStr.Element("result_code").Value;
  28. transaction_id = xmlDataStr.Element("transaction_id").Value;
  29. out_trade_no = xmlDataStr.Element("out_trade_no").Value;
  30. var msgStr = $@"WechatpayAsynchronousReception: out_trade_no={out_trade_no},trade_no={transaction_id},trade_status={result_code},DateTimeNow={DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";
  31. new LogEntity().SetLogMessage(msgStr);
  32.  
  33. var model = new PaymentRecordModel();
  34. model.Out_trade_no = out_trade_no;
  35. model.Trade_no = transaction_id;
  36. model.State = result_code == "SUCCESS" ? 1 : 2;
  37. var facade = new TrainingFacade();
  38. var result = new ReturnInfoDTO();
  39. result = facade.OpreationPaymentRecord(model);
  40. if (result.IsSuccess && model.State == 1)
  41. {
  42. return Json(new { return_code = "SUCCESS", return_msg = "OK" }, "text/xml", Encoding.UTF8);
  43. }
  44. }
  45. return Json(new { return_code = "FAIL", return_msg = "NO" }, "text/xml", Encoding.UTF8);
  46. }

  

需要注意的是你要测支付必须在你配置的域名下才能正常跳转支付页面,否则就会“商家参数格式有误,请联系商家解决”或“商家存在未配置参数,请联系商家解决”

C# 微信h5支付的更多相关文章

  1. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

  2. PHP微信H5支付开发

    近来公司项目要求用到微信H5开发,因为微信开发文档处处都是坑,我也走了不少弯路,现在就把H5支付的过程记录一下,已备后用!! 首先 先去商户平台申请开通 H5支付!!!! 我们从微信官方下载H5支付d ...

  3. 微信H5支付网络环境未能通过安全验证,请稍后再试(获取终端ip )

    在写微信H5支付的时候需要获取终端IP使用官方的方法是不对的报错如下: 故重写一个:如下 function get_client_ip(){ if(getenv('HTTP_CLIENT_IP') & ...

  4. 【第二十篇】C#微信H5支付 非微信内浏览器H5支付 浏览器微信支付

    微信开发者文档 微信H5支付官方文档   请阅读清楚  最起码把所有参数看一遍 这个地方也可以看看 微信案例 http://wxpay.wxutil.com/mch/pay/h5.v2.php,请在微 ...

  5. ***新版微信H5支付技术总结(原创)

    新版微信H5支付官方文档: https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 H5支付是指商户在微信客户端外 ...

  6. 微信H5支付坑一--手续费未结算

    简单随笔小记: 场景:在微信H5支付的过程中,无论怎么支付完成,在微信商户后台查询手续费依然未扣除,当时手续费账户月为5元. 解决方法:起初无论怎么测试都不知道代码到底问题出在哪里了,想一下手续费账户 ...

  7. 微信h5支付出现“商家参数格式有误,请联系商家解决”

    在浏览器进行微信h5支付时出现:

  8. C#版微信公众号支付|微信H5支付|微信扫码支付问题汇总及解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存.代码在文章结尾处,有需要的 ...

  9. 黄聪:微信h5支付demo微信H5支付demo非微信浏览器支付demo微信wap支付

    一.首先先确定H5支付权限已经申请! 二.开发流程 1.用户在商户侧完成下单,使用微信支付进行支付 2.由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB ...

  10. 黄聪:详解申请微信h5支付方法,开通微信h5网页支付接口(转)

    版权声明:图文并茂的微信小程序教程!欢迎转载,请保留作者名字和链接:商业合作请联系子恒老师助理 QQ : 2334512685 https://blog.csdn.net/towtotow/artic ...

随机推荐

  1. ras 加解密类,支持截取

    class RsaEncrypt{ private $_privateKey = false; private $_publicKey = false; /** * 私钥解密 * @param $da ...

  2. 梯度下降优化算法综述与PyTorch实现源码剖析

    现代的机器学习系统均利用大量的数据,利用梯度下降算法或者相关的变体进行训练.传统上,最早出现的优化算法是SGD,之后又陆续出现了AdaGrad.RMSprop.ADAM等变体,那么这些算法之间又有哪些 ...

  3. TP5单例模式操作Model

    tp5单例模式的代码实现 为什么要使用单例模式 使用单例模式实现逻辑处理与数据库操作分离能很大提升mysql的sql处理能力,并且易于维护 ArticleModel.php <?php name ...

  4. Python--day27--内置函数isinstance和issubclass方法

  5. Git篇

    安装之后第一步 安装 Git 之后,你要做的第一件事情就是去配置你的名字和邮箱,因为每一次提交都需要这些信息: git config --global user.name "bukas&qu ...

  6. UVA 11400"Lighting System Design"

    传送门 错误思路 正解 AC代码 参考资料: [1]:https://www.cnblogs.com/Kiraa/p/5510757.html 题意: 现给你一套照明系统,这套照明系统共包含 n 种类 ...

  7. 2018-2-13-win10-uwp-隐藏实时可视化

    title author date CreateTime categories win10 uwp 隐藏实时可视化 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 ...

  8. H3C 使用tracert命令

  9. Linux 内核kobject 层次, kset, 和子系统

    kobject 结构常常用来连接对象到一个层级的结构中, 匹配正被建模的子系统的结构. 有 2 个分开的机制对于这个连接: parent 指针和 ksets. 在结构 kobject 中的 paren ...

  10. Linux 内核注册一个 USB 驱动

    所有 USB 驱动必须创建的主要结构是 struct usb_driver. 这个结构必须被 USB 驱动填 充并且包含多个函数回调和变量, 来向 USB 核心代码描述 USB 驱动: struct ...