1. 一、微信第三方登录
  2. 通过微信打开链接:http://www.hzm.com/Entry/Login
  3. 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:
  4.   . 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  5.  
  6.   . 通过code参数加上AppIDAppSecret等,通过API换取access_token
  7.  
  8.   . 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
  9. .控制器中代码
  10. public ActionResult Login()
  11. {
  12. //若已经登录,直接跳到首页
  13. if (HttpContext.User.Identity.IsAuthenticated)
  14. {
  15. return RedirectToAction("Index", "Entry");
  16. }
  17. //微信登录
  18. //1.获取code
  19. if (string.IsNullOrEmpty(Request.QueryString["code"]))
  20. {
  21. //从定向到微信,微信再重定向到当前函数(进入第1步获取code)
  22. return RedirectToWeixin();
  23. }
  24. //2.获取openID
  25. //通过code获取openID
  26. string openID = "";
  27. try
  28. {
  29. openID = GetOpenID(Request.QueryString["code"]);
  30. }
  31. catch(Exception e)
  32. {
  33. Log.Debug("GetOpenID Exception", e.StackTrace);
  34. return Redirect("/Entry/Login");
  35. }
  36. //3.查找或存储用户信息
  37. User user = new User();
  38. user = db.Users.SingleOrDefault(p => p.OpenID == openID);
  39. if (user == null)
  40. {
  41. //添加用户
  42. user = new User();
  43. user.OpenID = openID;
  44. db.Users.Add(user);
  45. db.SaveChanges();
  46. }
  47. //登录成功
  48. FormsAuthentication.SetAuthCookie(user.ID.ToString(), false);//记录登录凭证
  49. return RedirectToAction("Index", "Entry");
  50. }
  51. 1.1.获取code
  52. private ActionResult RedirectToWeixin()
  53. {
  54. JsApiPay jsApiPay = new JsApiPay(this);
  55. var redirect_url = jsApiPay.GetRedirectToWeixinUrlForCode();//将回调stata参数值设为awardUserID
  56. return Redirect(redirect_url);//调回:/Entry/Login
  57. }
  58. 1.2.通过code获取openIDaccess_token
  59. private string GetOpenID(string code)
  60. {
  61. JsApiPay jsApiPay = new JsApiPay(this);
  62. //如果code有值
  63. if (!string.IsNullOrEmpty(code))
  64. {
  65. Log.Debug(" GetOpenID code", code);
  66. //去获取OpenID
  67. jsApiPay.GetOpenidAndAccessTokenFromCode(code);
  68. }
  69. Log.Debug("GetOpenidAndAccessTokenFromCode openid", jsApiPay.openid.ToString());
  70. return jsApiPay.openid.ToString();
  71. }
  72. 二、微信支付
  73. 2.1.生成业务订单和微信交易号Out_trade_no
  74. public ActionResult CreateOrder(int entryID, PayMode payMode)
  75. {
  76. //一个报名只应对应一个订单
  77. //判断订单是否已经存在,则直接进入详情页
  78. if (db.Orders.Any(p => p.EntryID == entryID))
  79. {
  80. return Redirect("/Entry/Detail?out_trade_no=" + db.Orders.SingleOrDefault(p => p.EntryID == entryID).Out_trade_no);
  81. }
  82. Entry entry = db.Entrys.Include("Event").SingleOrDefault(p => p.ID == entryID);
  83. Order order = new Order();
  84. order.EntryID = entry.ID;
  85. order.Amount = GetDiscount(entry.Event);
  86. order.PayMode = payMode;
  87. order.State = OrderSatet.Unpaid;
  88. order.SubmitTime = DateTime.Now;
  89. order.Body = entry.Event.Theme;
  90. order.Out_trade_no = WxPayApi.GenerateOutTradeNo();
  91. db.Orders.Add(order);
  92. db.SaveChanges();
  93. if (payMode == PayMode.Remittance)
  94. {
  95. return RedirectToAction("Detail", new { out_trade_no = order.Out_trade_no });
  96. }
  97. return RedirectToAction("Pay", new { orderID = order.ID });
  98. }
  99. 2.2.微信支付
  100. public ActionResult Pay(int orderID)
  101. {
  102. //获取订单
  103. Order order = db.Orders.SingleOrDefault(p => p.ID == orderID);
  104.  
  105. //修改支付方式
  106. order.PayMode = PayMode.Weixin;
  107. db.SaveChanges();
  108.  
  109. //微信openID
  110. Entry entry = db.Entrys.Include("Event").SingleOrDefault(p => p.ID == order.EntryID);
  111. User user = db.Users.SingleOrDefault(p => p.ID == entry.UserID);
  112. Log.Debug("openID", user.OpenID);
  113. Log.Debug("entry.UserID", entry.UserID.ToString());
  114. Log.Debug("HttpContext.User.Identity.Name", HttpContext.User.Identity.Name);
  115. //当前订单的商户系统的订单号
  116. ViewData["out_trade_no"] = order.Out_trade_no;
  117. //支付费用
  118. decimal totalFee = GetDiscount(entry.Event);
  119. Log.Debug("totalFee", "100.00");
  120. JsApiPay jsApiPay = new JsApiPay(this);
  121. try
  122. {
  123. //若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数
  124. jsApiPay.openid = user.OpenID;
  125.  
  126. jsApiPay.total_fee = Convert.ToInt32(totalFee * );//支持两位小数,如0.01
  127. Log.Debug(this.GetType().ToString(), "参数赋值成功1");
  128. //JSAPI支付预处理
  129. Log.Debug(this.GetType().ToString(), "参数赋值成功2");
  130. WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(entry.Name + "的" + entry.Event.Theme, "报名", order.Out_trade_no);
  131.  
  132. Log.Debug(this.GetType().ToString(), "预支付订单生成成功");
  133. //获取H5调起JS API参数
  134. var wxJsApiParam = jsApiPay.GetJsApiParameters();
  135. ViewData["wxJsApiParam"] = wxJsApiParam;
  136.  
  137. Log.Debug(this.GetType().ToString(), "wxJsApiParam参数获取成功");
  138. //预支付订单号
  139. var prepay_id = jsApiPay.unifiedOrderResult.GetValue("prepay_id").ToString();
  140. ViewData["prepay_id"] = prepay_id;
  141. Log.Debug(this.GetType().ToString(), "prepay_id参数获取成功");
  142. /*###################################*/
  143. Log.Debug(this.GetType().ToString(), "wxJsApiParam : " + wxJsApiParam);
  144. }
  145. catch (Exception ex)
  146. {
  147. Response.Write("<span style='color:#FF0000;font-size:20px'>" + "下单失败,请返回重试" + "</span>");
  148. Log.Debug("Award-ConfirmPayPage", ex.Message + ex.StackTrace);
  149. Log.Debug("Award-ConfirmPayPage", "预支付订单生成或保存异常");
  150. }
  151.  
  152. return View();
  153.  
  154. }
  155. 2.3.页面中调起微信支付接口(Pay.html)
  156. @{
  157. Layout = null;
  158. }
  159. <!DOCTYPE html>
  160. <html>
  161. <head>
  162. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  163. <title>支付页面</title>
  164. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  165. <script type="text/javascript">
  166. var wxJsApiParam=@Html.Raw(ViewData["wxJsApiParam"].ToString());
  167. //调用微信JS api 支付
  168.  
  169. function jsApiCall() {
  170. WeixinJSBridge.invoke(
  171. 'getBrandWCPayRequest',
  172. wxJsApiParam,
  173. function (res)
  174. {
  175. WeixinJSBridge.log(res.err_msg);
  176.  
  177. //alert(res.err_code + res.err_desc + res.err_msg);
  178.  
  179. if(res.err_msg=="get_brand_wcpay_request:ok"){
  180. location.href ="/Entry/Detail?out_trade_no=@ViewData["out_trade_no"]";
  181. }else
  182. {
  183. location.href ="/Entry/Detail?out_trade_no=@ViewData["out_trade_no"]";
  184. }
  185.  
  186. //alert(res.err_msg);
  187. }
  188. );
  189. }
  190.  
  191. function callpay()
  192. {
  193. if (typeof WeixinJSBridge == "undefined")
  194. {
  195. if (document.addEventListener)
  196. {
  197. document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
  198. }
  199. else if (document.attachEvent)
  200. {
  201. document.attachEvent('WeixinJSBridgeReady', jsApiCall);
  202. document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
  203. }
  204. }
  205. else
  206. {
  207. jsApiCall();
  208. }
  209. }
  210. callpay();
  211. </script>
  212. </head>
  213. <body>
  214. </body>
  215. </html>
  216. 2.4.支付成功后微信发送支付成功异步通知(post方式,通知地址在Config.cs中配置的NOTIFY_URL,在这里添加订单处理业务逻辑)
  217. public ActionResult Notify()
  218. {
  219. ResultNotify notify = new ResultNotify(this);
  220. WxPayData data = notify.GetNotifyData();
  221. Log.Debug("return_code", data.GetValue("return_code").ToString());
  222. Log.Debug("return_msg", data.GetValue("return_code").ToString());
  223. if (data.GetValue("return_code").ToString() == "SUCCESS")
  224. {
  225. Log.Debug("out_trade_no", data.GetValue("out_trade_no").ToString());
  226. var out_trade_no = data.GetValue("out_trade_no").ToString();
  227.  
  228. Order order = db.Orders.SingleOrDefault(p => p.Out_trade_no == out_trade_no);
  229. Log.Debug("orderID", order.ID.ToString());
  230.  
  231. order.State = OrderSatet.Paid;
  232. var time_end = data.GetValue("time_end").ToString();
  233. order.PayTime = DateTime.ParseExact(time_end, "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
  234. order.TransactionID = data.GetValue("transaction_id").ToString();
  235. order.OpenID = data.GetValue("openid").ToString();
  236. db.SaveChanges();
  237.  
  238. }
  239. notify.ProcessNotify();
  240.  
  241. return View();
  242. }
  243. 2.5.支付成功后跳转到(Pay.html页面设置的地址)
  244. 如:location.href ="/Entry/Detail?out_trade_no=@ViewData["out_trade_no"]";
    微信支付官方文档地址:
    1.App微信支付:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

.net mvc 微信支付的更多相关文章

  1. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  2. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  3. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  4. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  5. C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付           今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...

  6. 【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付           今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后 ...

  7. C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是"模板消息"的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信 ...

  8. MVC 微信支付

    微信支付方式有好几种,俺研究了跟自己需要的两种,即:JS API网页支付和Native原生支付,这两个名词实在是有目的难懂.JS API网页支付:我的理解是在微信浏览器里面可以调用微信支付控件的支付方 ...

  9. asp.net mvc 微信支付代码分析(根据沐雪微信平台3.1商城业务来分析)

    开发微信应用,微信支付是永远要面对的.现在的微信支付相对以往已经很稳定,很少出现诡异情况.再加上无数人开发的经验分享,现在开发微信支付已经没什么难度了. 我这次主要是想基于沐雪微信平台的微商城业务来分 ...

随机推荐

  1. 详细安装ss的过程(vultr)

    #更新程序yum update -y #安装setuptoolsyum install -y python-setuptools #安装pipeasy_install pip #安装shadowsoc ...

  2. delphi中Message消息的使用方法

    实例1 unit Unit1; interface   uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls ...

  3. 20. Candy && Gas Station

    Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  4. Distributed Transaction Coordinator 无法启动

    有时候我们需要进行COM应用程序的权限设置,控制面板-->管理工具-->组件服务-->然后依此展开:组件服务-->计算机-->我的电脑-->DCOM 配置,接下来找 ...

  5. Flex数据交互之WebService

    In this article you will learn how to call webservices hosted on asp.net applications from flex. Fir ...

  6. android 实现桌面显示内容

    //获取windowmanager 对象 WindowManager wm = (WindowManager) getApplicationContext().getSystemService(WIN ...

  7. Excel 日期转换

    public static void importExcel2(File file) throws Exception, IOException { Workbook book = Workbook. ...

  8. C++学习基础五之函数参数——形参

    一.理论部分 C++中函数形参主要分为两类,如图1所示, 图1 总结: 一.当函数参数为非引用形参时,传进函数体内的是实参的拷贝,(注意,对于基本类型而言,拷贝的是实参的值,对于指针而言拷贝的是实参的 ...

  9. Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制

    本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blac ...

  10. SQL笔记-第五章,函数

    一.数学函数 功能 函数名  用法 绝对值  ABS()    指数  POWER() POWER(FWeight,-0.5)  平方根  SQRT()    求随机数  RAND()    舍入到最 ...