pay.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. <template>
  2. <view class="container">
  3. <button class="order" @click="toOrder()" v-show="showOrder">
  4. 订单查询
  5. </button>
  6. <view
  7. class="mark"
  8. v-show="showSearch || showLeaveMess"
  9. @click="markClose()"
  10. ></view>
  11. <view class="messageBg1"></view>
  12. <view class="messageBg2"></view>
  13. <view class="messageCard">
  14. <view class="item-form">
  15. <view class="item">
  16. <text class="ite">收费单位 </text>
  17. <text class="content">南昌交通学院</text>
  18. </view>
  19. <view class="item">
  20. <text class="ite">姓名 </text>
  21. <text class="content">{{ studentName }}</text>
  22. </view>
  23. <view class="item">
  24. <text class="ite">学号 </text>
  25. <text class="content">{{ studentNo }}</text>
  26. </view>
  27. <view class="item">
  28. <text class="ite">专业 </text>
  29. <text class="content">{{ majorName }}</text>
  30. </view>
  31. <view class="item">
  32. <text class="ite">班级 </text>
  33. <text class="content">{{ className }}</text>
  34. </view>
  35. <view class="item">
  36. <text class="ite">缴费学年 </text>
  37. <text class="content">{{ years }}</text>
  38. </view>
  39. <!-- <template v-if="(itemArr.length = 0)"> -->
  40. <view class="item-pay" v-for="item in Arr">
  41. <text class="ite">{{ item.id }} </text>
  42. <text class="content">¥{{ item.money }}</text>
  43. </view>
  44. <!-- </template> -->
  45. <view class="item">
  46. <text class="ite">总金额 </text>
  47. <text class="content">¥{{ realPayAmount }}</text>
  48. </view>
  49. </view>
  50. <button @click="getPay()" hover-class="button-hover" v-if="payStatu1">
  51. 支付
  52. </button>
  53. <text class="okPay" v-if="payStatu2">已支付</text>
  54. <view class="bottom-a">
  55. <navigator
  56. url="#"
  57. open-type="navigate"
  58. hover-class="navigator-hover"
  59. @click="toSearch"
  60. >
  61. 帮人代缴
  62. </navigator>
  63. <navigator
  64. url="#"
  65. open-type="navigate"
  66. hover-class="navigator-hover"
  67. @click="toLeaveMess"
  68. >
  69. 信息有误?点击反馈
  70. </navigator>
  71. </view>
  72. </view>
  73. <view class="pop-up" v-show="showSearch">
  74. <view class="top">
  75. <text>代缴人信息</text>
  76. <view class="close" @click="close1">
  77. <view class="image"></view>
  78. </view>
  79. </view>
  80. <view class="name">
  81. <text>姓 名</text>
  82. <input
  83. v-model="SeaStudentName"
  84. type="text"
  85. placeholder="请输入姓名"
  86. placeholder-style="color:rgba(0, 0, 0, 0.29);"
  87. />
  88. </view>
  89. <view class="studentNo">
  90. <text>学 号</text>
  91. <input
  92. v-model="SeaStudentNo"
  93. type="text"
  94. placeholder="请输入学号"
  95. placeholder-style="color:rgba(0, 0, 0, 0.29);"
  96. />
  97. </view>
  98. <view class="remark">
  99. 备注:新生输入身份证号码代替学号,老生输入学号
  100. </view>
  101. <view class="confirm">
  102. <button hover-class="button-hover" @click="close1">取消</button>
  103. <button hover-class="button-hover" @click="searchDetailMess">
  104. 确认
  105. </button>
  106. </view>
  107. </view>
  108. <view class="leaveMess" v-show="showLeaveMess">
  109. <view class="top">
  110. <text>信息反馈</text>
  111. <view class="close" @click="close2">
  112. <view class="image"></view>
  113. </view>
  114. </view>
  115. <view class="name">
  116. <text>姓&#12288;名 :</text>
  117. <input
  118. type="text"
  119. placeholder="请输入姓名"
  120. v-model="feedbackPersonName"
  121. placeholder-style="color: #B3B3B3;"
  122. />
  123. </view>
  124. <view class="tel">
  125. <text>联系人 :</text>
  126. <input
  127. type="text"
  128. placeholder="请输入联系人手机号码"
  129. v-model="feedbackPersonPhone"
  130. placeholder-style="color: #B3B3B3;"
  131. />
  132. </view>
  133. <text class="title">反馈信息 :</text>
  134. <textarea
  135. placeholder=""
  136. placeholder-class="textarea-placeholder"
  137. maxlength="512"
  138. v-model="feedbackInfo"
  139. />
  140. <button hover-class="button-hover" @click="putMess">提交</button>
  141. </view>
  142. </view>
  143. </template>
  144. <script>
  145. export default {
  146. data() {
  147. return {
  148. showLeaveMess: false,
  149. showSearch: false,
  150. showOrder: false,
  151. studentName: "",
  152. studentNo: "",
  153. SeaStudentNo: "",
  154. SeaStudentName: "",
  155. majorName: "",
  156. className: "",
  157. years: "",
  158. realPayAmount: "",
  159. Arr: [],
  160. payStatu1: true,
  161. payStatu2: false,
  162. homeUrl: "https://jtishfw.ncjti.edu.cn/jiaofei/backendApi",
  163. notifyUrl:
  164. "https://jtishfw.ncjti.edu.cn/jiaofei/backendApi/pay/jxnxs/notify/",
  165. openId: "",
  166. orderNo: "", //订单号
  167. cardNumber: "",
  168. //反馈者
  169. feedbackPersonName: "",
  170. feedbackPersonPhone: "",
  171. feedbackInfo: "",
  172. scrollTop: 0,
  173. //微信支付参数
  174. appId: "",
  175. timeStamp: "",
  176. nonceStr: "",
  177. package: "",
  178. signType: "",
  179. paySign: "",
  180. };
  181. },
  182. onLoad(options) {
  183. this.loginFilter(); //获取用户cardNumber
  184. },
  185. methods: {
  186. toSearch() {
  187. this.showSearch = true;
  188. },
  189. close1() {
  190. this.showSearch = false;
  191. },
  192. close2() {
  193. this.showLeaveMess = false;
  194. },
  195. toLeaveMess() {
  196. this.showLeaveMess = true;
  197. },
  198. markClose() {
  199. this.showLeaveMess = false;
  200. this.showSearch = false;
  201. },
  202. //获取cardNumber
  203. loginFilter() {
  204. let cardNumber = sessionStorage.getItem("cardNumber");
  205. if (!cardNumber) {
  206. let cardNumber = this.getQueryString("cardNumber");
  207. let error = this.getQueryString("error");
  208. let errorMsg = this.getQueryString("errorMsg");
  209. let homeWeb = `https://open.wecard.qq.com/connect/oauth/authorize?app_key=2DDC9DBF32F28845&response_type=code&scope=snsapi_userinfo&ocode=1015730314&redirect_uri=${this.homeUrl}/wechat/weixiao/auth/&connect=curLogin&state=${this.homeUrl}/wechat/weixiao/auth/`;
  210. if (error) {
  211. uni.showToast({
  212. title: errorMsg,
  213. icon: "error",
  214. mask: true,
  215. duration: 1000,
  216. });
  217. } else if (!cardNumber) {
  218. window.location.href = homeWeb;
  219. } else {
  220. sessionStorage.setItem("cardNumber", cardNumber);
  221. this.getDetailMess();
  222. }
  223. } else {
  224. this.getDetailMess();
  225. }
  226. },
  227. //换取详情信息
  228. getDetailMess() {
  229. let that = this;
  230. let cardNumber = sessionStorage.getItem("cardNumber");
  231. let url = that.homeUrl + "/tuitionpayment/payableinfo/payableInfo";
  232. uni.showToast({
  233. title: "信息获取中",
  234. icon: "loading",
  235. mask: true,
  236. duration: 1500,
  237. });
  238. uni.request({
  239. url: url,
  240. data: {},
  241. header: {
  242. card_number: cardNumber,
  243. Accept: "application/json",
  244. "Content-Type": " application/x-www-form-urlencoded;charset=utf-8",
  245. "X-Requested-With": "XMLHttpRequest",
  246. },
  247. method: "GET",
  248. sslVerify: true,
  249. success: ({ data, statusCode, header }) => {
  250. if (data.data === null) {
  251. uni.redirectTo({ url: "/pages/parentPay/parentPay" });
  252. } else {
  253. let res = data.data;
  254. that.studentName = res.studentName;
  255. that.studentNo = res.studentNo;
  256. that.majorName = res.majorName;
  257. that.className = res.className;
  258. that.years = res.years;
  259. that.realPayAmount = res.realPayAmount;
  260. that.getPayDetail(res.payItemDetail);
  261. if (res.pay) {
  262. that.payStatu1 = false;
  263. that.payStatu2 = true;
  264. that.showOrder = true;
  265. } else {
  266. that.payStatu1 = true;
  267. that.payStatu2 = false;
  268. }
  269. that.getOpenId();
  270. }
  271. },
  272. fail: (error) => {},
  273. });
  274. },
  275. //获取学费明细
  276. getPayDetail(len) {
  277. //获取明细款项名称数组
  278. var arr = len.match(/[^\\u4e00-\\u9fa5]+/g);
  279. //过滤
  280. var itemIdArr = arr.filter(function (value) {
  281. return value !== ".";
  282. });
  283. //获取明细金额数组
  284. var itemMoneyArr = len.match(/([0-9]+\.[0-9]+)+/g);
  285. //拼接成对象数组
  286. var item = [];
  287. for (var i in (itemIdArr, itemMoneyArr)) {
  288. var c = {
  289. id: itemIdArr[i],
  290. money: itemMoneyArr[i],
  291. };
  292. item.push(c);
  293. }
  294. this.Arr = item;
  295. },
  296. //获取openid
  297. getOpenId() {
  298. let openId = localStorage.getItem("openId");
  299. if (!openId) {
  300. let openId = this.getQueryString("openId");
  301. let error = this.getQueryString("error");
  302. let errorMsg = this.getQueryString("errorMsg");
  303. let homeWeb = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd87cbe1db0437303&redirect_uri=${this.homeUrl}/wechat/pub/auth&response_type=code&scope=snsapi_base&state=pages/Pay/pay#wechat_redire`;
  304. if (error) {
  305. uni.showToast({
  306. title: errorMsg,
  307. icon: "error",
  308. mask: true,
  309. duration: 1000,
  310. });
  311. } else if (!openId) {
  312. window.location.href = homeWeb;
  313. } else {
  314. localStorage.setItem("openId", openId);
  315. }
  316. }
  317. },
  318. //支付
  319. getPay() {
  320. uni.showToast({
  321. title: "支付中,请稍等",
  322. icon: "loading",
  323. mask: true,
  324. duration: 1500,
  325. });
  326. this.getOrderNo(); //获取订单号
  327. },
  328. //获取订单号
  329. getOrderNo() {
  330. let that = this;
  331. let cardNumber = sessionStorage.getItem("cardNumber");
  332. let url =
  333. that.homeUrl + `/tuitionpayment/payorder/${that.studentNo}/create`;
  334. uni.request({
  335. url: url,
  336. data: {},
  337. header: {
  338. card_number: cardNumber,
  339. Accept: "application/json",
  340. "Content-Type": "application/json",
  341. "X-Requested-With": "XMLHttpRequest",
  342. },
  343. method: "POST",
  344. sslVerify: true,
  345. success: ({ data, statusCode, header }) => {
  346. let res = data.data;
  347. that.orderNo = res.orderNo;
  348. if (!data.success) {
  349. uni.showToast({
  350. title: data.message,
  351. icon: "error",
  352. mask: true,
  353. duration: 2000,
  354. });
  355. } else {
  356. that.getPayMethod();
  357. }
  358. },
  359. fail: (error) => {},
  360. });
  361. },
  362. //获取支付方式
  363. getPayMethod() {
  364. let url = this.homeUrl + "/payMethodSetting/currentPay";
  365. uni.request({
  366. url: url,
  367. data: {},
  368. header: {
  369. Accept: "application/json",
  370. "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
  371. "X-Requested-With": "XMLHttpRequest",
  372. },
  373. method: "GET",
  374. sslVerify: true,
  375. success: ({ data, statusCode, header }) => {
  376. let res = data.data;
  377. if (data.success) {
  378. if (res.currentPayMethod === "1") {
  379. this.getwxParam();
  380. } else {
  381. this.nsPay();
  382. }
  383. } else {
  384. uni.showToast({
  385. title: data.message,
  386. icon: "error",
  387. mask: true,
  388. duration: 1000,
  389. });
  390. }
  391. },
  392. fail: (error) => {},
  393. });
  394. },
  395. //获取微信支付参数
  396. getwxParam() {
  397. let that = this;
  398. let cardNumber = sessionStorage.getItem("cardNumber");
  399. let openId = localStorage.getItem("openId");
  400. let url = that.homeUrl + "/pay/ccb/getJsApiParam";
  401. uni.request({
  402. url: url,
  403. data: {
  404. orderNo: that.orderNo,
  405. openId: openId,
  406. },
  407. header: {
  408. card_number: cardNumber,
  409. Accept: "application/json",
  410. "Content-Type": "application/json",
  411. "X-Requested-With": "XMLHttpRequest",
  412. },
  413. method: "GET",
  414. sslVerify: true,
  415. success: ({ data, statusCode, header }) => {
  416. if (!data.success) {
  417. uni.showToast({
  418. title: data.message,
  419. icon: "error",
  420. mask: true,
  421. duration: 2000,
  422. });
  423. } else {
  424. let res = data.data;
  425. that.appId = res.appId;
  426. that.timeStamp = res.timeStamp;
  427. that.nonceStr = res.nonceStr;
  428. that.package = res.package;
  429. that.signType = res.signType;
  430. that.paySign = res.paySign;
  431. that.wxPay();
  432. }
  433. },
  434. fail: (error) => {},
  435. });
  436. },
  437. //吊起微信支付
  438. wxPay() {
  439. let that = this;
  440. function onBridgeReady() {
  441. WeixinJSBridge.invoke(
  442. "getBrandWCPayRequest",
  443. {
  444. appId: that.appId, //公众号ID,由商户传入
  445. timeStamp: that.timeStamp, //时间戳,自1970年以来的秒数
  446. nonceStr: that.nonceStr, //随机串
  447. package: that.package,
  448. signType: that.signType, //微信签名方式:
  449. paySign: that.paySign, //微信签名
  450. },
  451. function (res) {
  452. if (res.err_msg == "get_brand_wcpay_request:ok") {
  453. // 使用以上方式判断前端返回,微信团队郑重提示:
  454. //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  455. }
  456. }
  457. );
  458. }
  459. if (typeof WeixinJSBridge == "undefined") {
  460. if (document.addEventListener) {
  461. document.addEventListener(
  462. "WeixinJSBridgeReady",
  463. onBridgeReady,
  464. false
  465. );
  466. } else if (document.attachEvent) {
  467. document.attachEvent("WeixinJSBridgeReady", onBridgeReady);
  468. document.attachEvent("onWeixinJSBridgeReady", onBridgeReady);
  469. }
  470. } else {
  471. onBridgeReady();
  472. }
  473. },
  474. //拉起农商行支付
  475. nsPay() {
  476. let O = "5494ec3310685daa218382619dd20e27";
  477. let out_no = this.orderNo;
  478. let amount = this.realPayAmount;
  479. let appoint_notify = this.notifyUrl;
  480. let mainUrl = `https://q.jxnxs.com/newpay?O=${O}&out_no=${out_no}&amount=${amount}&appoint_notify=${appoint_notify}`;
  481. window.location.href = mainUrl;
  482. },
  483. //获取当前URL指定参数
  484. getQueryString(name) {
  485. let url = window.location.href; // 获取URL
  486. let pattern = new RegExp("[\?\&]" + name + "=([^\&]+)", "i"); // 正则匹配URL
  487. let matcher = pattern.exec(url);
  488. if (matcher == null || matcher.length < 1) {
  489. return false;
  490. }
  491. return decodeURIComponent(matcher[1]); // 输出指定的参数值 中文也可以
  492. },
  493. //代缴费
  494. searchDetailMess() {
  495. if (!this.SeaStudentNo || !this.SeaStudentName) {
  496. uni.showToast({
  497. title: "学号或姓名不能为空",
  498. icon: "error",
  499. mask: true,
  500. duration: 1000,
  501. });
  502. } else {
  503. let that = this;
  504. let cardNumber = sessionStorage.getItem("cardNumber");
  505. let url =
  506. that.homeUrl +
  507. `/tuitionpayment/payableinfo/payableInfo/${that.SeaStudentNo}/${that.SeaStudentName}`;
  508. uni.request({
  509. url: url,
  510. header: {
  511. card_number: cardNumber,
  512. Accept: "application/json",
  513. "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
  514. "X-Requested-With": "XMLHttpRequest",
  515. },
  516. method: "GET",
  517. sslVerify: true,
  518. success: ({ data, statusCode, header }) => {
  519. if (!data.success) {
  520. uni.showToast({
  521. title: data.message,
  522. icon: "error",
  523. mask: true,
  524. duration: 1000,
  525. });
  526. } else {
  527. uni.showToast({
  528. title: "信息加载中",
  529. icon: "loading",
  530. mask: true,
  531. duration: 500,
  532. });
  533. that.showSearch = !that.showSearch;
  534. let res = data.data;
  535. that.studentName = res.studentName;
  536. that.studentNo = res.studentNo;
  537. that.years = res.years;
  538. that.majorName = res.majorName;
  539. that.className = res.className;
  540. that.realPayAmount = res.realPayAmount;
  541. that.getPayDetail(res.payItemDetail);
  542. that.SeaStudentNo = "";
  543. that.SeaStudentName = "";
  544. if (res.pay) {
  545. that.payStatu1 = false;
  546. that.payStatu2 = true;
  547. that.showOrder = true;
  548. } else {
  549. that.payStatu1 = true;
  550. that.payStatu2 = false;
  551. }
  552. }
  553. },
  554. fail: (error) => {},
  555. });
  556. }
  557. },
  558. //提交反馈信息
  559. putMess() {
  560. let that = this;
  561. let cardNumber = sessionStorage.getItem("cardNumber");
  562. let url = that.homeUrl + "/tuitionpayment/feedbackmsg/save";
  563. uni.request({
  564. url: url,
  565. data: {
  566. feedbackPersonName: that.feedbackPersonName,
  567. feedbackPersonPhone: that.feedbackPersonPhone,
  568. feedbackInfo: that.feedbackInfo,
  569. },
  570. header: {
  571. card_number: cardNumber,
  572. Accept: "application/json",
  573. "Content-Type": "application/json",
  574. "X-Requested-With": "XMLHttpRequest",
  575. },
  576. method: "POST",
  577. sslVerify: true,
  578. success: ({ data, statusCode, header }) => {
  579. if (data.success) {
  580. uni.showToast({
  581. title: data.message,
  582. icon: "success",
  583. mask: true,
  584. duration: 1000,
  585. });
  586. that.close2();
  587. that.feedbackPersonName = "";
  588. that.feedbackPersonPhone = "";
  589. that.feedbackInfo = "";
  590. } else {
  591. uni.showToast({
  592. title: data.message,
  593. icon: "error",
  594. mask: true,
  595. duration: 1000,
  596. });
  597. }
  598. },
  599. fail: (error) => {},
  600. });
  601. },
  602. //跳转订单页面
  603. toOrder() {
  604. uni.redirectTo({ url: "/pages/order/order" });
  605. },
  606. },
  607. };
  608. </script>
  609. <style lang="scss" scoped>
  610. @import url("./css/pay.min.css");
  611. </style>