小程序支付功能

微信小程序支付:

    1. 当小程序启动的时候,调用wx.login获取小程序的code码
    2. 获取到小程序的code码之后,调用获取openid接口,获取到openid
    3. 将获取到的openid以及其他信息保存到本地
    4. 当点击确认支付按钮时调用统一下单接口,将对应的参数发送给后台,其中有一个签名非常重要,使用的md5进行的加密
    5. 当统一下单接口调用成功之后,后台会给我们返回支付所需要的相关信息
    6. 获取到支付相关的信息之后,调用封装的微信支付方法,拉起支付,把对应支付信息传进去就能够完成支付功能

注意:加密以这块我们根据后台的要求,只加密了openid uid 以及salt等属性以及属性值,用的是md5

微信小程序的支付功能:

支付的准备工作:

  注册小程序的账号 (不能是个人号,个人号无法认证,并且无法开通微信支付)
  进行小程序的认证 (300/年)
  开通微信支付  (填写支付所需要的相关信息)

前端业务:

  1. 在小程序启动的时候,调用wx.login方法获取凭证(凭证也就是code码)
  2. 调用获取openid接口,通过传递code码获取后台给返回的openid以及相关信息
  3. 将openid和相关信息保存到本地
  4. 当点击确认支付按钮的时候,调用统一下单接口
    4.1 获取保存到本地的openid以及相关信息
    4.2 获取购物车的数据,并且将获取到的购物车的数据,转化为字符串(使用JSON.stringify()方法)
    4.3 实现签名
      4.3.1 和后端确定加密的方式(md5)以及所要加密的字段 
      4.3.2 创建一个sign方法,在这个方法里面接收我们要加密的字段
        - 在sign方法里面,创建一个数组
        - 使用for in语句遍历加密的字段
        - 将遍历的字段添加数组里面
        - 对数组使用sort方式进行排序
        - 初始化str变量,用来保存加密的字段属性和字段值的拼接
        - 在使用for语句遍历保存加密字段属性的数组
        - 引入md5模块
        - 使用md5进行加密
        - 将加密之后的内容return 返回sign这个方法
    4.4 将统一下单接口所需要参数一一进行传递
  5. 当统一下单接口调用成功之后,能够获取到支付所需要的相关信息
  6. 调用小程序内置的支付api,将支付api所需要的参数进行传递,如果正确的话,则拉起支付
  7. 进行支付
  8.支付成功之后,清除购物车的数据,并且跳转到支付成功的页面    

  代码: 
    代码一共分为2部分:
      获取code码以及openid的相关信息:

      -------------------------------------------------------------------------------
        //1. 调用wx.login方法,获取code码
        wx.login({
          success : async (res)=>{
            //2. 获取code码
            const code = res.code;
            //3. 调用获取openid的接口
            const result = await payApi.getOpenId(code);
            //4. 判断 如果成功 则标openid及其他相关的信息保存到畚斗, 失败 则进行一个错误提示
            if(result.data.success){
              const userinfo = result.data.userinfo;
              wx.setStorageSync('userinfo', userinfo)
            }else{
              wx.showToast({
                title: '获取openId失败',
              })
            }
          },
          fail : ()=>{
            wx.showToast({
              title: '调用wx.login方法失败',
            })
          }
        })
      }
    ---------------------------------------------------------------------------------

     
    点击确认支付按钮要执行的代码:
       /*支付方法*/
        async doPay() {
          //显示加载中
          wx.showLoading();

          //获取商品的所用数据
          const carts = wx.getStorageSync('carts');
          // console.log(carts)

          //获取本地存储的openid的相关信息
          const userinfo = wx.getStorageSync('userinfo');
          // console.log(userinfo)

          //调用签名方法
          const signData = sign({
            openid: userinfo.openid,
            salt: userinfo.salt,
            uid: userinfo._id
          });



          //调用统一下单接口
          const result = await payApi.unifiedOrder({
            openid: userinfo.openid,
            uid: userinfo._id,
            sign: signData,
            total_price: this.data.allPrice,
            total_num: this.data.allNum,
            derate_price: 0,
            real_price: this.data.allPrice,
            order: JSON.stringify(carts)
          })

          //做一个错误的处理
          if (result.data.success) {
            console.log(result.data.result)
            const data = JSON.parse(result.data.result);
            this.wxPay(data)
            wx.hideLoading();
          } else {
            wx.hideLoading();
            wx.showToast({
              title: '统一下单失败',
            })
          }

        },

        /*拉起支付的方法*/
        wxPay(data) {
          console.log(data)
          wx.requestPayment({
            timeStamp: data.timeStamp,
            nonceStr: data.nonceStr,
            package: data.package,
            signType: 'MD5',
            paySign: data.paySign,
            success(res) {
              console.log(res)
            },
            fail(res) {}
          })
        }


       
    签名加密的代码:
    function sign(userinfo){
      const arr = [];
      for(var i in userinfo){
        arr.push(i)
      };
      arr.sort();
      
      let str = "";
      for(var i=0;i<arr.length;i++){
        str += arr[i] + userinfo[arr[i]];
      }
    
      console.log(md5(str));
      return md5(str);
    
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容