pay.vue 16 KB

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