parentPay.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <template>
  2. <view class="container">
  3. <view class="content1" v-if="content1">
  4. <view class="mark" v-show="showSearch"></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. </view>
  12. <view class="pop-up" v-show="showSearch">
  13. <view class="top">
  14. <text>代缴人信息</text>
  15. <image
  16. src="../../static/images/close.png"
  17. mode="scaleToFill"
  18. @click="close1"
  19. />
  20. </view>
  21. <view class="name">
  22. <text>姓 名</text>
  23. <input
  24. v-model="studentName"
  25. type="text"
  26. placeholder="请输入姓名"
  27. placeholder-style="color:rgba(0, 0, 0, 0.29);"
  28. />
  29. </view>
  30. <view class="studentNo">
  31. <text>身份证</text>
  32. <input
  33. v-model="studentNo"
  34. type="text"
  35. placeholder="请输入身份证"
  36. placeholder-style="color:rgba(0, 0, 0, 0.29);"
  37. />
  38. </view>
  39. <view class="remark">
  40. 说明:新生输入身份证号码代替学号,老生输入学号
  41. </view>
  42. <view class="confirm">
  43. <button hover-class="button-hover" @click="close1">取消</button>
  44. <button hover-class="button-hover" @click="searchDetailMess">
  45. 确认
  46. </button>
  47. </view>
  48. </view>
  49. </view>
  50. <view class="content2" v-if="showMess">
  51. <view class="order">订单号:{{ orderNo }}</view>
  52. <view class="mark" v-show="showSearch"></view>
  53. <view class="messageBg1"></view>
  54. <view class="messageBg2"></view>
  55. <view class="messageCard">
  56. <view class="item-form">
  57. <view class="item">
  58. <text class="ite">收费单位 </text>
  59. <text class="content">南昌交通学院</text>
  60. </view>
  61. <view class="item">
  62. <text class="ite">姓名 </text>
  63. <text class="content">{{ studentName }}</text>
  64. </view>
  65. <view class="item">
  66. <text class="ite">证件号 </text>
  67. <text class="content">{{ studentNo }}</text>
  68. </view>
  69. <view class="item">
  70. <text class="ite">专业 </text>
  71. <text class="content">{{ majorName }}</text>
  72. </view>
  73. <view class="item">
  74. <text class="ite">班级 </text>
  75. <text class="content">{{ className }}</text>
  76. </view>
  77. <view class="item">
  78. <text class="ite">缴费学年 </text>
  79. <text class="content">{{ years }}</text>
  80. </view>
  81. <!-- <template v-if="(itemArr.length = 0)"> -->
  82. <view class="item-pay" v-for="item in Arr">
  83. <text class="ite">{{ item.id }} </text>
  84. <text class="content">¥{{ item.money }}</text>
  85. </view>
  86. <!-- </template> -->
  87. <view class="item">
  88. <text class="ite">总金额 </text>
  89. <text class="content">¥{{ realPayAmount }}</text>
  90. </view>
  91. </view>
  92. <button @click="getPay()" hover-class="button-hover" v-if="payStatu1">
  93. 支付
  94. </button>
  95. <text class="okPay" v-if="payStatu2">已支付</text>
  96. </view>
  97. </view>
  98. </view>
  99. </template>
  100. <script>
  101. export default {
  102. data() {
  103. return {
  104. content1: true,
  105. showMess: false,
  106. showSearch: false,
  107. studentName: "",
  108. studentNo: "",
  109. majorName: "",
  110. className: "",
  111. years: "",
  112. realPayAmount: "",
  113. Arr: [],
  114. payStatu1: true,
  115. payStatu2: false,
  116. homeUrl: "https://jtishfw.ncjti.edu.cn/jiaofei/backendApi",
  117. openId: "",
  118. cardNumber: "",
  119. orderNo: "", //订单号
  120. //微信支付参数
  121. appId: "",
  122. timeStamp: "",
  123. nonceStr: "",
  124. package: "",
  125. signType: "",
  126. paySign: "",
  127. };
  128. },
  129. onLoad(options) {
  130. this.getOpenId();
  131. },
  132. methods: {
  133. toSearch() {
  134. this.showSearch = !this.showSearch;
  135. },
  136. close1() {
  137. this.showSearch = !this.showSearch;
  138. },
  139. toShowMess() {
  140. this.showMess = !this.showMess;
  141. this.content1 = false;
  142. },
  143. //获取openId
  144. getOpenId() {
  145. let openId = localStorage.getItem("openId");
  146. if (!openId) {
  147. let openId = this.getQueryString("openId");
  148. let error = this.getQueryString("error");
  149. let homeWeb =
  150. "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/parentPay/parentPay#wechat_redire";
  151. if (!openId) {
  152. window.location.href = homeWeb;
  153. } else if (error) {
  154. uni.showToast({
  155. title: "openId获取失败",
  156. icon: "error",
  157. mask: true,
  158. duration: 1000,
  159. });
  160. } else {
  161. localStorage.setItem("openId", openId);
  162. }
  163. }
  164. },
  165. //代缴费
  166. searchDetailMess() {
  167. let that = this;
  168. let cardNumber = localStorage.getItem("cardNumber");
  169. let url =
  170. that.homeUrl +
  171. `/tuitionpayment/payableinfo/payableInfo/${that.studentNo}/${that.studentName}`;
  172. uni.request({
  173. url: url,
  174. header: {
  175. card_number: cardNumber,
  176. Accept: "application/json",
  177. "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
  178. "X-Requested-With": "XMLHttpRequest",
  179. },
  180. method: "GET",
  181. sslVerify: true,
  182. success: ({ data, statusCode, header }) => {
  183. if (!data.success) {
  184. uni.showToast({
  185. title: data.message,
  186. icon: "error",
  187. mask: true,
  188. duration: 1000,
  189. });
  190. } else {
  191. uni.showToast({
  192. title: "信息查询中",
  193. icon: "loading",
  194. mask: true,
  195. duration: 500,
  196. });
  197. that.showSearch = !that.showSearch;
  198. that.toShowMess();
  199. let res = data.data;
  200. that.studentName = res.studentName;
  201. that.studentNo = res.studentNo;
  202. that.years = res.years;
  203. that.majorName = res.majorName;
  204. that.className = res.className;
  205. that.realPayAmount = res.realPayAmount;
  206. that.getPayDetail(res.payItemDetail);
  207. if (res.pay) {
  208. that.payStatu1 = false;
  209. that.payStatu2 = true;
  210. } else {
  211. that.payStatu1 = true;
  212. that.payStatu2 = false;
  213. }
  214. }
  215. },
  216. fail: (error) => {},
  217. });
  218. },
  219. //获取学费明细
  220. getPayDetail(len) {
  221. //获取明细款项名称数组
  222. var arr = len.match(/[^\\u4e00-\\u9fa5]+/g);
  223. var itemIdArr = arr.filter(function (value) {
  224. return value !== ".";
  225. });
  226. //获取明细金额数组
  227. var itemMoneyArr = len.match(/([0-9]+\.[0-9]+)+/g);
  228. //拼接成对象数组
  229. var item = [];
  230. for (var i in (itemIdArr, itemMoneyArr)) {
  231. var c = {
  232. id: itemIdArr[i],
  233. money: itemMoneyArr[i],
  234. };
  235. item.push(c);
  236. }
  237. this.Arr = item;
  238. },
  239. //支付
  240. getPay() {
  241. uni.showToast({
  242. title: "支付中,请稍等",
  243. icon: "loading",
  244. mask: true,
  245. duration: 1000,
  246. });
  247. this.getOrderNo(); //获取订单号
  248. },
  249. //获取订单号
  250. getOrderNo() {
  251. let that = this;
  252. let cardNumber = localStorage.getItem("cardNumber");
  253. let url =
  254. that.homeUrl + `/tuitionpayment/payorder/${that.studentNo}/create`;
  255. uni.request({
  256. url: url,
  257. data: {},
  258. header: {
  259. card_number: cardNumber,
  260. Accept: "application/json",
  261. "Content-Type": "application/json",
  262. "X-Requested-With": "XMLHttpRequest",
  263. },
  264. method: "POST",
  265. sslVerify: true,
  266. success: ({ data, statusCode, header }) => {
  267. let res = data.data;
  268. that.orderNo = res.orderNo;
  269. if (!data.success) {
  270. uni.showToast({
  271. title: data.message,
  272. icon: "error",
  273. mask: true,
  274. duration: 2000,
  275. });
  276. } else {
  277. that.getwxParam(); //拿微信支付参数
  278. }
  279. },
  280. fail: (error) => {},
  281. });
  282. },
  283. //获取微信支付参数
  284. getwxParam() {
  285. let that = this;
  286. let cardNumber = localStorage.getItem("cardNumber");
  287. let openId = localStorage.getItem("openId");
  288. let url = that.homeUrl + "/pay/ccb/getJsApiParam";
  289. uni.request({
  290. url: url,
  291. data: {
  292. orderNo: that.orderNo,
  293. openId: openId,
  294. },
  295. header: {
  296. card_number: cardNumber,
  297. Accept: "application/json",
  298. "Content-Type": "application/json",
  299. "X-Requested-With": "XMLHttpRequest",
  300. },
  301. method: "GET",
  302. sslVerify: true,
  303. success: ({ data, statusCode, header }) => {
  304. if (!data.success) {
  305. uni.showToast({
  306. title: data.message,
  307. icon: "error",
  308. mask: true,
  309. duration: 2000,
  310. });
  311. } else {
  312. let res = data.data;
  313. that.appId = res.appId;
  314. that.timeStamp = res.timeStamp;
  315. that.nonceStr = res.nonceStr;
  316. that.package = res.package;
  317. that.signType = res.signType;
  318. that.paySign = res.paySign;
  319. that.wxPay();
  320. }
  321. },
  322. fail: (error) => {},
  323. });
  324. },
  325. //吊起微信支付
  326. wxPay() {
  327. let that = this;
  328. function onBridgeReady() {
  329. WeixinJSBridge.invoke(
  330. "getBrandWCPayRequest",
  331. {
  332. appId: that.appId, //公众号ID,由商户传入
  333. timeStamp: that.timeStamp, //时间戳,自1970年以来的秒数
  334. nonceStr: that.nonceStr, //随机串
  335. package: that.package,
  336. signType: that.signType, //微信签名方式:
  337. paySign: that.paySign, //微信签名
  338. },
  339. function (res) {
  340. if (res.err_msg == "get_brand_wcpay_request:ok") {
  341. // 使用以上方式判断前端返回,微信团队郑重提示:
  342. //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  343. }
  344. }
  345. );
  346. }
  347. if (typeof WeixinJSBridge == "undefined") {
  348. if (document.addEventListener) {
  349. document.addEventListener(
  350. "WeixinJSBridgeReady",
  351. onBridgeReady,
  352. false
  353. );
  354. } else if (document.attachEvent) {
  355. document.attachEvent("WeixinJSBridgeReady", onBridgeReady);
  356. document.attachEvent("onWeixinJSBridgeReady", onBridgeReady);
  357. }
  358. } else {
  359. onBridgeReady();
  360. }
  361. },
  362. //获取当前URL指定参数
  363. getQueryString(name) {
  364. let url = window.location.href; // 获取URL
  365. let pattern = new RegExp("[\?\&]" + name + "=([^\&]+)", "i"); // 正则匹配URL
  366. let matcher = pattern.exec(url);
  367. if (matcher == null || matcher.length < 1) {
  368. return false;
  369. }
  370. return decodeURIComponent(matcher[1]); // 输出指定的参数值 中文也可以
  371. },
  372. },
  373. };
  374. </script>
  375. <style lang="scss" scoped>
  376. @import url("./css/parentPay.min.css");
  377. </style>