微信小程序云开发--使用云函数实现微信支付

一. pay/index.js 云函数代码

const config = {
     
  appid: 'XXXXXXXXXXX', //小程序AppId
  envName: 'XXXXXXXX', // 小程序云开发环境ID
  mchid: 'XXXXXXXXX', //商户号
  partnerKey: 'XXXXXXXXXXXXXXXXX', //此处商户密钥
  notify_url: 'https://mp.weixin.qq.com', //这个就这样
  spbill_create_ip: '127.0.0.1'//这个就这样
};

const cloud = require('wx-server-sdk');
cloud.init({
     
  env: config.envName
})
const db = cloud.database();
const TcbRouter = require('tcb-router'); //云函数路由
const rq = require('request');
const tenpay = require('tenpay');//支付核心模块
//添加模块:鼠标右键点击pay云函数-->在外部打开终端-->执行 npm i tenpay -D    -->完成

exports.main = async (event, context) => {
     
  const app = new TcbRouter({
     
        event
  });

  // 查询是否有订单记录
  app.router('selectorder',async(ctx)=>{
     
    const data=await db.collection('orders').where({
     
      openId:event.openId,
      courseId:event.courseId
    }).get()
    ctx.body = data;
 });

 
//  查询用户所有的订单记录
app.router('selectAllOrders',async(ctx)=>{
     
  const data=await db.collection('orders').where({
     
    openId:event.openId,
   }).get()
  ctx.body = data;
});


  // 添加订单记录
  app.router('addorder',async(ctx)=>{
     
     await db.collection('orders').add({
     
       data:{
     
         openId:event.openId,//用户openId
         courseId:event.courseId,//课程_id
         coursePrice:event.coursePrice,//课程价格
         courseTitle:event.courseTitle,//课程标题
         courseClassName:event.courseClassName,//课程分类
         createTime:event.createTime,//生成时间
         timestamp:event.timestamp,//时间戳
         payData:event.payData,//支付信息
       }
     })
  });

  //支付回调
  app.router('topay', async (ctx) => {
     
        const api = tenpay.init(config)
        let result = await api.getPayParams({
     
              //商户订单号,我这里是定义的seriesLessons+用户openID+当前时间戳
              //微信这里限制订单号一次性不能重复,只需要唯一即可
              out_trade_no: 'seriesLessons'+ '' + event.timestamp,     // 空格 '' 不能忘了,字符串最长为32位
              body: event._id,       //商品名称,设置为商品的_id
              total_fee: parseInt(event.price)*1,     //金额,单位为分,注意是数字,不是字符串,不能有小数点。这里应该是要*100的,测试就支付0.01元。
              openid: event.openId //进行支付用户的openid
        });
        ctx.body = {
     result,event};//返回前端结果
  });
  return app.serve();
}

二 . 页面js文件中调用云函数实现支付

 goPay: function () {
     
    let that = this;
    console.log('点击了立即支付')
    var createTime = days(); //支付时间
    var timestamp = (new Date()).getTime(); //时间戳
    // 先查询看是否有这个订单
    wx.cloud.callFunction({
     
      name: 'pay',
      data: {
     
        $url: 'selectorder',
        openId: that.data.openId, //用户openId
        courseId: that.data._id, //课程_id
      },
      success(res) {
     
        console.log(res)
        //如果有这个订单记录,提示已购买
        if (res.result.data.length != 0) {
     
          wx.showToast({
     
            title: '您已经购买过这个课程了,无需重复购买。',
            icon: 'none',
            duration: 4000
          })
          // wx.navigateTo({
     
          //   url: '../boughtCourse/boughtCourse',
          // })
        } else {
     
          //没有订单, 提交订单
          wx.cloud.callFunction({
     
            name: 'pay',
            data: {
     
              $url: 'topay',
              openId: that.data.openId,//用户openId
              _id: that.data._id,//商品的_id
              price: 1, //价格that.data.seriesLessonsData.price
              timestamp: timestamp,
            },
            success(res) {
     
              console.log(res)
              // 订单生成成功,进行支付环节
              var payData = res.result.result;
              //返回的参数含义在微信小程序官方开发文档中有说明
              //调用wx.requestPayment api
              wx.requestPayment({
     
                timeStamp: res.result.result.timeStamp,
                nonceStr: res.result.result.nonceStr,
                package: res.result.result.package,
                signType: 'MD5',
                paySign: res.result.result.paySign,
                success(re) {
     
                  console.log(re)
                  // 付款成功添加订单记录到数据库orders
                  wx.cloud.callFunction({
     
                    name: 'pay',
                    data: {
     
                      $url: 'addorder',
                      openId: that.data.openId, //用户openId
                      courseId: that.data._id, //课程_id
                      coursePrice: that.data.seriesLessonsData.price, //课程价格
                      courseTitle: that.data.seriesLessonsData.coverTitle, //课程标题
                      courseClassName: that.data.seriesLessonsData.className, //课程分类
                      createTime: createTime, //生成时间
                      timestamp: timestamp, //时间戳
                      payData: payData, //支付返回的信息
                    },
                    success(e) {
     
                      console.log(e)
                      wx.showToast({
     
                        title: '支付成功',
                        icon: 'success'
                      })
                    },
                    fail(err) {
     
                      console.log(err)
                      wx.showToast({
     
                        title: '网络波动,请重试',
                        icon: 'none'
                      })
                    }
                  })

                },
                fail(err) {
     
                  console.log(err)
                  wx.showToast({
     
                    title: '网络波动,请重试',
                    icon: 'none'
                  })
                }
              })

            },
            fail(err) {
     
              console.log(err);
              wx.showToast({
     
                title: '网络波动,请重试',
                icon: 'none'
              })
            }
          })

        }
      },
      fail(err) {
     
        console.log(err)
        wx.showToast({
     
          title: '网络波动,请重试',
          icon: 'none'
        })
      }
    })

  },

config数据的获取可以查看 微信小程序云开发–微信支付商户号,商户密钥等的获取

你可能感兴趣的:(微信小程序云开发,小程序)