1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Web;
  6. using System.Web.Mvc;
  7. using System.IO;
  8. using System.Security.Cryptography;
  9. using System.Text;
  10. using System.Xml;
  11. using Newtonsoft.Json;
  12. using Newtonsoft.Json.Linq;
  13. namespace Mvc_vue.Controllers
  14. {
  15. public class wxController : Controller
  16. {
  17. //
  18. // GET: /wx/
  19.  
  20. public ActionResult Index()
  21. {
  22. return View();
  23. }
  24. //所需值
  25. public static string _appid = "wxd930ea5d5a258f4f";
  26. public static string _mch_id = "";
  27. public static string _key = "192006250b4c09247ec02edce69f6a2d";
  28.  
  29. //模拟wx统一下单 openid(前台获取)
  30. public string getda(string openid)
  31. {
  32. return Getprepay_id(_appid, "shanghaifendian", "monixiaofei", _mch_id, GetRandomString(), "http://www.weixin.qq.com/wxpay/pay.php", openid, getRandomTime(), );
  33.  
  34. }
  35.  
  36. //微信统一下单获取prepay_id & 再次签名返回数据
  37. private static string Getprepay_id(string appid, string attach, string body, string mch_id, string nonce_str, string notify_url, string openid, string bookingNo, int total_fee)
  38. {
  39. var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信统一下单请求地址
  40. string strA = "appid=" + appid + "&attach=" + attach + "&body=" + body + "&mch_id=" + mch_id + "&nonce_str=" + nonce_str + "&notify_url=" + notify_url + "&openid=" + openid + "&out_trade_no=" + bookingNo + "&spbill_create_ip=61.50.221.43&total_fee=" + total_fee + "&trade_type=JSAPI";
  41. string strk = strA + "&key="+_key; //key为商户平台设置的密钥key(假)
  42. string strMD5 = MD5(strk).ToUpper();//MD5签名
  43.  
  44. //string strHash=HmacSHA256("sha256",strmd5).ToUpper(); //签名方式只需一种(MD5 或 HmacSHA256 【支付文档需仔细看】)
  45.  
  46. //签名
  47. var formData = "<xml>";
  48. formData += "<appid>" + appid + "</appid>";//appid
  49. formData += "<attach>" + attach + "</attach>"; //附加数据(描述)
  50. formData += "<body>" + body + "</body>";//商品描述
  51. formData += "<mch_id>" + mch_id + "</mch_id>";//商户号
  52. formData += "<nonce_str>" + nonce_str + "</nonce_str>";//随机字符串,不长于32位。
  53. formData += "<notify_url>" + notify_url + "</notify_url>";//通知地址
  54. formData += "<openid>" + openid + "</openid>";//openid
  55. formData += "<out_trade_no>" + bookingNo + "</out_trade_no>";//商户订单号 --待
  56. formData += "<spbill_create_ip>61.50.221.43</spbill_create_ip>";//终端IP --用户ip
  57. formData += "<total_fee>" + total_fee + "</total_fee>";//支付金额单位为(分)
  58. formData += "<trade_type>JSAPI</trade_type>";//交易类型(JSAPI--公众号支付)
  59. formData += "<sign>" + strMD5 + "</sign>"; //签名
  60. formData += "</xml>";
  61.  
  62. //请求数据
  63. var getdata = sendPost(url, formData);
  64.  
  65. //获取xml数据
  66. XmlDocument doc = new XmlDocument();
  67. doc.LoadXml(getdata);
  68. //xml格式转json
  69. string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc);
  70.  
  71. JObject jo = (JObject)JsonConvert.DeserializeObject(json);
  72. string prepay_id = jo["xml"]["prepay_id"]["#cdata-section"].ToString();
  73.  
  74. //时间戳
  75. string _time = getTime().ToString();
  76.  
  77. //再次签名返回数据至小程序
  78. string strB = "appId=" + appid + "&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id + "&signType=MD5&timeStamp=" + _time + "&key="_key;
  79.  
  80. //wx自己写的一个类
  81. wx w = new wx();
  82. w.timeStamp = _time;
  83. w.nonceStr = nonce_str;
  84. w.package = "prepay_id=" + prepay_id;
  85. w.paySign = MD5(strB).ToUpper(); ;
  86. w.signType = "MD5";
  87.  
  88. //向小程序返回json数据
  89. return JsonConvert.SerializeObject(w);
  90. }
  91.  
  92. /// <summary>
  93. /// 生成随机串
  94. /// </summary>
  95. /// <param name="length">字符串长度</param>
  96. /// <returns></returns>
  97. private static string GetRandomString(int length)
  98. {
  99. const string key = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
  100. if (length < )
  101. return string.Empty;
  102.  
  103. Random rnd = new Random();
  104. byte[] buffer = new byte[];
  105.  
  106. ulong bit = ;
  107. ulong result = ;
  108. int index = ;
  109. StringBuilder sb = new StringBuilder((length / + ) * );
  110.  
  111. while (sb.Length < length)
  112. {
  113. rnd.NextBytes(buffer);
  114.  
  115. buffer[] = buffer[] = buffer[] = 0x00;
  116. result = BitConverter.ToUInt64(buffer, );
  117.  
  118. while (result > && sb.Length < length)
  119. {
  120. index = (int)(bit & result);
  121. sb.Append(key[index]);
  122. result = result >> ;
  123. }
  124. }
  125. return sb.ToString();
  126. }
  127.  
  128. /// <summary>
  129. /// 获取时间戳
  130. /// </summary>
  131. /// <returns></returns>
  132. private static long getTime()
  133. {
  134. TimeSpan cha = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , )));
  135. long t = (long)cha.TotalSeconds;
  136. return t;
  137. }
  138.  
  139. /// <summary>
  140. /// MD5签名方法
  141. /// </summary>
  142. /// <param name="inputText">加密参数</param>
  143. /// <returns></returns>
  144. private static string MD5(string inputText)
  145. {
  146. MD5 md5 = new MD5CryptoServiceProvider();
  147. byte[] fromData = System.Text.Encoding.UTF8.GetBytes(inputText);
  148. byte[] targetData = md5.ComputeHash(fromData);
  149. string byte2String = null;
  150.  
  151. for (int i = ; i < targetData.Length; i++)
  152. {
  153. byte2String += targetData[i].ToString("x2");
  154. }
  155.  
  156. return byte2String;
  157. }
  158. /// <summary>
  159. /// HMAC-SHA256签名方式
  160. /// </summary>
  161. /// <param name="message"></param>
  162. /// <param name="secret"></param>
  163. /// <returns></returns>
  164. private static string HmacSHA256(string message, string secret)
  165. {
  166. secret = secret ?? "";
  167. var encoding = new System.Text.UTF8Encoding();
  168. byte[] keyByte = encoding.GetBytes(secret);
  169. byte[] messageBytes = encoding.GetBytes(message);
  170. using (var hmacsha256 = new HMACSHA256(keyByte))
  171. {
  172. byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
  173. return Convert.ToBase64String(hashmessage);
  174. }
  175. }
  176.  
  177. /// <summary>
  178. /// wx统一下单请求数据
  179. /// </summary>
  180. /// <param name="URL">请求地址</param>
  181. /// <param name="urlArgs">参数</param>
  182. /// <returns></returns>
  183. private static string sendPost(string URL, string urlArgs)
  184. {
  185.  
  186. System.Net.WebClient wCient = new System.Net.WebClient();
  187. wCient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
  188. //byte[] postData = System.Text.Encoding.ASCII.GetBytes(urlArgs); 如果微信签名中有中文会签名失败
  189.       byte[] postData = System.Text.Encoding.UTF8.GetBytes(urlArgs);     
  190. byte[] responseData = wCient.UploadData(URL, "POST", postData);
  191.         
  192. string returnStr = System.Text.Encoding.UTF8.GetString(responseData);//返回接受的数据
  193. return returnStr;
  194. }
  195.  
  196. /// <summary>
  197. /// 生成订单号
  198. /// </summary>
  199. /// <returns></returns>
  200. private static string getRandomTime()
  201. {
  202. Random rd = new Random();//用于生成随机数
  203. string DateStr = DateTime.Now.ToString("yyyyMMddHHmmssMM");//日期
  204. string str = DateStr + rd.Next().ToString().PadLeft(, '');//带日期的随机数
  205. return str;
  206. }
  207.  
  208. }
  209. }

