parentPay.vue 16 KB

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