pay.html 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <!-- 支付页 -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <%- include('components/meta-head.html') %>
  6. <link rel="stylesheet" href="/css/insight.css" />
  7. <script src="/js/jquery-1.11.3.min.js"></script>
  8. <script src="/js/qrcode.min.js"></script>
  9. </head>
  10. <body class="sticky">
  11. <%- include('components/site-header.html') %>
  12. <div class="container gray">
  13. <div class="wrapper">
  14. <div class="bread-crumb">
  15. <a href="/">伏羲学堂</a>
  16. <span><%= course.title%></span>
  17. </div>
  18. <div class="detail">
  19. <div class="figure">
  20. <% if(course.detailvideo) {%>
  21. <div class="video">
  22. <video
  23. src="<%= course.detailvideo %>"
  24. poster="<%= course.detailimg %>"
  25. controls
  26. id="detail_video"
  27. ></video>
  28. <div class="button">
  29. <svg xmlns="http://www.w3.org/2000/svg" class="play xg-icon-play" width="28" height="40" viewBox="3 -4 28 40">
  30. <path fill="#fff" transform="scale(0.0320625 0.0320625)" d="M576,363L810,512L576,661zM342,214L576,363L576,661L342,810z"></path>
  31. </svg>
  32. </div>
  33. </div>
  34. <% }else{%>
  35. <img src="<%= course.detailimg %>" alt="" />
  36. <% }%>
  37. </div>
  38. <div class="content">
  39. <h2><%= course.title%></h2>
  40. <div class="price-area">
  41. <div class="price">
  42. <b><%= course.price%></b><del>¥<%= course.oprice%></del>
  43. </div>
  44. <div class="sales">
  45. <div class="p8"><%= course.discountmsg%></div>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. <div class="pay-order">
  51. <div class="header">
  52. 支付方式
  53. </div>
  54. <ul class="pay-types">
  55. <li class="selected">
  56. <i class="wx-icon"></i>
  57. 微信支付
  58. </li>
  59. </ul>
  60. <div class="header">
  61. 推荐码
  62. </div>
  63. <form action="/api/inviter" method="POST" id="inviter" autocomplete="off" class="inviter">
  64. <input type="text" name="code" placeholder="请输入推荐码" id="input_code" maxlength="4" onfocus="this.placeholder=''" onblur="this.placeholder='请输入推荐码'"/>
  65. <input type="hidden" id="cid" name="cid" value="<%= course.id %>" />
  66. <button type="submit" id="submit_code" disabled>验证</button>
  67. </form>
  68. <div class="err-msg" id="err_msg"></div>
  69. <div class="order-bills">
  70. <div class="content">
  71. <ul class="check-list">
  72. <li>
  73. <span>商品原价:</span>
  74. <span>¥ <%= course.oprice%></span>
  75. </li>
  76. <li>
  77. <span>优惠:</span>
  78. <span>- ¥ <%= course.discount%></span>
  79. </li>
  80. <li id="code_sales_item" style="display:none">
  81. <span>推荐码优惠:</span>
  82. <span id="code_price">- ¥ 0</span>
  83. </li>
  84. <li>
  85. <span>应付:</span>
  86. <span id="real_price"><%= course.price%></span>
  87. </li>
  88. </ul>
  89. <div class="clearfix">
  90. <div class="button" id="paying"><%= parseFloat(course.price) ? "立即购买":"免费领取" %></div>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. <div class="pay-dialog" id="dialog">
  98. <div class="content">
  99. <span class="close-button">×</span>
  100. <h3>微信支付</h3>
  101. <div class="qrcode" id="qrcode"></div>
  102. <div class="pay-type">请使用微信扫描二维码支付 请在<span id="minutes">10</span><span id="seconds">00</span>内支付完成</div>
  103. <div class="price-info" id="price_info"><%= course.price%></div>
  104. <!-- <div class="footer">
  105. <span class="radio checked"></span>
  106. 同意并接受《<a href="/">伏羲碳惠-会员支付协议</a>》
  107. </div> -->
  108. </div>
  109. </div>
  110. <div class="warning-msg" id="warning">
  111. <div class="warning-pop">
  112. <div class="header">
  113. 提示
  114. <span class="close-button" onclick="$('#warning').hide()">×</span>
  115. </div>
  116. <div class="content">
  117. 请点击"验证“按钮,校验推荐码是否有效
  118. </div>
  119. <div class="footer clearfix">
  120. <button type="button" onclick="$('#warning').hide()">确定</button>
  121. </div>
  122. </div>
  123. </div>
  124. <%- include('components/site-footer.html') %>
  125. <script src="/js/video.js"></script>
  126. <script>
  127. var courseId = "<%- course.id %>"
  128. var coursePrice = "<%- course.price %>"
  129. var orderPay = {
  130. init: function(){
  131. orderPay.getQrCode()
  132. },
  133. countdown: function(){
  134. orderPay.timeout -= 1000
  135. if(orderPay.timeout <= 0){
  136. clearTimeout(orderPay.timer)
  137. orderPay.toResult()
  138. return false
  139. }
  140. $('#minutes').html(orderPay.transferTime('m'))
  141. $('#seconds').html(orderPay.transferTime('s'))
  142. orderPay.timer = setTimeout(orderPay.countdown, 1E3)
  143. },
  144. transferTime: function(type){
  145. let time = 0
  146. if(type == 'm'){
  147. time = parseInt((orderPay.timeout % 36E5 ) / 6E4)
  148. }else{
  149. time = (orderPay.timeout % 6E4 ) / 1E3
  150. }
  151. return (time + '').length == 1 ? '0' + time : time
  152. },
  153. show: function(){
  154. if(!$('#submit_code')[0].disabled && $('#err_msg').is(":hidden")){
  155. return $('#warning').fadeIn()
  156. }
  157. $('#dialog').fadeIn()
  158. if(!orderPay.orderId){
  159. orderPay.getQrCode()
  160. }
  161. },
  162. hide: function(){
  163. $('#dialog').hide()
  164. },
  165. checkCode: function (e){
  166. if(orderPay.checking){
  167. return false
  168. }
  169. e.preventDefault()
  170. orderPay.checking = true
  171. $.ajax({
  172. url: '/api/inviter',
  173. type: 'POST',
  174. data: {
  175. code: $('#input_code').val(),
  176. cid: $('#cid').val(),
  177. },
  178. success: function (res){
  179. orderPay.checking = false
  180. if(res.code){
  181. $('#code_sales_item').hide()
  182. return $('#err_msg').addClass('error').html(res.msg)
  183. }
  184. $('#input_code').attr('disabled','disabled');
  185. $('#submit_code')[0].disabled=true
  186. $('#err_msg').addClass('success').html('推荐成功,已更新优惠价格')
  187. $('#code_price').html('- ¥ ' + res.data.discountPrice)
  188. $('#real_price').html(res.data.price)
  189. $('#price_info').html(res.data.price)
  190. $('#code_sales_item').show()
  191. },
  192. error: function(err){
  193. orderPay.checking = false
  194. return alert('网络异常,请稍后重试!')
  195. }
  196. })
  197. },
  198. createQrCode: function(url){
  199. var qrcode = new QRCode(document.querySelector("#qrcode"), {
  200. text: url,
  201. width: 214,
  202. height: 214,
  203. colorDark : "#000000",
  204. colorLight : "#ffffff",
  205. correctLevel : QRCode.CorrectLevel.H
  206. });
  207. // orderPay.connentSSE()
  208. orderPay.timeout = 6E5
  209. orderPay.countdown()
  210. },
  211. toResult: function (){
  212. location.href = '/result/' + orderPay.orderId
  213. },
  214. connentSSE: function (){
  215. var source = new EventSource("/sse?oid=" + orderPay.orderId)
  216. source.onmessage = function(event) {
  217. orderPay.toResult()
  218. }
  219. },
  220. getQrCode: function(){
  221. var data = {
  222. cid: courseId
  223. }
  224. var code= $('#input_code').val()
  225. if(code){
  226. data.code = code
  227. }
  228. $.ajax({
  229. url: '/api/order',
  230. type: 'post',
  231. data,
  232. success: function(res){
  233. if(res && res.data){
  234. orderPay.orderId = res.data.id
  235. orderPay.imgurl = res.data.url
  236. orderPay.connentSSE()
  237. res.data.url && orderPay.createQrCode(res.data.url)
  238. }else{
  239. alert('服务异常,请稍后重试!')
  240. }
  241. },
  242. error: function(errMsg){
  243. console.error(errMsg)
  244. alert('服务异常,请稍后重试!')
  245. }
  246. })
  247. }
  248. }
  249. function toggleDisabled (){
  250. if($('#err_msg').hasClass('error') || $('#err_msg').hasClass('success')){
  251. $('#err_msg')[0].className = 'err-msg'
  252. // $('#code_sales').hide()
  253. // $('#real_price').html(coursePrice)
  254. // $('#price_info').html(coursePrice)
  255. }
  256. $('#submit_code')[0].disabled = $(this).val().length == 4 ? false : true
  257. }
  258. $(function(){
  259. $('#paying').on('click', orderPay.show)
  260. $('#dialog').on('click', '.close-button', orderPay.hide)
  261. $('#input_code').on('input', toggleDisabled)
  262. $('#inviter').on('submit', orderPay.checkCode)
  263. })
  264. </script>
  265. </body>
  266. </html>