使用的是MVC .NET Framework4

微信小程序支付 小程序端源码

MVC项目发布前的配置

微信小程序支付C#后端源码的更多相关文章

  1. 基于olami开放语义平台的微信小程序遥知之源码实现

    概述 实现一个智能生活信息查询的小秘书功能,支持查天气.新闻.日历.汇率.笑话.故事.百科.诗词.邮编.区号.菜谱.股票.节目预告,还支持闲聊.算24点.数学计算.单位换算.购物.搜索等功能. 使用方 ...

  2. 微信小程序支付+php后端

    最近在做自有项目后端用的是thinkphp5.1框架,闲话不说直接上代码 小程序代码 wxpay: function(e){ let thisid = e.currentTarget.dataset. ...

  3. 微信小程序支付源码,后台服务端代码

    作者:尹华南,来自原文地址 微信小程序支付绕坑指南 步骤 A:小程序向服务端发送商品详情.金额.openid B:服务端向微信统一下单 C:服务器收到返回信息二次签名发回给小程序 D:小程序发起支付 ...

  4. Java 后端微信小程序支付demo (网上说的坑里面基本上都有)

    Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...

  5. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  6. .Net后台实现微信小程序支付

    最近一直再研究微信支付和支付宝支付,官方支付文档中一直在讲与第三方支付打交道的原理,却没有介绍我们自己项目中的APP与后台该怎么交互(哈哈,人家也没必要介绍这一块).拜读了官方文档和前辈们的佳作,自己 ...

  7. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  8. 微信小程序支付及退款流程详解

    微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端 ...

  9. SpringBoot2.0微信小程序支付多次回调问题

    SpringBoot2.0微信小程序支付多次回调问题 WxJava - 微信开发 Java SDK(开发工具包); 支持包括微信支付.开放平台.公众号.企业微信/企业号.小程序等微信功能的后端开发. ...

随机推荐

  1. 转)TNS协议--翻译自《The Oracle Hackers Handbook》

    在开发源工具解决Oracle中的问题时,必须了解TNS协议.在努力理解TNS协议的时候,Oracle JDBC驱动程序(classes12.zip)会是一个很有用的资源TNS头. 每个TNS包都有一个 ...

  2. python之用户登陆作业

    实现一个用户登陆的小程序,如果密码错误,可以重试三次,如果三次均错误,则锁定 数据库如下格式,分别用户名|密码|锁定,其中锁定字段0为正常,1为被锁定 root|admin123|0 admin|ad ...

  3. [leetcode]238. Product of Array Except Self除了自身以外的数组元素乘积

    Given an array nums of n integers where n > 1,  return an array output such that output[i] is equ ...

  4. php加速缓存器opcache,apc,xcache,eAccelerator

    一.opcache opcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销.   PHP 5. ...

  5. uploadify 文件上传报http 302错误

    uploadify文件上传会报http 302错误,在配置文件中将处理上传的通用类取消验证, 假设上传的通用处理类是fileUpload.ashx,则在配置文件同添加下面过滤配置能解决问题. < ...

  6. Ubuntu下安装VirtualBox并为其添加USB支持

    1.下载VirtualBox软件包和USB支持包 下载网址均为官方网站(可在此查看其使用教程):https://www.virtualbox.org/wiki/Downloads (若下载各平台各版本 ...

  7. ShowMsg函数

    ShowMsg():显示提示信息,跳转到相应页面 例子: ShowMsg(,);

  8. sdkbox 接facebook

    详情参见:http://sdkbox-doc.github.io/en/plugins/facebook/v3-js/#manual-integration 一步不落然后 *** Terminatin ...

  9. phoenix错误

    spark集群与phoenix进行数据请求时报错: 2018-06-15 17:13:30,158 INFO - Starting task 15.3 in stage 116.0 (TID 6832 ...

  10. 常见的web服务器软件分类

    (1)ApacheApache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上.Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软 ...