详解微信小程序支付流程

2023-11-12

小程序微信支付图

在这里插入图片描述

微信小程序的商户系统一般是以接口的形式开发的,小程序通过调用与后端约定好的接口进行参数的传递以及数据的接收。在小程序支付这块,还需要跟微信服务器进行交互。过程大致是这样的:

一. 小程序调用登录接口获取code,传递给商户服务器用来获取用户的openID

我们知道在微信平台中,同一个公众号的openID都是不同的,它是用户身份识别的id,也就是说,我们通过openID来区分不同的用户,这个有微信开发基础的应该都很熟悉。为了知道谁在支付,我们需要先获取当前用户的openid,那么openID应该怎么获取呢?看下图:
在这里插入图片描述

  • 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

  • 开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。

这个业务流程大致就是首先你得先在小程序的代码中调用wx.login()来向微信获取到code,拿到了之后把code通过request传给商户服务器,再由商户服务器通过骚操作来跟微信服务器要session_key和openID。

在这里插入图片描述

调用这几行代码就可以向跟微信服务器要code,并且将code传到商户服务器中,记住这里最好使用post发送请求,安全性的东西我应该不用讲了,因为避免其他人滥用接口,于是我们使用token来进行验证。并将商户服务器返回的token存在小程序缓存中。

那么服务器端应该怎么做呢?

我门通过小程序提交的code,和小程序的APPID以及APPSECRET和拼接下列的url,并用curl进行get请求。

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

二. token的生成以及缓存

根据一个用户表将id和openid联系起来,对应openID的id则是用户的uid,我们可以这么封装
在这里插入图片描述

缓存的方式我们可以选择redis,memcache, 文件缓存等等,采用键值对(key-value)的方式进行存储,记得设置好过期时间。这里的key我们用token来赋值,token可以通过这样的方式进行生成:

在这里插入图片描述

这种算法基本保障了token的唯一性。因为值是我们获取到的openID和session_key所在的数组,所以需要将数组转成json才能存进去。以后的代码当我们需要openID或者uid等时可以直接通过取缓存的方式来取。

三,调用统一下单接口,获取prepay_id,再次签名

在你写完了订单操作后,如何让用户支付订单费用呢?这里就是重点了,我一步一步来说:

1.下载微信JS-SDK:
(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)

解压打开进入lib文件夹中:
在这里插入图片描述

我们需要将lib中的文件放到我们的框架中,例如我使用的是tp5,就放到extend下,最好是在extend下建个子文件夹。其中WxPay.Api.php是入口,WxPay.Config.php是配置文件。下好后需要改动一些地方。在WxPay.Config.php中修改下列的东西改成你的。

在这里插入图片描述

然后在WxPay.Api.php中require一下WxPay.Notify.php,如图:
在这里插入图片描述
在某个控制器或者服务层的代码先是用Loader::import()引入WxPay.Api.php,相当于五个都引入了。

2.调用统一下单api

这里要啰嗦的是,如何你写的是有关商品买卖的小程序,那么需要在支付前再次检测一下库存量,因为用户下完订单后不一定马上就会付款,如果在付款的期间库存量没了便会出现问题。业务逻辑我就不说太多了,这取决于你写代码的严谨性。

在我们引入了上面那个文件后,先实例化这个类WxPayUnifiedOrder,把需要的参数通过调用对应的方法传入。

伪代码如下:
在这里插入图片描述

其中第一个是你的订单号,订单号的生成方法可以自定义,第二个是死参数,第三个是总订单价格,第四个是名称如果是中文的话要转码,第四个是openID,这个这时候就可以从缓存中取了。最后一个是支付回调,就是支付成功后微信要访问的地址。必须是公网能访问的,或者你使用ngrok来进行反向代理转发本地的服务器。

参数设置好了之后,就直接调用SDK的方法了

$ wxOrder = \ WxPayApi::unifiedOrder($wxOrderData);

