parentPay.vue 18 KB

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