微信小程序下订单支付代码实现

微信小程序下订单支付代码实现目录支付流程具体实现一、前端调用登录获取code二、服务端接收code,服务端调用微信api获取openId三、前端点击去支付时四、服务端请求微信统一下单接口五、前端获取到prePay_id调起支付六、注意支付流程点击去结算时,,前端判断是否登录【未登录跳转到登录页】,登录发送code到服务端,服务端使用code发送请求去获取openId;并返回userId/openId存储在storage;点击去支付时,前端发送请求【订单详细,openId】,服务器用openId去统一下单,下单成功后,获

大家好,又见面了,我是你们的朋友全栈君。

支付流程

  • 点击去结算时,,前端判断是否登录【未登录跳转到登录页】,登录发送code到服务端,服务端使用code发送请求去获取openId;并返回userId/openId存储在storage;

  • 点击去支付时,前端发送请求【订单详细,openId】,服务器用openId去统一下单,下单成功后,获取prePay_id,返回前端

  • 前端拿到 prePay_id 调起支付

在这里插入图片描述

具体实现

一、前端调用登录获取code

wx.login({ 
   
    success: function(res){ 
   
        if(res.code){ 
   
            // 发起请求
            wx.request({ 
   
                url: 'http://test.com/login',
                data: { 
   
                    code: res.code
                },
                success(result) { 
   
                    console.log(result.openId)
                    wx.setStorage('openId', result.openId)
                }
            })
        } else { 
   
            // 登录失败
        }
    }
})

二、服务端接收code,服务端调用微信api获取openId

文档 – auth.code2Session

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

三、前端点击去支付时

前端点击去支付时,提交【openId,订单明细】到服务端进行下单

// 提交订单
commitOrder() { 
   
        let that = this
        if (!this.isLogin) { 
   
          this.toLogin()
        } else if (!this.currentAddress.addressId) { 
   
          wx.showToast({ 
   
            title: '请先选择地址',
            icon: 'none',
            duration: 1500,
            success() { 
   
              // 选择地址
            }
          })
        } else if(this.isLogin && this.currentAddress.addressId) 
          let details = [];
          (this.shopCartList).map(g => { 
   
            details.push({ 
   
              goodsId: g.goodsId,
              goodsNum: g.cartGoodNum,
              goodsPrice: g.goodsPrice
            })
          })
          let openId = wx.getStorageSync('openId')
          Api.creatOrder({ 
   
            query: { 
   
              addressId: this.currentAddress.addressId,
              openId: openId,
              appId: '',
              details: details,
              goodsMoney: this.totalMoney,
              orderNote: this.orderNote
            }
          }).then(res => { 
   
            if (res.data.code == '0') { 
   
              this.toPay({ 
   
                timeStamp: res.data.data.timeStamp.toString(),
                nonceStr: res.data.data.nonceStr,
                package: res.data.data.package,
                signType: res.data.data.signType,
                paySign: res.data.data.sign,
                orderId: res.data.data.orderId,
              })
            }
          })
        } else { 
   }
      },

四、服务端请求微信统一下单接口

服务端请求微信统一下单接口,下单成功获取到prePay_id值,返回前端

文档-https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1

