index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. <template>
  2. <view class="page" v-if="payPriceShow">
  3. <view class="pay-price">
  4. <view class="price">
  5. <text class="unit">{{$t(`¥`)}}</text>
  6. <numberScroll :num='payPriceShow' color="#E93323" width='30' height='50' fontSize='50'></numberScroll>
  7. </view>
  8. <view class="count-down">
  9. {{$t(`支付剩余时间`)}}:
  10. <countDown :is-day="false" :tip-text="' '" :day-text="' '" :hour-text="' : '" :minute-text="' : '"
  11. :second-text="' '" :datatime="invalidTime"></countDown>
  12. </view>
  13. </view>
  14. <view class="payment">
  15. <view class="title">
  16. {{$t(`支付方式`)}}
  17. </view>
  18. <view class="item acea-row row-between-wrapper" v-for="(item,index) in cartArr" :key="index"
  19. v-show='item.payStatus' @click="payType(item.number || 0, item.value, index)">
  20. <view class="left acea-row row-between-wrapper">
  21. <view class="iconfont" :class="item.icon"></view>
  22. <view class="text">
  23. <view class="name">{{item.name}}</view>
  24. <view class="info" v-if="item.value == 'yue'">
  25. {{item.title}} <span class="money">{{$t(`¥`)}}{{ item.number }}</span>
  26. </view>
  27. <view class="info" v-else>{{item.title}}</view>
  28. </view>
  29. </view>
  30. <view class="iconfont" :class="active==index?'icon-xuanzhong11 font-num':'icon-weixuan'"></view>
  31. </view>
  32. </view>
  33. <view class="btn">
  34. <view class="button acea-row row-center-wrapper" @click='goPay(number, paytype)'>{{$t(`确认支付`)}}</view>
  35. <view class="wait-pay" @click="waitPay">暂不支付</view>
  36. </view>
  37. <view v-show="false" v-html="formContent"></view>
  38. </view>
  39. </view>
  40. </template>
  41. <script>
  42. import countDown from '@/components/countDown';
  43. import numberScroll from '@/components/numberScroll.vue'
  44. import {
  45. getCashierOrder,
  46. orderPay
  47. } from '@/api/order.js';
  48. export default {
  49. components: {
  50. countDown,
  51. numberScroll
  52. },
  53. data() {
  54. return {
  55. checked: false,
  56. datatime: 1676344056,
  57. //支付方式
  58. cartArr: [{
  59. "name": this.$t(`微信支付`),
  60. "icon": "icon-weixin2",
  61. value: 'weixin',
  62. title: this.$t(`使用微信快捷支付`),
  63. payStatus: 1,
  64. },
  65. {
  66. "name": this.$t(`支付宝支付`),
  67. "icon": "icon-zhifubao",
  68. value: 'alipay',
  69. title: this.$t(`使用支付宝支付`),
  70. payStatus: 1,
  71. },
  72. {
  73. "name": this.$t(`余额支付`),
  74. "icon": "icon-yuezhifu",
  75. value: 'yue',
  76. title: this.$t(`可用余额`),
  77. payStatus: 1,
  78. },
  79. {
  80. "name": this.$t(`线下支付`),
  81. "icon": "icon-yuezhifu1",
  82. value: 'offline',
  83. title: this.$t(`使用线下付款`),
  84. payStatus: 2,
  85. }, {
  86. "name": this.$t(`好友代付`),
  87. "icon": "icon-haoyoudaizhifu",
  88. value: 'friend',
  89. title: this.$t(`找微信好友支付`),
  90. payStatus: 1,
  91. }
  92. ],
  93. orderId: 0,
  94. fromType: '',
  95. active: 0,
  96. payPrice: 0,
  97. payPriceShow: 0,
  98. payPostage: 0,
  99. offlinePostage: false,
  100. invalidTime: 0,
  101. initIn: false,
  102. jumpData: {
  103. orderId: '',
  104. msg: ''
  105. },
  106. formContent: ''
  107. }
  108. },
  109. watch: {
  110. cartArr: {
  111. handler(newV, oldValue) {
  112. let newPayList = [];
  113. newV.forEach((item, index) => {
  114. if (item.payStatus) {
  115. item.index = index;
  116. newPayList.push(item)
  117. }
  118. });
  119. this.active = newPayList[0].index;
  120. this.paytype = newPayList[0].value;
  121. this.number = newPayList[0].number || 0;
  122. },
  123. immediate: true,
  124. deep: true
  125. }
  126. },
  127. onLoad(options) {
  128. if (options.order_id) this.orderId = options.order_id
  129. if (options.from_type) this.fromType = options.from_type
  130. this.getCashierOrder()
  131. },
  132. onShow() {
  133. let options = wx.getEnterOptionsSync();
  134. console.log(options)
  135. if (options.scene == '1038' && options.referrerInfo.appId == 'wxef277996acc166c3' && this.initIn) {
  136. // 代表从收银台小程序返回
  137. let extraData = options.referrerInfo.extraData;
  138. this.initIn = false
  139. if (!extraData) {
  140. // "当前通过物理按键返回,未接收到返参,建议自行查询交易结果";
  141. this.$util.Tips({
  142. title: this.$t(`取消支付`)
  143. }, {
  144. tab: 5,
  145. url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.$t(`取消支付`)}&type=3&totalPrice=${this.payPriceShow}&status=2`
  146. });
  147. } else {
  148. if (extraData.code == 'success') {
  149. this.$util.Tips({
  150. title: this.$t(`支付成功`),
  151. icon: 'success'
  152. }, {
  153. tab: 5,
  154. url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.jumpData.msg}&type=3&totalPrice=${this.payPriceShow}`
  155. });
  156. } else if (extraData.code == 'cancel') {
  157. // "支付已取消";
  158. this.$util.Tips({
  159. title: this.$t(`取消支付`)
  160. }, {
  161. tab: 5,
  162. url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.$t(`取消支付`)}&type=3&totalPrice=${this.payPriceShow}&status=2`
  163. });
  164. } else {
  165. // "支付失败:" + extraData.errmsg;
  166. uni.reLaunch({
  167. url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.$t(`支付失败`)}&totalPrice=${this.payPriceShow}`
  168. })
  169. }
  170. }
  171. }
  172. },
  173. methods: {
  174. getCashierOrder() {
  175. uni.showLoading({
  176. title: this.$t(`创建订单中`)
  177. });
  178. getCashierOrder(this.orderId, this.fromType).then(res => {
  179. console.log(res)
  180. this.payPrice = this.payPriceShow = res.data.pay_price
  181. this.payPostage = res.data.pay_postage
  182. this.offlinePostage = res.data.offline_postage
  183. this.invalidTime = res.data.invalid_time
  184. //微信支付是否开启
  185. this.cartArr[0].payStatus = res.data.wechat_pay_status || 0
  186. //支付宝是否开启
  187. this.cartArr[1].payStatus = res.data.ali_pay_status || 0;
  188. //#ifdef MP
  189. this.cartArr[1].payStatus = false;
  190. //#endif
  191. //余额支付是否开启
  192. // that.cartArr[2].title = '可用余额:' + res.data.userInfo.now_money;
  193. this.cartArr[2].number = res.data.now_money;
  194. this.cartArr[2].payStatus = res.data.yue_pay_status
  195. if (res.data.offline_pay_status) {
  196. this.cartArr[3].payStatus = 1
  197. } else {
  198. this.cartArr[3].payStatus = 0
  199. }
  200. //好友代付是否开启
  201. this.cartArr[4].payStatus = res.data.friend_pay_status || 0;
  202. uni.hideLoading();
  203. }).catch(err => {
  204. uni.hideLoading();
  205. return this.$util.Tips({
  206. title: err
  207. })
  208. })
  209. },
  210. payType(number, paytype, index) {
  211. this.active = index;
  212. this.paytype = paytype;
  213. this.number = number;
  214. if (this.offlinePostage) {
  215. if (paytype == 'offline') {
  216. this.payPriceShow = this.$util.$h.Sub(this.payPrice, this.payPostage);
  217. } else {
  218. this.payPriceShow = this.payPrice;
  219. }
  220. }
  221. },
  222. formpost(url, postData) {
  223. let tempform = document.createElement("form");
  224. tempform.action = url;
  225. tempform.method = "post";
  226. tempform.target = "_self";
  227. tempform.style.display = "none";
  228. for (let x in postData) {
  229. let opt = document.createElement("input");
  230. opt.name = x;
  231. opt.value = postData[x];
  232. tempform.appendChild(opt);
  233. }
  234. document.body.appendChild(tempform);
  235. this.$nextTick(e => {
  236. tempform.submit();
  237. })
  238. },
  239. waitPay() {
  240. uni.reLaunch({
  241. url: '/pages/goods/order_pay_status/index?order_id=' + this.orderId + '&msg=取消支付&type=3' +
  242. '&status=2&totalPrice=' + this.payPriceShow
  243. })
  244. },
  245. goPay(number, paytype) {
  246. let that = this;
  247. if (!that.orderId) return that.$util.Tips({
  248. title: that.$t(`请选择要支付的订单`)
  249. });
  250. if (paytype == 'yue' && parseFloat(number) < parseFloat(that.payPriceShow)) return that.$util.Tips({
  251. title: that.$t(`余额不足`)
  252. });
  253. uni.showLoading({
  254. title: that.$t(`支付中`)
  255. });
  256. if (paytype == 'friend' && that.orderId) {
  257. return uni.navigateTo({
  258. url: '/pages/users/payment_on_behalf/index?order_id=' + that.orderId + '&spread=' +
  259. this.$store.state.app.uid,
  260. success: res => {},
  261. fail: () => {},
  262. complete: () => {}
  263. });
  264. }
  265. orderPay({
  266. uni: that.orderId,
  267. paytype: paytype,
  268. type: that.friendPay ? 1 : 0,
  269. // #ifdef H5
  270. quitUrl: location.port ? location.protocol + '//' + location.hostname + ':' + location
  271. .port +
  272. '/pages/goods/order_details/index?order_id=' + this.orderId : location.protocol +
  273. '//' + location.hostname +
  274. '/pages/goods/order_details/index?order_id=' + this.orderId
  275. // #endif
  276. // #ifdef APP-PLUS
  277. quitUrl: '/pages/goods/order_details/index?order_id=' + this.orderId
  278. // #endif
  279. }).then(res => {
  280. let status = res.data.status,
  281. orderId = res.data.result.orderId,
  282. jsConfig = res.data.result.jsConfig,
  283. goPages = '/pages/goods/order_pay_status/index?order_id=' + this.orderId + '&msg=' +
  284. res
  285. .msg +
  286. '&type=3' + '&totalPrice=' + this.payPriceShow,
  287. friendPay = '/pages/users/payment_on_behalf/index?order_id=' + this.orderId +
  288. '&spread=' +
  289. this
  290. .$store.state.app.uid
  291. switch (status) {
  292. case 'ORDER_EXIST':
  293. case 'EXTEND_ORDER':
  294. uni.hideLoading();
  295. return that.$util.Tips({
  296. title: res.msg
  297. }, {
  298. tab: 5,
  299. url: goPages
  300. });
  301. case 'ALLINPAY_PAY':
  302. uni.hideLoading();
  303. // #ifdef MP
  304. this.initIn = true
  305. wx.openEmbeddedMiniProgram({
  306. appId: 'wxef277996acc166c3',
  307. extraData: {
  308. cusid: jsConfig.cusid,
  309. appid: jsConfig.appid,
  310. version: jsConfig.version,
  311. trxamt: jsConfig.trxamt,
  312. reqsn: jsConfig.reqsn,
  313. notify_url: jsConfig.notify_url,
  314. body: jsConfig.body,
  315. remark: jsConfig.remark,
  316. validtime: jsConfig.validtime,
  317. randomstr: jsConfig.randomstr,
  318. paytype: jsConfig.paytype,
  319. sign: jsConfig.sign,
  320. signtype: jsConfig.signtype
  321. }
  322. })
  323. this.jumpData = {
  324. orderId: res.data.result.orderId,
  325. msg: res.msg,
  326. }
  327. // #endif
  328. // #ifdef APP-PLUS
  329. plus.runtime.openURL(jsConfig.payinfo);
  330. setTimeout(e => {
  331. uni.reLaunch({
  332. url: goPages
  333. })
  334. }, 1000)
  335. // #endif
  336. // #ifdef H5
  337. this.formpost(res.data.result.pay_url, jsConfig)
  338. // #endif
  339. break;
  340. case 'PAY_ERROR':
  341. uni.hideLoading();
  342. return that.$util.Tips({
  343. title: res.msg
  344. }, {
  345. tab: 5,
  346. url: goPages
  347. });
  348. break;
  349. case 'SUCCESS':
  350. uni.hideLoading();
  351. if (paytype !== 'friend') {
  352. return that.$util.Tips({
  353. title: res.msg,
  354. icon: 'success'
  355. }, {
  356. tab: 4,
  357. url: goPages
  358. });
  359. } else {
  360. return that.$util.Tips({
  361. title: res.msg,
  362. icon: 'success'
  363. }, {
  364. tab: 4,
  365. url: friendPay
  366. });
  367. }
  368. break;
  369. case 'WECHAT_PAY':
  370. that.toPay = true;
  371. // #ifdef MP
  372. /* that.toPay = true; */
  373. let mp_pay_name = ''
  374. if (uni.requestOrderPayment) {
  375. mp_pay_name = 'requestOrderPayment'
  376. } else {
  377. mp_pay_name = 'requestPayment'
  378. }
  379. uni[mp_pay_name]({
  380. timeStamp: jsConfig.timestamp,
  381. nonceStr: jsConfig.nonceStr,
  382. package: jsConfig.package,
  383. signType: jsConfig.signType,
  384. paySign: jsConfig.paySign,
  385. success: function(res) {
  386. uni.hideLoading();
  387. if (that.BargainId || that.combinationId || that.pinkId ||
  388. that
  389. .seckillId || that.discountId)
  390. return that.$util.Tips({
  391. title: that.$t(`支付成功`),
  392. icon: 'success'
  393. }, {
  394. tab: 4,
  395. url: goPages
  396. });
  397. return that.$util.Tips({
  398. title: that.$t(`支付成功`),
  399. icon: 'success'
  400. }, {
  401. tab: 5,
  402. url: goPages
  403. });
  404. },
  405. fail: function(e) {
  406. uni.hideLoading();
  407. return that.$util.Tips({
  408. title: that.$t(`取消支付`)
  409. }, {
  410. tab: 5,
  411. url: goPages + '&status=2'
  412. });
  413. },
  414. complete: function(e) {
  415. uni.hideLoading();
  416. //关闭当前页面跳转至订单状态
  417. if (res.errMsg == 'requestPayment:cancel' || e.errMsg ==
  418. 'requestOrderPayment:cancel') return that.$util
  419. .Tips({
  420. title: that.$t(`取消支付`)
  421. }, {
  422. tab: 5,
  423. url: goPages + '&status=2'
  424. });
  425. },
  426. })
  427. // #endif
  428. // #ifdef H5
  429. this.$wechat.pay(res.data.result.jsConfig).then(res => {
  430. return that.$util.Tips({
  431. title: that.$t(`支付成功`),
  432. icon: 'success'
  433. }, {
  434. tab: 5,
  435. url: goPages
  436. });
  437. }).catch(res => {
  438. if (!this.$wechat.isWeixin()) {
  439. uni.redirectTo({
  440. url: goPages + '&msg=' + that.$t(`支付失败`) +
  441. '&status=2'
  442. // '&msg=支付失败&status=2'
  443. })
  444. }
  445. if (res.errMsg == 'chooseWXPay:cancel') return that.$util.Tips({
  446. title: that.$t(`取消支付`)
  447. }, {
  448. tab: 5,
  449. url: goPages + '&status=2'
  450. });
  451. })
  452. // #endif
  453. // #ifdef APP-PLUS
  454. uni.requestPayment({
  455. provider: 'wxpay',
  456. orderInfo: jsConfig,
  457. success: (e) => {
  458. let url = goPages;
  459. uni.showToast({
  460. title: that.$t(`支付成功`)
  461. })
  462. setTimeout(res => {
  463. uni.redirectTo({
  464. url: url
  465. })
  466. }, 2000)
  467. },
  468. fail: (e) => {
  469. let url = '/pages/goods/order_pay_status/index?order_id=' +
  470. orderId +
  471. '&msg=' + that.$t(`支付失败`);
  472. uni.showModal({
  473. content: that.$t(`支付失败`),
  474. showCancel: false,
  475. success: function(res) {
  476. if (res.confirm) {
  477. uni.redirectTo({
  478. url: url
  479. })
  480. } else if (res.cancel) {}
  481. }
  482. })
  483. },
  484. complete: () => {
  485. uni.hideLoading();
  486. },
  487. });
  488. // #endif
  489. break;
  490. case 'PAY_DEFICIENCY':
  491. uni.hideLoading();
  492. //余额不足
  493. return that.$util.Tips({
  494. title: res.msg
  495. }, {
  496. tab: 5,
  497. url: goPages + '&status=1'
  498. });
  499. break;
  500. case "WECHAT_H5_PAY":
  501. uni.hideLoading();
  502. that.$util.Tips({
  503. title: that.$t(`等待支付中`)
  504. }, {
  505. tab: 4,
  506. url: goPages + '&status=0'
  507. });
  508. setTimeout(() => {
  509. location.href = res.data.result.jsConfig.h5_url;
  510. }, 1500);
  511. break;
  512. case 'ALIPAY_PAY':
  513. //#ifdef H5
  514. uni.hideLoading();
  515. that.$util.Tips({
  516. title: that.$t(`等待支付中`)
  517. }, {
  518. tab: 4,
  519. url: goPages + '&status=0'
  520. });
  521. that.formContent = res.data.result.jsConfig;
  522. setTimeout(() => {
  523. document.getElementById('alipaysubmit').submit();
  524. }, 1500);
  525. //#endif
  526. // #ifdef MP
  527. uni.navigateTo({
  528. url: `/pages/users/alipay_invoke/index?id=${orderId}&link=${jsConfig.qrCode}`
  529. });
  530. // #endif
  531. // #ifdef APP-PLUS
  532. uni.requestPayment({
  533. provider: 'alipay',
  534. orderInfo: jsConfig,
  535. success: (e) => {
  536. uni.showToast({
  537. title: that.$t(`支付成功`)
  538. })
  539. let url = '/pages/goods/order_pay_status/index?order_id=' +
  540. orderId +
  541. '&msg=' + that.$t(`支付成功`);
  542. setTimeout(res => {
  543. uni.redirectTo({
  544. url: url
  545. })
  546. }, 2000)
  547. },
  548. fail: (e) => {
  549. let url = '/pages/goods/order_pay_status/index?order_id=' +
  550. orderId +
  551. '&msg=' + that.$t(`支付失败`);
  552. uni.showModal({
  553. content: that.$t(`支付失败`),
  554. showCancel: false,
  555. success: function(res) {
  556. if (res.confirm) {
  557. uni.redirectTo({
  558. url: url
  559. })
  560. } else if (res.cancel) {}
  561. }
  562. })
  563. },
  564. complete: () => {
  565. uni.hideLoading();
  566. },
  567. });
  568. // #endif
  569. break;
  570. }
  571. }).catch(err => {
  572. uni.hideLoading();
  573. return that.$util.Tips({
  574. title: err
  575. }, () => {
  576. that.$emit('onChangeFun', {
  577. action: 'pay_fail'
  578. });
  579. });
  580. })
  581. }
  582. }
  583. }
  584. </script>
  585. <style lang="scss" scoped>
  586. .page {
  587. .pay-price {
  588. display: flex;
  589. justify-content: center;
  590. flex-direction: column;
  591. align-items: center;
  592. padding: 50rpx 0 40rpx 0;
  593. .price {
  594. color: #E93323;
  595. margin-bottom: 20rpx;
  596. display: flex;
  597. align-items: flex-end;
  598. .unit {
  599. font-size: 34rpx;
  600. font-weight: 500;
  601. line-height: 41rpx;
  602. }
  603. .num {
  604. font-size: 50rpx;
  605. font-weight: 600;
  606. }
  607. }
  608. .count-down {
  609. display: flex;
  610. align-items: center;
  611. background-color: #fff;
  612. padding: 8rpx 28rpx;
  613. border-radius: 40rpx;
  614. font-size: 24rpx;
  615. color: #E93323;
  616. .time {
  617. margin-top: 0 !important;
  618. }
  619. /deep/.red {
  620. margin: 0 !important;
  621. }
  622. }
  623. }
  624. .payment {
  625. width: 690rpx;
  626. border-radius: 14rpx 14rpx;
  627. background-color: #fff;
  628. z-index: 999;
  629. margin: 0 30rpx;
  630. .title {
  631. color: #666666;
  632. font-size: 26rpx;
  633. padding: 30rpx 0 0 30rpx;
  634. }
  635. .payMoney {
  636. font-size: 28rpx;
  637. color: #333333;
  638. text-align: center;
  639. margin-top: 50rpx;
  640. .font-color {
  641. margin-left: 10rpx;
  642. .money {
  643. font-size: 40rpx;
  644. }
  645. }
  646. }
  647. }
  648. .payment.on {
  649. transform: translate3d(0, 0, 0);
  650. }
  651. .icon-xuanzhong11 {
  652. color: #E93323 !important;
  653. }
  654. .payment .item {
  655. border-bottom: 1rpx solid #eee;
  656. height: 130rpx;
  657. margin-left: 30rpx;
  658. padding-right: 30rpx;
  659. }
  660. .payment .item:last-child {
  661. border-bottom: none;
  662. }
  663. .payment .item .left {
  664. flex: 1;
  665. }
  666. .payment .item .left .text {
  667. flex: 1;
  668. }
  669. .payment .item .left .text .name {
  670. font-size: 30rpx;
  671. color: #333;
  672. }
  673. .payment .item .left .text .info {
  674. font-size: 22rpx;
  675. color: #999;
  676. }
  677. .payment .item .left .text .info .money {
  678. color: #ff9900;
  679. }
  680. .payment .item .left .iconfont {
  681. font-size: 50rpx;
  682. color: #09bb07;
  683. margin-right: 28rpx;
  684. }
  685. .payment .item .left .iconfont.icon-zhifubao {
  686. color: #00aaea;
  687. }
  688. .payment .item .left .iconfont.icon-yuezhifu {
  689. color: #ff9900;
  690. }
  691. .payment .item .left .iconfont.icon-yuezhifu1 {
  692. color: #eb6623;
  693. }
  694. .payment .item .left .iconfont.icon-tonglianzhifu1 {
  695. color: #305fd8;
  696. }
  697. .payment .item .iconfont {
  698. font-size: 40rpx;
  699. color: #ccc;
  700. }
  701. .icon-haoyoudaizhifu {
  702. color: #F34C3E !important;
  703. }
  704. .btn {
  705. position: fixed;
  706. left: 30rpx;
  707. display: flex;
  708. flex-direction: column;
  709. align-items: center;
  710. bottom: 30rpx;
  711. bottom: calc(30rpx + constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
  712. bottom: calc(30rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
  713. }
  714. .wait-pay {
  715. color: #aaa;
  716. font-size: 24rpx;
  717. padding-top: 20rpx;
  718. }
  719. .button {
  720. width: 690rpx;
  721. height: 90rpx;
  722. border-radius: 45rpx;
  723. color: #FFFFFF;
  724. background-color: #E93323;
  725. }
  726. }
  727. </style>