From dd2396275ae6e10dc08fe3310c4cd3e2fed91b56 Mon Sep 17 00:00:00 2001 From: weipengfei <2187978347@qq.com> Date: Fri, 22 Mar 2024 16:02:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/api.js | 7 + components/payment/index.vue | 153 ++++++++++++++------ components/popups/index.vue | 8 +- pages/index/index.vue | 6 +- pages/users/user_modify_pwd/index.vue | 197 +++++++++++++++++--------- static/images/index26.png | Bin 0 -> 7632 bytes 6 files changed, 256 insertions(+), 115 deletions(-) create mode 100644 static/images/index26.png diff --git a/api/api.js b/api/api.js index 19a2953..a65e7cf 100644 --- a/api/api.js +++ b/api/api.js @@ -206,6 +206,13 @@ export function modifyPhone(data) { export function modifyPassword(data) { return request.post('user/change/password', data); } + +/** 设置支付密码 */ +export function setPayPwd(data) { + return request.post('User/set/withdrawal_pwd', data); +} + + /** 退出登錄 */ export function logout() { return request.get('logout'); diff --git a/components/payment/index.vue b/components/payment/index.vue index a27272f..c4e609c 100644 --- a/components/payment/index.vue +++ b/components/payment/index.vue @@ -5,7 +5,7 @@ 选择付款方式 + v-for="(item,index) in payMode" v-if="item.payStatus==1" :key="index"> @@ -20,6 +20,12 @@ + + + + + + @@ -27,7 +33,7 @@ // +---------------------------------------------------------------------- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ] // +---------------------------------------------------------------------- - // | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. + // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved. // +---------------------------------------------------------------------- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 // +---------------------------------------------------------------------- @@ -35,9 +41,17 @@ // +---------------------------------------------------------------------- import { orderPay, - presellOrderPay + integralOrderPay, + presellOrderPay, + verifyPwd } from '@/api/order.js'; + import payPwd from "@/components/payPwd/index.vue"; + import popups from "@/components/popups/index.vue"; export default { + components: { + payPwd, + popups + }, props: { payMode: { type: Array, @@ -64,13 +78,18 @@ isCall: { type: Boolean, default: false + }, + returnUrl: { + type: String, + default: '' } }, data() { return { - + type: '' }; }, + methods: { close: function() { this.$emit('onChangeFun', { @@ -78,7 +97,6 @@ }); }, goPay: function(number, paytype) { - if (this.isCall) { return this.$emit('onChangeFun', { action: 'payCheck', @@ -99,7 +117,6 @@ // #endif } else if (paytype == 'balance') { type = 'balance'; - console.log('123'); } else if (paytype == 'alipay') { // #ifndef MP type = 'alipay'; @@ -107,9 +124,8 @@ // #ifdef MP type = 'alipayQr'; // #endif - } else if (paytype == 'creditBuy') { - console.log('123123'); - type = 'creditBuy' + } else if (paytype == 'public') { + type = 'public'; } if (!that.order_id) return that.$util.Tips({ title: '请选择要支付的订单' @@ -117,29 +133,79 @@ if (paytype == 'balance' && parseFloat(number) < parseFloat(that.totalPrice)) return that.$util.Tips({ title: '余额不足!' }); - uni.showLoading({ - title: '支付中' + + this.type = type; + + if (paytype == 'balance' || paytype == 'merBalance') { + this.$refs.popups.handleOpen(); + } else { + uni.showLoading({ + title: '订单支付中' + }); + this.trueOrderPay(); + } + }, + + // 输入密码回调 + handleConfirm(e) { + // 验证密码是否正确 + verifyPwd({ + withdrawal_pwd: e + }).then(res => { + // 密码是否有效 状态码判断 + const code = res.data.code; + + if (code == 100) { //密码正确 + uni.showLoading({ + title: '订单支付中', + mask: true + }); + this.trueOrderPay(); + } else { + this.$refs.payPwd.handleOpen(code); + } + }).catch(err => { + console.log(err) + }) + }, + + handleClear() {}, + handleChange() {}, + + // 弹框左边按钮 101 未设置密码 102 忘记密码 都去设置密码 + handleLeft(code) { + uni.navigateTo({ + url: "/pages/users/user_modify_pwd/index?type=payPwd" }); - let orderApi = that.order_type === 1 ? presellOrderPay : orderPay + this.$refs.payPwd.handleClose(); + }, + + // 弹框右边按钮 取消 重试 + handleRight(code) { + if (code == 101) { //取消 + this.$refs.payPwd.handleClose(code); + } else { + this.$refs.payPwd.handleClose(); + this.$refs.popups.handleOpen(); + } + }, + + trueOrderPay() { + let that = this; + let orderApi = that.order_type === 1 ? presellOrderPay : that.order_type === 2 ? integralOrderPay : + orderPay orderApi(that.order_id, { - type: type, + type: that.type, // #ifdef H5 - - return_url: this.order_type == 98 ? 'http://' + window.location.host + - '/pages/users/order_list/indexCopy' : 'http://' + window.location.host + - '/pages/users/order_list/index', - - + return_url: that.returnUrl !== '' ? 'http://' + window.location.host + that.returnUrl : + 'http://' + window.location.host + '/pages/users/order_list/index', // #endif - }).then(res => { let status = res.data.status, orderId = res.data.result.order_id, jsConfig = res.data.result.config, callback_key = res.data.result.pay_key, - - goPages = this.order_type == 98 ? '/pages/users/order_list/indexCopy' : - '/pages/users/order_list/index' + goPages = that.returnUrl ? that.returnUrl : '/pages/users/order_list/index'; switch (status) { case 'ORDER_EXIST': case 'EXTEND_ORDER': @@ -163,7 +229,7 @@ icon: 'success' }, { tab: 5, - url: goPages + '?status=2' + url: goPages + '?status=1' }); break; case 'alipay': @@ -185,7 +251,7 @@ jsConfig.timeStamp = jsConfig.timestamp; // #ifndef APP-PLUS that.$wechat.pay(jsConfig).then(res => { - // console.log('测试支付数据无效的success:'+res.data) + console.log('测试支付数据无效的success:' + res.data) this.$emit('onChangeFun', { action: 'payClose' }); @@ -195,10 +261,10 @@ icon: 'success' }, { tab: 5, - url: goPages + 'status=2' + url: goPages + 'status=1' }); }).catch(res => { - // console.log('测试支付数据无效的catch:'+res.data) + console.log('测试支付数据无效的catch:' + res.data) if (res.errMsg == 'chooseWXPay:cancel') { if (that.isCall) { return that.$util.Tips({ @@ -209,7 +275,7 @@ title: '取消支付' }, { tab: 5, - url: goPages + '?status=1' + url: goPages + '?status=0' }); } } @@ -222,7 +288,6 @@ } else { mp_pay_name = 'requestPayment' } - console.log(mp_pay_name, jsConfig) uni[mp_pay_name]({ provider: 'wxpay', orderInfo: jsConfig, @@ -235,11 +300,10 @@ icon: 'success' }, { tab: 5, - url: goPages + 'status=2' + url: goPages + 'status=1' }); }, fail: (e) => { - console.log(e) if (that.isCall) { return that.$util.Tips({ title: '取消支付' @@ -249,7 +313,7 @@ title: '取消支付' }, { tab: 5, - url: goPages + '?status=1' + url: goPages + '?status=0' }); } }, @@ -284,7 +348,7 @@ icon: 'success' }, { tab: 5, - url: goPages + '?status=2' + url: goPages + '?status=1' }); return that.$util.Tips({ @@ -292,7 +356,7 @@ icon: 'success' }, { tab: 5, - url: goPages + '?status=2' + url: goPages + '?status=1' }); }, fail: function(e) { @@ -307,10 +371,9 @@ complete: function(e) { uni.hideLoading(); //关闭当前页面跳转至订单状态 - if (res.errMsg == 'requestPayment:cancel') return that.$util - .Tips({ - title: '取消支付' - }); + if (res.errMsg == 'requestPayment:cancel') return that.$util.Tips({ + title: '取消支付' + }); that.$emit('onChangeFun', { action: 'payClose' }); @@ -329,6 +392,16 @@ }); break; // #ifdef H5 + case "public": + uni.hideLoading(); + that.$emit('onChangeFun', { + action: 'payClose' + }); + //余额不足 + return that.$util.Tips({ + title: "下单成功,请上传付款凭证!" + }); + break; case 'h5': let host = window.location.protocol + "//" + window.location.host; let url = `${host}/pages/order_pay_status/index?order_id=${orderId}` @@ -355,7 +428,7 @@ icon: 'success' }, { tab: 5, - url: goPages + 'status=2' + url: goPages + 'status=1' }); }, @@ -392,7 +465,7 @@ border-radius: 16rpx 16rpx 0 0; background-color: #fff; padding-bottom: 60rpx; - z-index: 99999; + z-index: 99; transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9); transform: translate3d(0, 100%, 0); } diff --git a/components/popups/index.vue b/components/popups/index.vue index 4b9b696..1c18754 100644 --- a/components/popups/index.vue +++ b/components/popups/index.vue @@ -6,7 +6,7 @@ - 请输入支付密码 + {{title}} @@ -56,7 +56,11 @@ isPay: { //区分支付密码还是输入数字 type: Boolean, default: false - } + }, + title: { + type: String, + default: '请输入支付密码' + } }, data() { return { diff --git a/pages/index/index.vue b/pages/index/index.vue index 4ba3c6e..2cf9ad8 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -620,7 +620,7 @@ }, { name: '商户类型', type: 23, - image: require('@/static/images/index14.png') + image: require('@/static/images/index26.png') }, @@ -702,7 +702,7 @@ }, { name: '商户类型', type: 23, - image: require('@/static/images/index14.png') + image: require('@/static/images/index26.png') }, // { // name: '全部', @@ -752,7 +752,7 @@ }, { name: '商户类型', type: 23, - image: require('@/static/images/index14.png') + image: require('@/static/images/index26.png') }, { name: '扫码付款', diff --git a/pages/users/user_modify_pwd/index.vue b/pages/users/user_modify_pwd/index.vue index ca81fce..2e0ff8b 100644 --- a/pages/users/user_modify_pwd/index.vue +++ b/pages/users/user_modify_pwd/index.vue @@ -7,29 +7,43 @@ {{userInfo.phone}} - - - - - - - - - - + + + + + + + + + + + + + + + + - - - + + @@ -37,70 +51,75 @@ // +---------------------------------------------------------------------- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ] // +---------------------------------------------------------------------- - // | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. + // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved. // +---------------------------------------------------------------------- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 // +---------------------------------------------------------------------- // | Author: CRMEB Team // +---------------------------------------------------------------------- import sendVerifyCode from "@/mixins/SendVerifyCode"; - import { modifyPassword, verifyCode, appletsDecrypt } from '@/api/api.js'; - import { getUserInfo } from '@/api/user.js'; - import { registerVerify } from '@/api/user.js' + import { + modifyPassword, + verifyCode, + appletsDecrypt, + setPayPwd + } from '@/api/api.js'; + import { + getUserInfo + } from '@/api/user.js'; + import { + registerVerify + } from '@/api/user.js' import { mapGetters } from "vuex"; - import authorize from '@/components/Authorize'; - import Verify from '@/components/verify/verify.vue'; + import { + toLogin + } from '@/libs/login.js'; + import Verify from '@/components/verify/verify.vue'; + import popups from "@/components/popups/index.vue"; export default { mixins: [sendVerifyCode], components: { - authorize, - Verify + Verify, + popups }, data() { return { userInfo: {}, - phone:'', + phone: '', repassword: '', password: '', - captcha:'', - isAuto: false, //没有授权的不会自动授权 - isShowAuth: false, //是否隐藏授权 + captcha: '', key: '', codeVal: '', disabled: false, + type: '', + set_type: '', }; }, computed: mapGetters(['isLogin', 'viewColor']), - onLoad() { + onLoad(opt) { let that = this + this.type = opt.type; if (this.isLogin) { this.getUserInfo() } else { - this.isAuto = true; - this.isShowAuth = true + toLogin() } // #ifdef MP wx.login({ - success (res) { - if (res.code) { - that.codeVal = res.code - } else { - // console.log('登录失败!' + res.errMsg) - } - } + success(res) { + if (res.code) { + that.codeVal = res.code + } else { + console.log('登录失败!' + res.errMsg) + } + } }) // #endif }, methods: { - onLoadFun:function(){ - this.isShowAuth = false; - }, - // 授权关闭 - authColse: function(e) { - this.isShowAuth = e - }, /** * 获取个人用户信息 */ @@ -110,6 +129,19 @@ that.userInfo = res.data }); }, + showPopup(type){ + this.set_type = type; + this.$refs.popups.handleOpen(); + }, + // 输入密码回调 + handleConfirm(e) { + if(this.set_type==1)this.password = e; + else this.repassword = e; + }, + + handleClear() {}, + handleChange() {}, + confirmSubmit: function() { let that = this; if (!that.password) return that.$util.Tips({ @@ -124,23 +156,40 @@ if (!that.captcha) return that.$util.Tips({ title: '请填写验证码' }); - modifyPassword({ - password: that.password, - repassword: that.repassword, - sms_code: that.captcha - }).then(res => { - return that.$util.Tips({ - title: '修改成功!', - icon: 'success' - }, { - tab: 5, - url: '/pages/users/user_info/index' - }); - }).catch(err => { - return that.$util.Tips({ - title: err - }); - }) + + if (this.type == 'payPwd') { //支付提现密码 + setPayPwd({ + password: that.password, + repassword: that.repassword, + sms_code: that.captcha + }).then(res => { + that.$util.Tips({ + title: '修改成功!', + icon: 'success' + }) + this.$nextTick((res=>{ + uni.navigateBack(); + })) + }) + } else { // 登录密码 + modifyPassword({ + password: that.password, + repassword: that.repassword, + sms_code: that.captcha + }).then(res => { + return that.$util.Tips({ + title: '修改成功!', + icon: 'success' + }, { + tab: 5, + url: '/pages/users/user_info/index' + }); + }).catch(err => { + return that.$util.Tips({ + title: err + }); + }) + } }, /** * 发送验证码 @@ -153,10 +202,10 @@ // }); this.disabled = true await registerVerify({ - phone:that.userInfo.phone, - code:that.captcha, + phone: that.userInfo.phone, + code: that.captcha, type: 'change_pwd', - captchaType: 'blockPuzzle', + captchaType: 'blockPuzzle', captchaVerification: data.captchaVerification }).then(res => { this.disabled = false @@ -171,7 +220,7 @@ }); }); }, - success(data) { + success(data) { this.$refs.verify.hide(); this.code(data); }, @@ -183,10 +232,11 @@ + \ No newline at end of file diff --git a/static/images/index26.png b/static/images/index26.png new file mode 100644 index 0000000000000000000000000000000000000000..1e847c9858392cc4540a0bf4d8c413486763ef54 GIT binary patch literal 7632 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