商户在小程序中先调用该接口(https://api.mch.weixin.qq.com/pay/unifiedorder)在微信支付服务后台生成预支付交易单,返回正确的预支付交易后,前端调起支付。

五、前端获取到prePay_id 调起支付

pay: function (param) { 
   
    wx.requestPayment({ 
   
      timeStamp: param.timeStamp,
      nonceStr: param.nonceStr,
      package: param.package,
      signType: param.signType,
      paySign: param.paySign,
      success: function (res) { 
   
        // success
        console.log(res)
        wx.navigateBack({ 
   
          delta: 1, // 回退前 delta(默认为1) 页面
          success: function (res) { 
   
            console.log(res)
          },
          fail: function () { 
   
            // fail
          },
          complete: function () { 
   
            // complete
            // 不论成功失败都跳转到订单页面,后台去查询支付结果
              wx.switchTab({ 
   
              	url: 'order',
              	success: function (res) { 
   
              }
            })
          }
        })
      }
    })
  }

六、注意

不能通过 wx.requestPayment 的success回调判断支付成功
支付完不点完成不操作不进成功

文档 – 查询订单

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135073.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月5日 下午8:36
下一篇 2022年6月5日 下午8:36


相关推荐

  • 用户头像上传_头像使用

    用户头像上传_头像使用上传头像上传头像-持久层SQL语句的规划将对应文件保存在操作系统上,然后在把这个文件路径给记录,因为记录路径是非常便捷和方便,将来如果要打开这个文件可以依据这个路径去找到这个文件。在数据库中需要保存这个文件的路径即可。将所有的静态资源(图片、文件、其他资源文件)方法某台电脑上,在把这台电脑作为一台单独的服务器使用。对应是一个更新用户avatar字段的sql语句。updatet_usersetavatar=?,modified_user=?,modified=?whereuid=?设

    2025年7月28日
    6
  • 【单调队列】数据结构之单调队列详解

    【单调队列】数据结构之单调队列详解单调队列1.初步认识单调队列是一个数据结构,并不是STL里面的内容。单调队列为何说单调,因为是队列中的元素始终保持着单增或者单减的特性。(注意始终保持这四个字)简单的sort排序就可以让一个序列有序了,为何又多此一举多出来个单调队列实现类似的功能呢?其实单调队列不只是做到了排序,还可以实现一个功能:在每次加入或者删除元素时都保持序列里的元素有序,即队首元素始终是最小值或者最大值,这个功能非常重要,单调队列我们就是使用的这个功能。举个例子:我们依次加入5个元素,分别为5,8,2,4,1那么我们假

    2022年6月25日
    21
  • mysql 用户留存率计算(每日新增DNU,次日留存率,3日留存率,7日留存率)

    mysql 用户留存率计算(每日新增DNU,次日留存率,3日留存率,7日留存率)我是先学习了这位大神留存率的写法 然后我自己完善了一下 阿柯 首先声明一下留存的概念次日留存 1 月 1 日注册的新用户 在 1 月 2 日登陆了 app 即登陆日期 注册日期 1 天 3 日留存 1 月 1 日注册的新用户 在 1 月 3 日登陆了 app 即登陆日期 注册日期 2 天 7 日留存 1 月 1 日注册的新用户 在 1 月 8 日登陆了 app 即登陆日期 注册日期 6 天 但是目前不同公司对留存的定义不太一样 所以以具体的规则为准 这里只是为了方便大家理解 表 user infor 包含 user id 用户

    2026年3月18日
    2
  • Mac激活idea【2021免费激活】

    (Mac激活idea)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月29日
    316
  • faster-rcnn 之 RPN网络的结构解析以及RPN代码详解

    faster-rcnn 之 RPN网络的结构解析以及RPN代码详解【首先】:大家应该要了解卷积神经网络的连接方式,卷积核的维度,反向传播时是如何灵活的插入一层;这里我推荐一份资料,真是写的非常清晰,就是MatConvet的用户手册,这个框架底层借用的是caffe的算法,所以他们的数据结构,网络层的连接方式都是一样的;建议读者看看,很快的;下载链接:点击打开链接【前面5层】:作者RPN网络前面的5层借用的是ZF网络,这个网络的结构图我截个图放在下面

    2022年6月23日
    64
  • 模板模式的使用总结

    模板模式的使用总结模版模式应该是工作中最常用的设计模式之一 直白的讲就是如果的一些处理方式是有一定的模版流程处理的 那么在应用中使用该模式在合适不过了 对于其基本的业务应用 我简单写了以下三个基本的通用模版 业务失败重试机制 业务前置检查流程模版 Thrift 远程调用处理模版 来展示 有问题的可以留言纠正 谢谢 版权声明 本文为 CSDN 博主 张彦峰 ZYF 的原创文章 遵循 CC4 0BY SA 版权协议 转载请附上原文出处链接及本声明

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号