如果参数没有错误的话,返回的数据中会含有prepay_id,这个是我们需要的参数。

3.再次签名

在这里插入图片描述

再次签名完成后,就把五个参数返回给小程序。

四,小程序获取五个参数后,鉴权调起支付

伪代码(小程序端)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果一切正常的话,在微信开发者工具就会显示这个二维码。
在这里插入图片描述

如果在真机上测试的话,就会直接弹出支付页面。小程序会直接显示支付成功或者失败的页面,然后微信服务器就会开始访问我们之前设置的支付回调地址来推送支付结果,根据结果可以来更新订单的状态。这里我就不写业务逻辑了,大概讲一下就好。

五,支付回调

在这里插入图片描述

也就是说你需要写个新类继承WxPayNotify,再重写NotifyProcess方法,根据检查$ data[‘result_code’]是否为SUCCESS可以判断成功与否,成功的话你可以根据业务需求写业务逻辑,最后return true 即可。这时候会想,我重写了这个方法后微信怎么调用呢,其实这里微信不是要直接调用这个方法,你应该在微信支付回调的方法中实例化这个新类,然后根据获得的对象去调用Handle()方法。$ obj = new 新类(),$ obj->Handle()。

转载于 https://blog.csdn.net/qq_38378384/article/details/80882980?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160061653819724839810683%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160061653819724839810683&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-2-80882980.pc_ecpm_v3_pc_rank_v3&utm_term=详解微信小程序支付流程&spm=1018.2118.3001.4187

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解微信小程序支付流程 的相关文章

