diff --git a/config/utils.js b/config/utils.js index 3468168..982d5a3 100644 --- a/config/utils.js +++ b/config/utils.js @@ -158,32 +158,8 @@ export const setPay = function(payInfo, callback) { if (payData.orderInfo != '' && payData.orderInfo != undefined) { console.log("支付参数", payData); // let EnvUtils = plus.android.importClass('com.alipay.sdk.app.EnvUtils'); - // EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); - let payData1 = { - provider: 'alipay', - orderInfo: data.orderInfo, - success(res) { - console.log('success:' + res); - }, - //调用失败的回调 - fail(err) { - console.log('fail:' + err); - console.log(JSON.stringify(err)) - uni.showModal({ - title: '提示', - showCancel:false, - content: '商家支付参数错误,请重新发起付款', - success: function (res) { - if (res.confirm) { - console.log('用户点击确定'); - } else if (res.cancel) { - console.log('用户点击取消'); - } - } - }); - } - } - uni.requestPayment(payData1); + // EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); + uni.requestPayment(payData); } }, err => { @@ -262,15 +238,14 @@ export const getLatLon = function(tip) { // 单独重新微信支付 export const setWXPay = function(payInfo, callback) { $http.request({ - url: "/pay/placeAnOrder/app", + url: "/pay/placeAnOrder/shoppingpay", method: "POST", // POST、GET、PUT、DELETE,具体说明查看官方文档 data:payInfo, header: { //默认 无 说明:请求头1 'Content-Type': 'application/json' }, }).then(res => { - console.log(res,'res') - + console.log(res,'res') if(res.code === 0){ let payData = { provider : 'wxpay', @@ -289,19 +264,21 @@ export const setWXPay = function(payInfo, callback) { success: true, data: res }); - // console.log('success:' + JSON.stringify(res)); + console.log('success:' + JSON.stringify(res)); }, fail(err) { callback && callback({ success: false, data: err }); - // console.log('fail:' + JSON.stringify(err)); + console.log('fail:' + JSON.stringify(err)); } } // console.log(payData) + if(payData.orderInfo.prepayid != '' && payData.orderInfo.prepayid != undefined){ uni.requestPayment(payData); + } } }) } diff --git a/manifest.json b/manifest.json index 4e121f4..4be880d 100644 --- a/manifest.json +++ b/manifest.json @@ -98,7 +98,8 @@ "useOriginalMsgbox" : true }, "ios" : { - "dSYMs" : false + "dSYMs" : false, + "UIBackgroundModes":["audio"] // 背景播放音乐 }, "icons" : { "android" : { diff --git a/pages/bookShop/orderLCont.vue b/pages/bookShop/orderLCont.vue index 8532d72..8a893bc 100644 --- a/pages/bookShop/orderLCont.vue +++ b/pages/bookShop/orderLCont.vue @@ -202,6 +202,7 @@ this.$http .post(`/book/buyorder/queryFMS?orderId=${this.orderID}`) .then(res => { + console.log(res,'物流信息') if (res && res.code === 0) { // console.log(res, '物流信息') res.rntStr.forEach(item => { diff --git a/pages/bookShop/orderList.vue b/pages/bookShop/orderList.vue index 618d1ef..9f8388b 100644 --- a/pages/bookShop/orderList.vue +++ b/pages/bookShop/orderList.vue @@ -77,10 +77,10 @@ import $http from '@/config/requestConfig.js'; import { setPay, - setPayAssign + setPayAssign,setWXPay } from '@/config/utils'; - import { - mapState +import { + mapState,mapMutations } from 'vuex'; export default { data() { @@ -103,10 +103,14 @@ }], orderListTab: 9, orderList: [], + iapChannel:{}, + checking:false, // 正在检测 + ComplateRequestArr:null, } }, onShow() { this.getOrderList() + this.checkIapOrders() //检查未完成的苹果支付订单 }, computed: { ...mapState(['userInfo']), @@ -117,6 +121,24 @@ uni.stopPullDownRefresh() }, methods: { + ...mapMutations(['setUserInfo']), + checkIapOrders() { + const that = this + // 如果ios已经绑定支付信息,就直接支付,如果没有绑定,就需要先绑定 + console.log('检测支付环境...') + plus.payment.getChannels((channels) => { + console.log(channels, 'channels') + for (var i in channels) { + // 判断是否苹果支付1 + if (channels[i].id === 'appleiap') { + that.iapChannel = channels[i] + that.restoreComplateRequest() // 检查未关闭订单 + // that.requestOrder(productId) + } + } + }) + + }, // 切换订单状态 orderTabCLi(e) { this.orderListTab = e @@ -127,7 +149,7 @@ getOrderList() { this.$http .post(`book/buyorder/appUserGetlist?userId=${this.userInfo.id}&orderStatus=${this.orderListTab}`) - .then(res => { + .then(res => { this.orderList = res.page.list }) }, @@ -138,7 +160,15 @@ url: './orderLCont?orderId=' + e.orderId + '&orderType=' + e.orderStatus }); }, - + + // 跳转到支付页面 + goPay1(e){ + console.log(e,'goPay1') + uni.navigateTo({ + url: '../peanut/reCharge?orderSn=' + e.orderSn + }); + }, + // 取消订单 canceOrder(e) { uni.showModal({ @@ -166,6 +196,10 @@ // 支付 goPay(payItem) { + console.log(payItem,'payItem') + + if(payItem.paymentMethod == 2){ + console.log('阿里支付') setPay({ typePay: 'alipay', subject: 'order', @@ -187,7 +221,249 @@ } this.getOrderList() }) + } else if(payItem.paymentMethod == 1){ + console.log('微信支付') + let data1={ + orderSn:payItem.orderSn, + buyOrderId: null, + totalAmount: payItem.realMoney + } + console.log(data1,'data1') + setWXPay(data1,res => { + if (res.success) { + uni.showToast({ + title: "支付成功" + }); + } else { + console.log(res) + if(res.data.errMsg.indexOf('User canceled') != -1){ + uni.showToast({ + title: "用户取消支付", + icon: "none", + image: '../../static/icon/ic_close.png' + }); + }else{ + uni.showToast({ + title: "支付失败", + icon: "none", + image: '../../static/icon/ic_close.png' + }); + } + } + }) + }else if(payItem.paymentMethod == 3){ + // 苹果充值 + console.log('苹果二次支付') + this.iphonepay(payItem) } + }, + iphonepay(payItem) { + console.log(this.userInfo.restoreFlag,'this.userInfo.restoreFlag') + if(this.ComplateRequestArr == null || this.ComplateRequestArr == [] ){ + this.requestOrder(payItem) + }else{ + uni.showModal({ + title:'提示', + showCancel: false, + content: '您的账户存在未完成的支付订单,请稍后重启app留意账户变动。', + }) + } + }, + requestOrder(payItem) { + uni.showLoading({ + title: '获取商品信息', + mask: true + }) + const that = this + // console.log(productId, 88888888) + // ['xxxxx'] 是平台申请拿到的内购商品的id + let IAPOrders = [] + IAPOrders.push(payItem.productId+'') + console.log(IAPOrders, 'IAPOrders') + // 新建订单 + that.iapChannel.requestOrder(IAPOrders, function(event) { + // uni.hideLoading() + console.log(event, 'event') + for (var index in event) { + var OrderItem = event[index] + // console.log(OrderItem, 'OrderItem') + console.log(OrderItem.productid,'OrderItem.productid') + that.topay(payItem) + } + }, function(erroemsg) { + uni.showToast({ + title: "商品获取失败", + icon: 'none' + }) + }) + }, + topay(payItem) { + const that = this + uni.hideLoading() + // var restoreFlag = true; // 调用支付接口时标记 restoreFlag = true , 实际应用请将标记存储在 storage 中 + this.setUserInfo({restoreFlag:true}); + console.log(this.userInfo,'更新后的用户信息') + plus.payment.request(that.iapChannel, { + productid: payItem.productId, + username: payItem.orderSn, // 用户标识/订单标识 + manualFinishTransaction: true // 3.5.1+ 支持,设置此参数后需要开发者主动关闭订单,参见下面的关闭订单方法 finishTransaction() + + }, function(result) { + // restoreFlag = false; // 支付成功清除标记 restoreFlag = false + that.transaction = result + // 支付成功,result 为 IAP商品交易信息对象 IAPTransaction 需将返回的支付凭证传给后端进行二次认证 + that.iapCheck(result) + }, function(e) { + if(e.errCode == 2){ + // 用户未绑定支付方式,app内支付流程结束,系统弹出框引导用户绑定支付方式,此过程将跳转到系统应用 AppStore 进行绑定支付方式,绑定成功同步支付成功,用户成功付款 + plus.runtime.openURL("https://apps.apple.com/account/billing"); + }else{ + // restoreFlag = false; // 支付失败清楚标记 + that.finishTransaction(result); + //console.log('订单关闭后的用户信息', that.userInfo); + // console.log(e) + //console.log(e.message) + } + }); + }, + // 查询未关闭订单 + restoreComplateRequest(){ + let that = this + console.log('检测未完成订单') + // console.log(that.iapChannel,'this.iapChannel') + that.iapChannel.restoreComplateRequest({ + manualFinishTransaction: true + }, function(results) { + console.log('进入restoreComplateRequest') + // if(!that.checking){ + // that.checking = true + // console.log(that.checking) + // results 格式为数组存放恢复的IAP商品交易信息对象 IAPTransaction,通用需将返回的支付凭证传给后端进行二次认证 + that.ComplateRequestArr = results + console.log(that.ComplateRequestArr,'未完成订单数组') + if(results && results.length>0){ + results.map((item,index)=>{ + // "0"为正在支付;"1"为支付成功;"2"为支付失败;"3"为支付已恢复。 + if(item.transactionState == '1'){ + // 已经支付,但是没有走逻辑的内购订单 + that.iapCheck(item,index) + }else{ + // 其他状态的内购订单 + that.finishTransaction(item) + + } + }) + }else{ + this.setUserInfo({restoreFlag:false}); + console.log('无未处理订单,可以拉起新的支付') + } + // } + }); + + + }, + // 关闭交易订单 + finishTransaction(trans,index){ + this.iapChannel.finishTransaction(trans, (success) => { + console.log('关闭订单成功',index); + + if(index == this.ComplateRequestArr.length-1){ // 最后一个支付订单 + this.setUserInfo({restoreFlag:false}); + console.log(this.userInfo.restoreFlag, 'this.userInfo.restoreFlag') + } + + }, (fail) => { + console.log('关闭订单失败'); + }); + }, + iapCheck(result,index) { + const that = this + console.log('进入后台验证') + let data = { + transactionId: result.transactionIdentifier, // 支付交易id + customerOid: that.userInfo.id, + productId: result.payment.productid, // 产品id + orderId: result.payment.username, // 系统订单号 + receiptData: result.transactionReceipt ,// 苹果返回收据 + loadAnimate:'none', // 请求加载动画 + } + console.log(data,'data') + $http.request({ + url: "/Ipa/veri", + method: "POST", // POST、GET、PUT、DELETE,具体说明查看官方文档 + data, + header: { //默认 无 说明:请求头 + 'Content-Type': 'application/json' + }, + }).then(res => { + console.log(JSON.stringify(res)) + console.log(res.code) + if(res.code == 0){ + // uni.hideLoading() + console.log('充值订单已处理,请留意账户金额变动....') + // 服务器验证票据有效后在客户端关闭订单 + that.finishTransaction(result,index) + }else if(res.code == 200){ // 重复验证订单 + console.log('重复验证....') + that.finishTransaction(result,index) + } + }).catch(e => { + console.log('支付验证失败,进入轮询程序...') + that.getIapPayResult(result,index) + }) + console.log('--------------') + }, + + // 轮询验证支付结果 + getIapPayResult(result,index){ + // let interval = null + this.ComplateRequestInterval = setTimeout(() => { + if(this.maxTimes <= 3){ + this.iapCheck(result,index) + console.log('执行1', this.maxTimes,this.ComplateRequestInterval) + this.maxTimes += 1 + }else{ + this.maxTimes = 0 + console.log('停止轮询', this.maxTimes,this.ComplateRequestInterval, this.maxTimes) + this.checking = false + this.saveErrorIapOrder(result,index) + clearTimeout(this.ComplateRequestInterval) + + } + },10000) + + }, + // 轮询失败接口 + saveErrorIapOrder(result,index){ + console.log('提交到充值问题单里面...') + let data = { + transactionId : result.transactionIdentifier, + failureflag: 1, + orderId:result.payment.username, + receiptData:result.transactionReceipt, + productId:result.payment.productid, + customerOid:this.userInfo.id + } + $http.request({ + url: "Ipa/failure", + method: "POST", // POST、GET、PUT、DELETE,具体说明查看官方文档 + data, + header: { //默认 无 说明:请求头 + 'Content-Type': 'application/json' + }, + }).then(res => { + console.log(JSON.stringify(res)) + if(res.code == 200){ + console.log('提交成功,关闭订单') + this.finishTransaction(result,index) + } + }).catch(e => { + console.log(e) + if(e.statusCode == 0){ // 重复提交,直接关闭订单 + this.finishTransaction(result,index) + } + }) + }, } } diff --git a/pages/bookShop/settlement.vue b/pages/bookShop/settlement.vue index 7da2d8d..a6d7af7 100644 --- a/pages/bookShop/settlement.vue +++ b/pages/bookShop/settlement.vue @@ -67,8 +67,8 @@ ¥{{farePrice}} - - + + @@ -84,7 +84,24 @@ - + + + + + + + + {{item.title}} + {{userMes.peanutCoin}}疯币可用 + 去充值 + + + + + + + 实付款: @@ -183,7 +200,7 @@ import $http from '@/config/requestConfig.js'; import { setPay, - setPayAssign + setPayAssign,setWXPay } from '@/config/utils'; import { mapState @@ -191,6 +208,8 @@ export default { data() { return { + isAndorid:true, // 操作系统 + typeId: 0, shangIDNum: 0, cartIDNum: [], @@ -234,6 +253,27 @@ // img: '../../static/icon/pay_2.png' // } ], + paylistIos: [{ + title: '支付宝', + id: 2, + img: '../../static/icon/pay_1.png' + }, + // { + // title: '微信', + // id: 1, + // img: '../../static/icon/pay_2.png' + // }, + { + title: '疯币购买', + id: 4, + img: '../../static/icon/oder_chong.png' + }, + // { + // title: 'ios内购', + // id: 3, + // img: '../../static/icon/pay_2.png' + // } + ], } }, onLoad(e) { @@ -254,12 +294,24 @@ } else if (this.typeId == 0) { this.getShangList(this.shangIDNum); } - this.getData() + this.getData() + this.getOS() }, computed: { ...mapState(['userInfo']), }, methods: { + // 获得操作系统 + getOS(){ + let oprateOs = '' + oprateOs = uni.getSystemInfoSync().platform + console.log(oprateOs) + if(oprateOs == 'android'){ + this.isAndorid = true + }else{ + this.isAndorid = false + } + }, // 充值疯币 buPoint() { uni.navigateTo({ @@ -306,7 +358,7 @@ if(this.realPrice > this.userMes.peanutCoin){ uni.showToast({ title:'疯币不足,请充值', - icon: 'error', + icon: 'none', duration: 2000 }) return @@ -548,7 +600,7 @@ image: '../../static/icon/ic_close.png' }); } else { - if(this.payType != 4){ + if(this.payType == 2){ // 常规支付 uni.showToast({ title: "正在支付", @@ -584,7 +636,41 @@ }, 1000) } }) - }else{ + }else if(this.payType == 1){ + // 微信支付 + let data1 = { + orderSn:res.orderSn, + buyOrderId: null, + totalAmount: res.money + } + setWXPay(data1,res => { + if (res.success) { + uni.showToast({ + title: "支付成功" + }); + setTimeout(() => { + uni.navigateTo({ + url: './orderList' + }); + }, 1000) + } else { + console.log(res) + if(res.data.errMsg.indexOf('User canceled') != -1){ + uni.showToast({ + title: "用户取消支付", + icon: "none", + image: '../../static/icon/ic_close.png' + }); + }else{ + uni.showToast({ + title: "支付失败", + icon: "none", + image: '../../static/icon/ic_close.png' + }); + } + } + }) + }else if(this.payType == 4){ // 疯币支付 uni.showToast({ title: "购买成功", @@ -767,7 +853,7 @@ padding: 30rpx 40rpx 0 40rpx; background-color: #fff; border-bottom: 1px solid #eee; - + padding-bottom:90rpx; .zhif_radio { .zhif_xuanx { diff --git a/pages/peanut/home.vue b/pages/peanut/home.vue index 6877109..99cc054 100644 --- a/pages/peanut/home.vue +++ b/pages/peanut/home.vue @@ -415,10 +415,8 @@ orderId:result.payment.username, receiptData:result.transactionReceipt, productId:result.payment.productid, - customerOid:this.userInfo.id - - } - console.log(data,'data') + customerOid:this.userInfo.id + } $http.request({ url: "Ipa/failure", method: "POST", // POST、GET、PUT、DELETE,具体说明查看官方文档 diff --git a/pages/peanut/reCharge.vue b/pages/peanut/reCharge.vue index 9beaa53..0819454 100644 --- a/pages/peanut/reCharge.vue +++ b/pages/peanut/reCharge.vue @@ -58,7 +58,7 @@ - 立即充值 + 立即充值 @@ -101,6 +101,7 @@ title: '', content: '' }, + chargeOrderSn:'', // 通过query传过来的orderSN(二次支付情况) xieyiShow: false, stepsCj: {}, cjList: [], @@ -144,7 +145,8 @@ onLoad(e) { // 隐藏原生的tabbar uni.hideTabBar(); - + this.chargeOrderSn = e.orderSn + // console.log(e.orderSn,'orderSn') }, //页面显示 onShow() { @@ -232,14 +234,13 @@ }) }) }, - topay(id) { + topay(id) { const that = this - uni.hideLoading() - // uni.showLoading({ - // title: '充值中请勿离开', - // mask: true - // }) - + uni.hideLoading() + // if(this.chargeOrderSn != '' || this.chargeOrderSn != undefined){ // 判断是不是二次支付的订单 + // that.orderSn = this.chargeOrderSn + // console.log(that.orderSn,'二次支付的订单号') + // } // var restoreFlag = true; // 调用支付接口时标记 restoreFlag = true , 实际应用请将标记存储在 storage 中 this.setUserInfo({restoreFlag:true}); console.log(this.userInfo,'更新后的用户信息') @@ -303,8 +304,6 @@ success: function (res) { if (res.confirm) { console.log('用户点击确定'); - } else if (res.cancel) { - console.log('用户点击取消'); } } }); @@ -371,7 +370,13 @@ this.iphonepay() }, // 充值 - kaiChar() { + goToPay(){ + + this.kaiChar() + + }, + // 正常充值 + kaiChar() { // 常规充值 if (this.radioValue == '1') { uni.showLoading({ title: '支付中,请勿离开', @@ -387,6 +392,7 @@ realMoney: that.stepsCj.money * 1, //实收金额 orderStatus: 0, //订单状态 orderType: "point", //订单类型 + productId: that.stepsCj.priceTypeId // 充值的类型id } $http.request({ url: "book/buyorder/rechargeSave", @@ -425,7 +431,8 @@ that.orderSn = res.orderSn let data1={ orderSn:that.orderSn, - // orderId:that.orderSn, + buyOrderId: that.stepsCj.priceTypeId, + totalAmount: that.stepsCj.money } console.log(data1,'data1') // console.log(this.userInfo.channelList,'channelList') @@ -473,8 +480,7 @@ } - }, - + }, // 跳转 onPageJump(url) { uni.navigateTo({ diff --git a/pages/yRead/angbook.vue b/pages/yRead/angbook.vue index 5a649ca..e89577c 100644 --- a/pages/yRead/angbook.vue +++ b/pages/yRead/angbook.vue @@ -3133,7 +3133,8 @@ import { nextTick } from "vue"; }else if(options.chapterid == 'prev'){ // 上一章 this.goPreChapter() }else if(options.curpage>0){ - this.goNextPage() + // this.goNextPage() + console.log(options.curpage) }else if(options.curpage<0){ this.goPrePage() }