Procházet zdrojové kódy

增加支付和退款

jun před 1 měsícem
rodič
revize
68f79ff9b5
5 změnil soubory, kde provedl 252 přidání a 23 odebrání
  1. 6 0
      pages.json
  2. 10 9
      pages/car/order.vue
  3. 218 0
      pages/orders/confirm.vue
  4. 1 1
      pages/orders/index.vue
  5. 17 13
      pages/product/index.vue

+ 6 - 0
pages.json

@@ -273,6 +273,12 @@
       "style": {
         "navigationBarTitleText": "余额红包"
       }
+    },
+    {
+      "path": "pages/orders/confirm",
+      "style": {
+        "navigationBarTitleText": "确认支付"
+      }
     }
   ],
   "globalStyle": {

+ 10 - 9
pages/car/order.vue

@@ -86,7 +86,7 @@
         合计:
         <text class="price_total">¥{{ priceTotal }}</text>
       </view>
-      <button class="to_order" @click="createOrder()" data-eventsync="true">提交预约</button>
+      <button class="to_order" @click="createOrder()" data-eventsync="true">立即支付</button>
     </view>
     <uni-popup ref="popup" type="bottom" class="popup" background-color="#FFFFFF" @touchmove.stop.prevent="() => {}">
       <view class="coupon_list">
@@ -363,7 +363,7 @@ export default {
       }
       if (productList.length <= 0) {
         uni.showToast({
-          title: "未选择可预约的产品",
+          title: "未选择可购买的产品",
           icon: "none",
         });
         return;
@@ -410,15 +410,16 @@ export default {
         .then((re) => {
           // 判断结果
           if (re.code == "success") {
-            // 跳转到报单完成页面
-            uni.redirectTo({
-              url: `/pages/orders/completion?params=${encodedArray}`,
-            });
+            // 跳转到支付确认页面
+            let orderInfo = re.data;
+            orderInfo = JSON.stringify(orderInfo);
+            let params = encodeURIComponent(orderInfo);
+            uni.navigateTo({ url: `/pages/orders/confirm?params=${params}` });
             return;
           } else {
-			  uni.showModal({
-				title: re.msg,
-				showCancel: false,
+            uni.showModal({
+            title: re.msg,
+            showCancel: false,
 			  });
             
           }

+ 218 - 0
pages/orders/confirm.vue

@@ -0,0 +1,218 @@
+<template>
+  <view class="whole">
+    <view class="pay">
+      <view class="header">
+        <div>
+          <view class="pay">支付金额</view>
+          <view class="payNum">
+            <span style="font-size: 34rpx;">¥</span>{{price}}
+          </view>
+        </div>
+      </view>
+      <view class="listPay">
+        <uni-icons type="weixin" size="60rpx" color="#00aa00"></uni-icons>
+        <view class="text">
+          <view class="wx">微信支付</view>
+          <view class="subWx">推荐使用微信支付</view>
+        </view>
+        <view class="btn">
+          <label class="radio">
+            <radio value="1" :checked="boolWx"
+                   color="#FFCC33" style="transform:scale(0.7)"
+                   @click="changePayType(1)" />
+          </label>
+        </view>
+      </view>
+<!--      <view class="listPay">
+        <uni-icons type="weibo" size="60rpx" color="#ff5500"></uni-icons>
+        <view class="text">
+          <view class="wx">线下支付(到付)</view>
+        </view>
+        <view class="btn">
+          <label class="radio">
+            <radio value="2" :checked="boolWb"
+                   color="#FFCC33" style="transform:scale(0.7)"
+                   @click="changePayType(3)" />
+          </label>
+        </view>
+      </view>-->
+      <view class="bootom">
+        <button type="warn" style="color: #fff;" @click="confirm">确认支付</button>
+      </view>
+    </view>
+
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      boolWx: true,
+      boolWb: false,
+      payType: 1, //支付类型
+      price: 0, //支付金额
+      orderNo: "", //订单号
+      parentOrderNo: "", //父订单号
+      submiting: false//控制再次确认支付的弹出框
+    }
+  },
+  onLoad(options) {
+    //接受参数
+    let orderInfo =  options.params;
+    if( orderInfo ){
+      //解密参数
+      orderInfo = decodeURIComponent(orderInfo);
+      //转成js数组对象
+      orderInfo	=  JSON.parse(orderInfo);
+    }
+    this.price = orderInfo.pay_total
+    if (orderInfo.order_id) {
+      this.orderNo = orderInfo.order_id
+    } else {
+      this.parentOrderNo = orderInfo.snowflake_id
+    }
+  },
+  methods: {
+    // 选择支付方式
+    changePayType(type) {
+      if(1==type){
+        this.boolWx=true;
+        this.boolWb=false;
+      }else{
+        this.boolWx=false;
+        this.boolWb=true;
+      }
+      this.payType = type
+      console.log(this.payType,"this.payType");
+    },
+    // 确认支付
+    confirm() {
+      const that = this;
+      //微信支付
+      if(1===that.payType){
+        that.submiting = true;
+        this.pay();
+      }
+    },
+    //调起微信支付
+    pay(){
+      uni.login({
+        provider: 'weixin',
+        success: (loginRes) => {
+          // 登录成功,获取用户code
+          const { code } = loginRes;
+          // 微信支付下单
+          this.$http.request('api/wechat_pay/pay',{code:code,order_id:this.orderNo},'post').then((e)=>{
+            const price = this.price
+            // 成功的话
+            if( e.code == 'success'){
+              //获取openid
+              // 授权成功以后,调用登录
+              //调用微信官方支付接口弹出付款界面,输入密码扣款
+              wx.requestPayment({
+                timeStamp: e.data.timeStamp,  //时间戳
+                nonceStr:  e.data.nonceStr,   //随机字符串
+                package:   e.data.package,    //prepay_id
+                signType:  e.data.signType,   //签名算法MD5
+                paySign:   e.data.paySign,    //签名
+                success:function (res) {
+                  if (res.errMsg == "requestPayment:ok"){
+                    console.log('支付成功3', price)
+                    uni.navigateTo({url:`/pages/orders/completion?price=${price}`});
+                  }else{
+                    console.log('支付失败')
+                    uni.showToast({
+                      title: '支付失败',
+                      icon: 'none'
+                    });
+                  }
+                },
+                fail:function (res) {
+                  console.log('支付失败', res)
+                  uni.showToast({
+                    title: '支付失败',
+                    icon: 'none'
+                  });
+                }
+              })
+
+            }else{
+              console.log('支付失败2', e)
+              uni.showToast({
+                title: '支付失败',
+                icon: 'none'
+              });
+            }
+          });
+        },
+        fail: (err) => {
+          console.log('uni.login 接口调用失败,无法获取openid', err);
+          uni.showToast({
+            title: '支付失败',
+            icon: 'none'
+          });
+        }
+      });
+    },
+  }
+}
+</script>
+
+<style lang="scss">
+.whole {
+  display: flex;
+  justify-content: center;
+
+  .header {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    text-align: center;
+    flex-wrap: wrap;
+    height: 300rpx;
+
+    .pay {
+      width: 100%;
+      color: #717171;
+    }
+
+    .payNum {
+      width: 100%;
+      font-size: 44rpx;
+      margin: 10rpx 0px 20rpx;
+    }
+  }
+
+  .pay {
+    width: 100%;
+
+    .listPay {
+      height: 130rpx;
+      display: flex;
+      align-items: center;
+
+      .uni-icons {
+        margin-left: 20rpx;
+      }
+
+      .text {
+        width: 40%;
+        margin: 0px 20rpx 0px;
+      }
+
+      .btn {
+        width: 40%;
+        text-align: right;
+      }
+    }
+
+    .bootom {
+      width: 90%;
+      margin: auto;
+      margin-top: 20rpx;
+    }
+  }
+
+}
+</style>

+ 1 - 1
pages/orders/index.vue

@@ -2,7 +2,7 @@
   <view>
     <view class="order_status_list">
       <view class="order_status_item" :class="requestParam.status == 0 ? 'active' : ''" @click="setStatus(0)"> 全部 </view>
-      <view class="order_status_item" :class="requestParam.status == 1 ? 'active' : ''" @click="setStatus(1)"> 待跟进 </view>
+      <view class="order_status_item" :class="requestParam.status == 1 ? 'active' : ''" @click="setStatus(1)"> 待付款 </view>
       <view class="order_status_item" :class="requestParam.status == 4 ? 'active' : ''" @click="setStatus(4)"> 已取消 </view>
       <view class="order_status_item" :class="requestParam.status == 8 ? 'active' : ''" @click="setStatus(8)"> 已完成 </view>
     </view>

+ 17 - 13
pages/product/index.vue

@@ -78,7 +78,7 @@
         <image src="https://kailin-mp.oss-cn-shenzhen.aliyuncs.com/static/icon/car.png" class="car_icon"></image>
       </navigator>
       <button class="show_order" data-eventsync="true" @click="showSpecPopup(3)">{{ this.productInfo.regiment_title }}专享/{{ this.productInfo.regiment_price }}</button>
-      <button class="show_car" data-eventsync="true" @click="showSpecPopup(1)">单独预约/{{ this.productInfo.price }}</button>
+      <button class="show_car" data-eventsync="true" @click="showSpecPopup(1)">单独购买/{{ this.productInfo.price }}</button>
     </view>
     <view class="order_car" v-else-if="productInfo.regiment_type === 1">
       <navigator url="/pages/car/index" open-type="switchTab" class="to_car">
@@ -101,7 +101,7 @@
       <navigator url="/pages/car/index" open-type="switchTab" class="to_car">
         <image src="https://kailin-mp.oss-cn-shenzhen.aliyuncs.com/static/icon/car.png" class="car_icon"></image>
       </navigator>
-      <button class="show_order" v-if="!productInfo.hide_orderbtn" data-eventsync="true" @click="showSpecPopup(1)">立即预约</button>
+      <button class="show_order" v-if="!productInfo.hide_orderbtn" data-eventsync="true" @click="showSpecPopup(1)">立即购买</button>
       <button :class="productInfo.hide_orderbtn?'show_car hide_orderbtn ':'show_car'"  data-eventsync="true" @click="showSpecPopup(2)">加入购物车</button>
     </view>
     <view class="to_bottom"> --- 到底了 --- </view>
@@ -170,10 +170,10 @@
         </view>
         <view class="order_price" v-if="specBtnType == 1 || specBtnType == 3">合计: ¥{{ priceTotal }}</view>
         <view class="order_btn">
-          <button class="to_order" @click="createOrder()" v-if="specBtnType == 1" data-eventsync="true">预约</button>
+          <button class="to_order" @click="createOrder()" v-if="specBtnType == 1" data-eventsync="true">购买</button>
           <button class="to_car" @click="createCart()" v-if="specBtnType == 2" data-eventsync="true">加入购物车</button>
-          <button class="to_order" @click="createOrder()" v-if="specBtnType == 3" data-eventsync="true">拼团预约</button>
-          <button class="to_order" @click="createOrder()" v-if="specBtnType == 4" data-eventsync="true">{{ productInfo.regiment_title }}预约</button>
+          <button class="to_order" @click="createOrder()" v-if="specBtnType == 3" data-eventsync="true">拼团购买</button>
+          <button class="to_order" @click="createOrder()" v-if="specBtnType == 4" data-eventsync="true">{{ productInfo.regiment_title }}购买</button>
         </view>
       </view>
     </uni-popup>
@@ -687,10 +687,12 @@ export default {
               this.productInfo.stock = this.productInfo.stock - this.quantity;
               // 关闭弹窗
               this.$refs.specPopup.close();
-              // 跳转到报单完成页面
-              uni.navigateTo({
-                url: `/pages/orders/completion?params=${encodedArray}`,
-              });
+              //订单详情
+              let orderInfo = re.data;
+              orderInfo = JSON.stringify(orderInfo)
+              let params = encodeURIComponent(orderInfo);
+              // 跳转到确认支付页面
+              uni.navigateTo({url:`/pages/orders/confirm?params=${params}`});
             } else {
               uni.showModal({
                 title: re.msg,
@@ -717,10 +719,12 @@ export default {
               this.productInfo.stock = this.productInfo.stock - this.quantity;
               // 关闭弹窗
               this.$refs.specPopup.close();
-              // 跳转到报单完成页面
-              uni.navigateTo({
-                url: `/pages/orders/completion?params=${encodedArray}`,
-              });
+              //订单详情
+              let orderInfo = re.data;
+              orderInfo = JSON.stringify(orderInfo)
+              let params = encodeURIComponent(orderInfo);
+              // 跳转到确认支付页面
+              uni.navigateTo({url:`/pages/orders/confirm?params=${params}`});
             } else {
               uni.showModal({
                 title: re.msg,