随机推荐

  • 小例子:实现互斥锁,自旋锁

    小例子实现互斥锁 自旋锁 在多线程并发访问临界区时 使用上面三种操作 可以实现并发访问 首先创建是个线程 for i 0 i
  • 开源主流分布式文件系统简单介绍

    文章目录 一 分布式文件系统简介 1 特点 2 主要指标及分类对比 3 AFS与NFS 二 开源分布式文件系统 1 GFS 1 GFS与NFS AFS的区别 2 BigTable 3 Chubby 4 特点1 2 HDFS 1 HDFS与C
  • 多线程与多进程(5)

    概念上 一 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动 是系统进行资源分配和调度的一个独立单位 二 线程是进程的一个实体 是CPU调度和分派的基本单位 它是比进程更小的能独立运行的基本单位 线程自己基本上不拥有系统资源 只
  • AlexNet网络详解及各层作用

    AlexNet 图中所给关于卷积核的尺寸来自于Alex在2012年发表的经典文章 Alex在2012年提出的alexnet网络结构模型引爆了神经网络的应用热潮 并赢得了2012届图像识别大赛的冠军 使得CNN成为在图像分类上的核心算法模型
  • CSDN----Markdown:---文字颜色、大小和字体设置

    Markdown是一种轻量级标记语言 创始人为约翰 格鲁伯 英语 John Gruber 它允许人们使用易读易写的纯文本格式编写文档 然后转换成有效的XHTML 或者HTML 文档 这种语言吸收了很多在电子邮件中已有的纯文本标记的特性 一
  • [BuildRelease]C++代码静态分析工具splint

    转自 http www cnblogs com bangerlee archive 2011 09 07 2166593 html引言 最近在项目中使用了静态程序分析工具PC Lint 体会到它在项目实施中带给开发人员的方便 PC Lint
  • QQ-AR实物识别!香蕉扫一扫,解救小黄人?

    神偷奶爸3 已于7月7日正式登录国内各大院线 奶爸格鲁继续率领小黄人们贱萌作死 早先 神偷奶爸3 创造了北美影史最高4529馆开画记录 同时首周报收7541万美元 国内上映前海外票房累积1 421亿美元 毫无意外地登顶北美票房榜首座 根据猫
  • 【多目标跟踪论文阅读笔记——2021年CVPR论文粗读记录】

    阅读心得 多目标跟踪经典论文 2021CVPR论文粗读记录 前言 一 学习策略类 QDTrack 二 Temporal Spatial 类 TADAM Alpha Refine TraDes CorrTracker 三 Motion mod
  • 长大后会发现,学习其实就是因为自己想知道

    简单总结 01 习惯 看不懂的名词 第一时间google 02 注释 注释一些思路 把注释嵌入到工作和生活 像现在的记录 03 随记 关注身边的细节 及时回应别人 明白自己想说什么 选择好时机去说 04 务实方法 ETC Easier to
  • IDEA 设置为护眼的豆沙绿

    代码区域设置成护眼色 先打开 IDEA 的设置界面 然后按照下图按顺序店了设置就可以了 这个时候 可以看到 只有代码区域别成了护眼色 其他地方还是白的刺眼 我们来一个一个的解决掉 左侧的文件页修改为护眼色 还是先打开设置 然后如下图所示 先
  • 非对称加密工作原理

    非对称加密 非对称加密使用两个密钥 一个是public key 一个是private key 通过某个算法 使得数据的加密和解密使用不同的密钥 因为用的是不同的密钥 所以称为非对称加密 非对称加密最著名的是RSA算法 这是以其发明者Rive
  • java static变量_什么是静态(static)?什么是静态方法,静态变量,静态块和静态类...

    static是Java中的一个关键字 我们不能声明普通外层类或者包为静态的 static用于下面四种情况 静态变量 我们可以将类级别的变量声明为static 静态变量是属于类的 而不是属于类创建的对象或实例 因为静态变量被类的所有实例共用
  • Excel解决CSV文件中的乱码

    背景 对于CSV文件中的乱码问题 大概率是编码的问题 可以基于Excel进行编码转换 或将文本进行编码转化 解决办法 打开Excel应用 点击文件 新建文件 点击文件 选择导入 导入具体的CSV文件 选择CSV文件 点击完成即可 然后就可以
  • 麻雀算法(SSA)优化长短期记忆神经网络的数据分类预测,SSA-LSTM分类预测,多输入单输出模型

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 读取数据 res xlsread 数据集 xlsx num res size res 1 样本数 每一行 是一
  • vue + css气泡图动态气泡图

    div ul class bubbleUl li class bubbleLi div class textBubble span item value span div div class topDiv div style width 1
  • 从一个类调用另一个类的方法或属性

    package 练习 class yu String m 人工小智能 public void shout1 System out println 我是 m 今年18岁 同类中直接调用了m public void shout2 yu p ne
  • grep指令详解

    shell grep指令详解 grep 参数 e 使用PATTERN作为模式 这可以用于指定多个搜索模式 或保护以连字符 开头的图案 指定字符串做为查找文件内容的样式 f 指定规则文件 其内容含有一个或多个规则样式 让grep查找符合规则条
  • 【SQL注入】堆叠注入

    目录 一 简介 概述 原理 优势 前提 防护 二 分析堆叠注入 使用MYSQL 第一步 使用堆叠查询构造多条语句 第二步 查看语句是否成功执行 第三步 删除test 再查询 第四步 执行其它查询语句 一 简介 概述 顾名思义 就是多条语句堆
  • 【电脑使用】chm文件打开显示确保Web地址 //ieframe.dll/dnserrordiagoff.htm#正确

    问题描述 最近找到一个之前的一个chm文件 打开的时候内容是空白的 同时报错 确保Web地址 ieframe dll dnserrordiagoff htm 正确 如下图所示 参考链接 解决方案 根据文章中提示的方法 找到了原因所在 chm
  • 详解微信小程序支付流程

    小程序微信支付图 微信小程序的商户系统一般是以接口的形式开发的 小程序通过调用与后端约定好的接口进行参数的传递以及数据的接收 在小程序支付这块 还需要跟微信服务器进行交互 过程大致是这样的 一 小程序调用登录接口获取code 传递给商户服务