This commit is contained in:
@fawn-nine
2023-03-15 13:17:16 +08:00
parent e74f48e99b
commit ffa17b7630
4 changed files with 608 additions and 226 deletions

View File

@@ -1,24 +1,26 @@
{ // launch.json 配置了启动调试时相关设置configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数remote代表前端连云端云函数
"version": "0.0",
"configurations": [{
"app-plus" :
{
"launchtype" : "local"
},
"default" :
{
"launchtype" : "local"
},
"h5" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
{
// launch.json 配置了启动调试时相关设置configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数remote代表前端连云端云函数
"version" : "0.0",
"configurations" : [
{
"app-plus" : {
"launchtype" : "local"
},
"default" : {
"launchtype" : "local"
},
"h5" : {
"launchtype" : "local"
},
"mp-weixin" : {
"launchtype" : "local"
},
"type" : "uniCloud"
},
{
"playground" : "custom",
"type" : "uni-app:app-ios"
}
]
}

View File

@@ -85,7 +85,7 @@
}
},
"splashscreen" : {
"iosStyle" : "storyboard",
"iosStyle" : "common",
"androidStyle" : "default",
"useOriginalMsgbox" : true
},

View File

@@ -6,14 +6,14 @@
<view class="vip_top">
<view class="now_vip">
<image src="../../static/icon/mine_card.png" alt=""></image>
<text>
<view class="text">
<image src="../../static/icon/mine_v.png" alt=""></image>
疯子读书会员
<br>
<i>VIPFENGZIDUSHU</i>
<br>
<b>加入会员立项4项特权</b>
</text>
</view>
</view>
</view>
<view class="vip_quan">
@@ -75,11 +75,27 @@
</u-radio-group>
</view>
</view>
<view class="agree_wo">* 我已阅读并同意会员服务协议</view>
<view class="agree_wo" style="float: left; display: flex;">
<radio-group class="agree">
<view v-for="(item, index) in argee" :key="index" >
<radio class="agreeRadio" :value="item.id" :checked="item.id==radioValue" @click="radioCheck(index)"></radio>
<!-- <view>{{item.value}}</view> -->
</view>
</radio-group>
<view>* 我已阅读并同意<span class="highlight" @click="showXieyi">会员服务协议</span></view></view>
<view class="vip_btn">
<view @click="goPoinBuy">立即开通会员</view>
</view>
<!-- 充值协议 -->
<u-popup :show="xieyiShow" :round="10" @close="xieyiShow=false">
<view class="tanchu">
<view class="dp_title">会员服务协议</view>
<view style="max-height: 1000rpx;overflow-y: scroll;">
<view v-html="xieyi.content"></view>
</view>
</view>
</u-popup>
</view>
</template>
@@ -95,6 +111,16 @@
export default {
data() {
return {
xieyiShow : false,
xieyi:{
title:'',
content:''
},
argee:[
{value:false,id:'1'}
] ,// 同意权限
radioValue:'',
stepsVc: {},
vcList: [],
userMes:{},
@@ -135,7 +161,29 @@
},
//方法
methods: {
showXieyi(){
this.$http
.get(`sys/agreement/list?key=member`)
.then(res => {
this.xieyi = res.page.list[0]
this.xieyiShow = true
})
},
radioCheck (index) {
this.argee.forEach((item =>{
item.isCheck = false
}))
if(this.radioValue==this.argee[index].id) {
this.radioValue =null
}else {
this.radioValue = this.argee[index].id
}
// console.log(this.radioValue)
},
goPoinBuy(){
if(this.radioValue == '1'){
if(this.stepsVc.money > this.userMes.peanutCoin){
uni.showToast({
title:'疯币不足,请充值',
@@ -146,6 +194,13 @@
}else{
this.kaiVip()
}
}else{
uni.showToast({
title:'请勾选服务协议',
icon:'error'
})
return false
}
},
// 充值疯币
buPoint() {
@@ -290,6 +345,115 @@
</script>
<style lang="scss" scoped>
@import '@/style/mixin.scss';
.agreeRadio{ zoom: .8;}
.tanchu {
padding: 40rpx 30rpx 40rpx 30rpx;
position: relative;
.dp_title {
font-size: 32rpx;
margin-bottom: 50rpx;
color: #555;
text-align: center;
font-weight: bold;
}
.dp_add {
position: absolute;
top: 40rpx;
right: 30rpx;
font-size: 22rpx;
background-color: #fd6004;
color: #fff;
border-radius: 10rpx;
padding: 5rpx 10rpx;
.u-icon {
display: inline-block;
margin-right: 5rpx;
}
}
.addressItem {
border: 2px dashed #d9d9d9;
border-radius: 10rpx;
width: 100%;
display: flex;
padding: 20rpx 10rpx;
margin: 25rpx 0 0 0;
align-items: center;
background-color: #fff;
.addrContent {
margin-left: 40rpx;
flex: 1;
.addrContentTop {
display: flex;
align-items: flex-end;
margin: 0 0 15rpx 0;
position: relative;
.userName {
font-size: 35rpx;
font-weight: bold;
margin-right: 30rpx;
}
.userTel {
font-size: 25rpx;
color: #888;
}
.userMoren {
border: 1px solid #fd6004;
color: #fd6004;
padding: 3rpx 10rpx;
font-size: 22rpx;
border-radius: 10rpx;
margin: 0 0 0 20rpx;
}
.chooseCheck {
position: absolute;
top: 3rpx;
right: 6rpx;
}
}
.addrContentBottom {
font-size: 32rpx;
}
}
}
.addressItem.addItem_style {
border-color: #fd6004;
}
.youhuiItem {
border: 1px solid #d9d9d9;
border-radius: 10rpx;
width: 100%;
display: flex;
padding: 20rpx 10rpx;
margin: 25rpx 0 0 0;
align-items: center;
background-color: #fff;
font-size: 30rpx;
}
.youhuiItem>view {
float: left;
}
.youhuiItem.youItem_style {
border-color: #fd6004;
}
}
.chongBtn {
background-color: #54a966;
color: #fff !important;
@@ -320,8 +484,15 @@
width: 100%;
height: 410rpx;
}
text {
.text{margin-top: 60rpx;
font-size: 50upx;
line-height: 80upx;
color: #977749;
font-weight: bold;
position: absolute;
left: 80rpx;
top: 3rpx;}
.text {
margin-top: 60rpx;
font-size: 50upx;
line-height: 80upx;

View File

@@ -17,38 +17,62 @@
</view>
<view class="cha_fangsh">
<view class="cf_title">支付方式</view>
<view class="cf_radio">
<u-radio-group v-model="payType">
<view style="width: 100%;" v-if="isAndroid">
<!-- #ifdef MP-WEIXIN -->
<view style="width: 100%;" >
<view v-for="(item, index) in paylist" @click="choseType(item.id)"
:class="payType == item.id?'Tab_xf cf_xuanx':'cf_xuanx'">
<image :src="item.img"></image>
{{item.title}}
<u-radio v-if="isAndroid" :key="index" activeColor="#fe6e09" :name='item.id'
style="float: right;margin-top: 5rpx;"></u-radio>
</view>
</view>
<view style="width: 100%;" v-else>
<!-- #endif -->
<!-- #ifdef APP-IOS -->
<view style="width: 100%;" >
<view v-for="(item, index) in iosPaylist" @click="choseType(item.id)"
:class="payType == item.id?'Tab_xf cf_xuanx':'cf_xuanx'">
<image :src="item.img"></image>
{{item.title}}
<u-radio v-if="isAndroid" :key="index" activeColor="#fe6e09" :name='item.id'
style="float: right;margin-top: 5rpx;"></u-radio>
</view>
</view>
<!-- #endif -->
</u-radio-group>
</view>
</view>
<view class="agree_wo">* 我已阅读并同意会员服务协议</view>
<view class="agree_wo flexbox" style="float: left; display: flex;" >
<radio-group class="agree">
<view v-for="(item, index) in argee" :key="index" >
<radio class="agreeRadio" :value="item.id" :checked="item.id==radioValue" @click="radioCheck(index)"></radio>
</view>
</radio-group>
<view>* 我已阅读并同意<span class="highlight" @click="showXieyi">增值服务协议</span></view>
</view>
<view class="char_btn">
<view @click="kaiChar" v-if="isAndroid">立即充值</view>
<view @click="iosPay" v-else>立即充值</view>
<!-- #ifdef MP-WEIXIN -->
<view @click="kaiChar">立即充值</view>
<!-- #endif -->
<!-- #ifdef APP-IOS -->
<view @click="iosPay" >立即充值</view>
<!-- #endif -->
</view>
<!-- 充值协议 -->
<u-popup :show="xieyiShow" :round="10" @close="xieyiShow=false">
<view class="tanchu">
<view class="dp_title">增值服务协议</view>
<view style="max-height: 1000rpx;overflow-y: scroll;">
<view v-html="xieyi.content"></view>
</view>
</view>
</u-popup>
</view>
</template>
@@ -67,12 +91,27 @@
} from '@/config/utils';
export default {
data() {
return {
return {
xieyi:{
title:'',
content:''
},
xieyiShow:false,
stepsCj: {},
cjList: [],
productid:'',
isAndroid:true, // 是否为安卓环境
argee:[
{value:false,id:'1'}
] ,// 同意权限
radioValue:'',
orderSn:'', // 订单sn
productid: '',
isAndroid: true, // 是否为安卓环境
payType: 2,
// #ifdef APP-IOS
payType: 3,
// #endif
paylist: [{
title: '支付宝',
id: 2,
@@ -84,227 +123,397 @@
img: '../../static/icon/pay_2.png'
}
],
iosPaylist: [
{
title: 'ios内购',
id: 3,
img: '../../static/icon/pay_2.png'
}
],
iosPaylist: [{
title: 'IOS支付',
id: 3,
img: '../../static/icon/pay_2.png'
}],
};
},
//第一次加载
onLoad(e) {
// 隐藏原生的tabbar
uni.hideTabBar();
this.getData();
this.getIapChannels()
this.getData();
},
//页面显示
onShow() {
// 隐藏原生的tabbar
uni.hideTabBar();
this.requestIapOrder()
// this.requestIapOrder()
},
computed: {
...mapState(['userInfo']),
},
//方法
methods: {
// 获取应用内支付对象
getIapChannels() {
console.log('------getIapChannels' );
let _this = this;
plus.payment.getChannels(function(channels){
for (let i in channels) {
let channel = channels[i];
// 获取 id 为 'appleiap' 的 channel
if (channel.id == 'appleiap') {
_this.iap = channel;
_this.requestIapOrder();
}
}
}, function(e){
showToasts("获取iap支付通道失败" + e.message);
});
},
// 获取到支付对象后,初始化支付项目列表
requestIapOrder() {
console.log('------requestIapOrder' );
// #ifdef APP-PLUS
let ids = [this.productid];
this.iap.requestOrder(ids, function(res) {
console.log(res);
this.iapOrder = true;
}, function(e) {
this.vm.jumpPay = false;
showToasts("获取订单信息失败:" + e.code);
});
// #endif
},
// 支付
goApplePay() {
console.log('------goApplePay' );
// 获取订单
let _this = this;
payApply().then(res => {
// 发起支付
plus.payment.request(this.iap, {
productid: this.productid,
username: res.data.out_trade_no,
}, function(result){
console.log(result);
_this.appleNotify(result);
}, function(e){
// console.log(e);
this.vm.jumpPay = false;
showToasts("支付失败");
});
}).catch(err => {
showToasts(err.message || '获取数据失败');
})
},
appleNotify(notifyData) {
console.log('------appleNotify' );
// 关闭支付弹窗
this.popPayClose();
// 支付成功
appleNotify({notify: notifyData}).then(res => {
console.log(res);
if(res.data == 1) {
this.$emit('apply-pay-success');
}
}).catch(err => {
showToasts("支付失败");
});
},
// 回调处理,这里是用的前端回调返回给服务端处理
getDevName(){
// 获取使用环境
if(uni.getSystemInfoSync().platform === 'android'){
this.isAndroid = true
// console.log('运行Android上')
}else{
this.isAndroid = false
// console.log('运行iOS上')
}
},
// 获取充值金额
getData() {
showXieyi(){
this.$http
.post('book/bookbuyconfig/getVipOrPoint', {
type: 'point',
qudao: 'Android'
.get(`sys/agreement/list?key=pay`)
.then(res => {
this.xieyi = res.page.list[0]
this.xieyiShow = true
})
.then(res => {
this.cjList = res.list
this.stepsCj = res.list[0]
});
},
// 点击充值金额
chosPric(e) {
this.stepsCj = e
},
// 选择支付方式
choseType(e) {
let that = this
that.payType = e
},
//ios充值
iosPay(){
let that = this
let data = {
userId: that.userInfo.id, //下单人ID
userPhone: that.userInfo.tel, //收货人手机号
paymentMethod: that.payType,
orderMoney: that.stepsCj.money * 1, //订单金额
districtMoney: 0, //优惠金额
realMoney: that.stepsCj.money * 1, //实收金额
orderStatus: 0, //订单状态
orderType: "point", //订单类型
}
},
radioCheck (index) { // 勾选用户协议
this.argee.forEach((item =>{
item.isCheck = false
}))
if(this.radioValue==this.argee[index].id) {
this.radioValue =null
}else {
this.radioValue = this.argee[index].id
}
// console.log(this.radioValue)
},
iphonepay() {
const that = this
uni.showLoading({
title: '检测支付环境...',
mask: true
})
plus.payment.getChannels((channels) => {
for (var i in channels) {
// 判断是否苹果支付
if (channels[i].id === 'appleiap') {
that.iapChannel = channels[i]
that.requestOrder()
consle.log(666666666)
}
}
})
$http.request({
url: "book/buyorder/rechargeSave",
method: "POST", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: { //默认 无 说明:请求头
'Content-Type': 'application/json'
},
}).then(res => {
console.log(res)
},
requestOrder() {
uni.showLoading({
title: '到这...',
mask: true
})
const that = this
// ['xxxxx'] 是平台申请拿到的内购商品的id
that.iapChannel.requestOrder(that.stepsCj.priceTypeId, function(event) {
// uni.hideLoading()
console.log(event)
for (var index in event) {
var OrderItem = event[index]
console.log(OrderItem)
that.topay(OrderItem.productid)
}
}, function(erroemsg) {
//uni.hideLoading()
// uni.showToast({
// })
uni.showToast({
title: "获取支付通道失败:",
icon: 'none'
})
})
},
// 充值
kaiChar() {
let that = this
let data = {
userId: that.userInfo.id, //下单人ID
userPhone: that.userInfo.tel, //收货人手机号
paymentMethod: that.payType, //1支付宝2微信3ios内购
orderMoney: that.stepsCj.money * 1, //订单金额
districtMoney: 0, //优惠金额
realMoney: that.stepsCj.money * 1, //实收金额
orderStatus: 0, //订单状态
orderType: "point", //订单类型
}
$http.request({
url: "book/buyorder/rechargeSave",
method: "POST", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: { //默认 无 说明:请求头
'Content-Type': 'application/json'
topay(id) {
const that = this
uni.showLoading({
title: '充值中请勿离开',
mask: true
})
uni.requestPayment({
provider: 'appleiap',
orderInfo: {
productid: id,
username: 'ordersn', // 用户标识
optimize: true // 设置 optimize: true 解决丢单问题
},
}).then(res => {
if (res.code == 0) {
setPay({
typePay: 'alipay',
subject: 'point',
totalAmount: that.stepsCj.money,
type: that.payType,
relevanceoid: res.orderSn,
body: that.stepsCj.priceTypeId,
}, res => {
if (res.success) {
uni.showToast({
title: "支付成功"
});
} else {
uni.showToast({
title: "支付失败",
icon: "none",
image: '../../static/icon/ic_close.png'
});
}
success: (res => {
uni.hideLoading()
let data= {
receipt:res.transactionReceipt, // 校验体
TransactionID: this.orderSn,
transactionId: res.transactionIdentifier //交易id
}
const orderId = this.orderId //这个订单id 是由后端返回的
const transactionId = res.transactionIdentifier //交易id
const payload = res.transactionReceipt //校验体
$http.request({
url: "/apple/applePay",
method: "POST", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: { //默认 无 说明:请求头
'Content-Type': 'application/json'
},
}).then(res => {
console.log(res)
uni.showToast({
title: '充值成功'
})
// 进行后续操作
///that.getUserInfo()
})
}),
fail: (e) => {
uni.hideLoading()
uni.showModal({
content: "支付失败",
showCancel: false
})
}
})
},
getDevName() {
// 获取使用环境
if (uni.getSystemInfoSync().platform === 'android') {
this.isAndroid = true
// console.log('运行Android上')
} else {
this.isAndroid = false
// console.log('运行iOS上')
}
},
// 获取充值金额
getData() {
this.$http
.post('book/bookbuyconfig/getVipOrPoint', {
type: 'point',
qudao: 'Android'
})
.then(res => {
this.cjList = res.list
this.stepsCj = res.list[0]
});
},
// 点击充值金额
chosPric(e) {
this.stepsCj = e
console.log(e)
},
// 选择支付方式
choseType(e) {
let that = this
that.payType = e
},
//ios充值
iosPay() {
if(this.radioValue == '1'){
let that = this
let data = {
userId: that.userInfo.id, //下单人ID
userPhone: that.userInfo.tel, //收货人手机号
paymentMethod: that.payType,
orderMoney: that.stepsCj.money * 1, //订单金额
districtMoney: 0, //优惠金额
realMoney: that.stepsCj.money * 1, //实收金额
orderStatus: 0, //订单状态
orderType: "point", //订单类型
}
$http.request({
url: "book/buyorder/rechargeSave",
method: "POST", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: { //默认 无 说明:请求头
'Content-Type': 'application/json'
},
}).then(res => {
console.log(res)
this.orderSn = res.orderSn
// this.topay(15)
this.iphonepay()
})
}else{
uni.showToast({
title:'请勾选服务协议',
icon:'error'
})
}
},
// 充值
kaiChar() {
if(this.radioValue == '1'){
let that = this
let data = {
userId: that.userInfo.id, //下单人ID
userPhone: that.userInfo.tel, //收货人手机号
paymentMethod: that.payType, //1支付宝2微信3ios内购
orderMoney: that.stepsCj.money * 1, //订单金额
districtMoney: 0, //优惠金额
realMoney: that.stepsCj.money * 1, //实收金额
orderStatus: 0, //订单状态
orderType: "point", //订单类型
}
$http.request({
url: "book/buyorder/rechargeSave",
method: "POST", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: { //默认 无 说明:请求头
'Content-Type': 'application/json'
},
}).then(res => {
if (res.code == 0) {
setPay({
typePay: 'alipay',
subject: 'point',
totalAmount: that.stepsCj.money,
type: that.payType,
relevanceoid: res.orderSn,
body: that.stepsCj.priceTypeId,
}, res => {
if (res.success) {
uni.showToast({
title: "支付成功"
});
} else {
uni.showToast({
title: "支付失败",
icon: "none",
image: '../../static/icon/ic_close.png'
});
}
})
}
})
}else{
uni.showToast({
title:'请勾选 已阅读会员服务协议',
icon:'error'
})
return false
}
},
// 跳转
onPageJump(url) {
uni.navigateTo({
url: url
});
},
},
// 跳转
onPageJump(url) {
uni.navigateTo({
url: url
});
},
},
};
};
</script>
<style lang="scss" scoped>
@import '@/style/mixin.scss';
.tanchu {
padding: 40rpx 30rpx 40rpx 30rpx;
position: relative;
.dp_title {
font-size: 32rpx;
margin-bottom: 50rpx;
color: #555;
text-align: center;
font-weight: bold;
}
.dp_add {
position: absolute;
top: 40rpx;
right: 30rpx;
font-size: 22rpx;
background-color: #fd6004;
color: #fff;
border-radius: 10rpx;
padding: 5rpx 10rpx;
.u-icon {
display: inline-block;
margin-right: 5rpx;
}
}
.addressItem {
border: 2px dashed #d9d9d9;
border-radius: 10rpx;
width: 100%;
display: flex;
padding: 20rpx 10rpx;
margin: 25rpx 0 0 0;
align-items: center;
background-color: #fff;
.addrContent {
margin-left: 40rpx;
flex: 1;
.addrContentTop {
display: flex;
align-items: flex-end;
margin: 0 0 15rpx 0;
position: relative;
.userName {
font-size: 35rpx;
font-weight: bold;
margin-right: 30rpx;
}
.userTel {
font-size: 25rpx;
color: #888;
}
.userMoren {
border: 1px solid #fd6004;
color: #fd6004;
padding: 3rpx 10rpx;
font-size: 22rpx;
border-radius: 10rpx;
margin: 0 0 0 20rpx;
}
.chooseCheck {
position: absolute;
top: 3rpx;
right: 6rpx;
}
}
.addrContentBottom {
font-size: 32rpx;
}
}
}
.addressItem.addItem_style {
border-color: #fd6004;
}
.youhuiItem {
border: 1px solid #d9d9d9;
border-radius: 10rpx;
width: 100%;
display: flex;
padding: 20rpx 10rpx;
margin: 25rpx 0 0 0;
align-items: center;
background-color: #fff;
font-size: 30rpx;
}
.youhuiItem>view {
float: left;
}
.youhuiItem.youItem_style {
border-color: #fd6004;
}
}
.agreeRadio{ zoom: .8;}
.cha_jine {
margin: 40rpx 50rpx 0 50rpx;
@@ -363,7 +572,7 @@
}
}
}
.highlight{color: $uni-color-primary;}
.cha_fangsh {
margin: 40rpx 50rpx 0 50rpx;