【微信小程序】微信支付

news/2024/7/20 1:28:00 标签: 微信, 小程序

简介

微信的支付方式有以下几种,不同的支付方式适用于不同的支付场景,而本文讲的就是 小程序支付 方式:

说到支付功能就要涉及到金钱交易,必定是有比较严格的规范及流程,如要求小程序必须具备企业性质,必须拥有微信支付商户平台的账号;

PS:申请微信支付商户平台需要一个微信小程序或公众号等,建议按照以下流程进行操作

准备工作

  1. 申请微信小程序账号
    · 申请成功可拿到 AppID小程序 id)和 AppSecret小程序密钥);
    · 申请类型为企业性质,否则无法接入微信支付;
  2. 微信小程序认证
    通过认证的小程序才能接入微信支付和绑定商户平台;
  3. 申请商户平台账号
    · 需要第一步申请的 AppID
    · 申请成功可拿到 MchID(商户 id)和 MchKey(商户密钥);
  4. 微信小程序关联商户号
    微信和商户都认证成功后,在微信后台微信支付菜单中进行关联;
  5. 接入微信支付
    微信后台微信支付菜单中进行接入;

小程序支付流程

简要支付流程如下:

  1. 用户发起支付请求;
  2. 后端调用统一下单接口得到 prepay_id
  3. 把支付所需参数返回前端;
  4. 前端调用支付接口进行支付操作;
  5. 支付结果通知;
  6. 前端根据不同的支付结果给用户不同的提示;

PS:难点在第 2、3、5 步,一定要仔细查看相关接口文档,否则容易出错,接下来我们按照以上 6 个步骤详细讲解在微信小程序中的支付流程

支付前的操作

因为严格意义上来说这不属于支付流程中的步骤,但支付过程中需要用到用户唯一标识 openid,所以建议在用户进入小程序时就进行这一步的操作:

  1. 调用 wx.login() 接口获取 code,并把 code 传到服务器;
  2. 后端服务器拿到 code 后调用 code2Session 接口获取 openidsession_key

建议把openid存入数据库,方便随时获取,下面的步骤也会用到

  1. 后端服务器保好 appid, secret, mch_id, mch_key(这些数据分别在小程序后台和商户平台中获得,我是把它们做成 commonjs 模块并保存在 config/wx.js 文件中以方便调用);

PS:开发者需要自行维护用户登录状态(用户登录状态的维护本文不做展开,请自行查阅相关资料)

小程序端:用户向商户服务器发起支付请求

这步没什么好说的,当用户点击支付按钮时,给我们自己的后端接口发起一个请求,携带必要的参数(如:body, total_fee 等),接口地址需要自行编写,如我的接口地址为 https://api/prepay

  /**
   * 向后端发送打赏请求
   */
  gotoPay: function (event) {
    // console.log(event.currentTarget.dataset.index);
    const totalFee = this.data.nums[event.currentTarget.dataset.index];
    this.setData({
      totalFee: totalFee,
      toSelectNumShow: false,
      paidShow: true
    });
    wx.request({
      url: 'https://api/prepay',
      method: 'post',
      data: {
        body: '打赏', // 商品描述
        total_fee: totalFee // 总金额,单位为元
      },
      header: {
        'content-type': 'application/json'
      },
      success(res) {
        console.log(res);
        if (res.data.code === 1) {
          try {
            console.log(res.data.data);
            // 得到接口返回的数据,向微信发起支付
            const result = wx.requestPayment({
              // 5个必传参数
              timeStamp: res.data.data.timeStamp,
              nonceStr: res.data.data.nonceStr,
              package: res.data.data.packages,
              signType: res.data.data.signType,
              paySign: res.data.data.paySign
            });
            console.log('支付结果:', result);
          } catch (err) {
            console.log(err);
            wx.showToast({
              title: '支付失败'
            });
          }
        } else {
          console.log('支付请求失败!');
          console.log(res);
        }
      },
      fail(msg) {
        console.log(msg);
      }
    });
  },

PS:可能会有小伙伴产生疑惑,为什么不直接通过 wx.requestPayment()
小程序端发起请求而要先请求商户自己的服务器呢?原因很简单,安全性问题,wx.requestPayment() 需要 2 个重要参数 paySignpackage,需要 appid, secret, openid, mch_key 等私密数据,这些私密的数据不应该在前端暴露出来,而是放在自己的服务器中更安全,所以需要向自己的服务器发起这个请求拿到这些参数,下一步才能真正发起支付。


参考文献

微信支付之小程序支付
微信支付之H5支付


http://www.niftyadmin.cn/n/1770052.html

相关文章

sa密码修改记录_在Linux下生成crypt加密密码

当我们用红帽Kickstart脚本或useradd或其他方式写东西的时候,经常会需要用到crypt命令加密生成的密码格式。那么,有没有其他方式可以生成这种格式的密码?事实上,方法有很多1、我们可以用mkpasswd命令:这个命令就是用来…

【微信小程序】下拉刷新与上拉加载

效果 方法 在 <scroll-view> 里设定 bindscrolltoupper 和 bindscrolltolower 实现监听微信小程序下拉和下滑&#xff1b; onPullDownRefresh 和 onReachBottom 方法实现小程序下拉加载和上拉刷新&#xff1b; 代码 方法一 index.wxml <!-- 顶部 关注 | 广场 标签…

python作者 es6_ES6模块化

模块化:js不支持模块化ruby requirepython import在ES6之前&#xff0c;社区制定一套模块规范:Commonjs 主要服务端 nodeJs require(http)AMD requireJs, curlJsCMD seaJsES6出来&#xff0c;同意服务端和客户端模块规范:import {xx} dddMath.pow()Math.abs()import {pow, abs}…

Win10 安装 SQL Server 2008 与使用指南

背景 某喵学校学的是SQL Server 2008 R2&#xff0c;我学的是MySQL 2018&#xff0c;他找我 debug 的时候可能多少有点差别&#xff0c;就下了一个方便实操试试&#xff1b; 昨天他正常建表&#xff0c;设了联合主键之后正常插入数据报错如下&#xff1a;"违反了 PRIMAR…

python数据文件换行输出方法_Python从文件中读取数据的方法步骤

一、读取整个文件内容在读取文件之前&#xff0c;我们先创建一个文本文件resource.txt作为源文件。resource.txtmy name is joker,I am 18 years old,How about you?如何读取文件全部内容&#xff0c;我们编写到reader.py文件中。reader.pywith open(resource.txt) as file_ob…

自然语言处理 | 双向匹配中文分词 Python

理论描述 中文分词是指中文在基本文法上有其特殊性而存在的分词。 算法描述 本文实现双向匹配算法&#xff0c;具体算法描述如下&#xff1a; 正向最大算法 设MaxLen表示最大词长&#xff0c;D为分词词典。 &#xff08;1&#xff09;从待切分语料中按正向取长度为MaxLen的…

python中用于释放类占用资源的方法_python编程(类的释放)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】大多数的脚本语言都是由虚拟机来安排内存释放的。所以&#xff0c;这些语言一本只要申请内存使用&#xff0c;不需要手工去释放它们。那它们是什么时…

【Spring】报错解决方法 [IDEA中java文件出现小黄色的J]

场景 上课的时候打开老师的项目发现项目不可运行&#xff0c;并且文件上标有小黄色的j&#xff0c;如下图所示&#xff1a; 解决方法 可以看到现在界面已经不报错了&#xff0c;运行结果如下&#xff1a;