在我们的服务器中完成订单生成后,下一步当然是付款。 关于微信小程序中的支付,如果我们以个人开发者的身份申请小程序,那么我们就不能使用微信支付功能,只能以企业的身份申请微信支付功能。 毕竟这是一个金融活动,应该有一定的资质才可以申请。要完成这样的支付功能,我们首先要申请微信支付功能。 申请微信支付资质后,我们可以从微信支付平台获取我们的商户号和商户密码。 这两个就是我们完成支付所需要的两件事。 的重要组成部分
首先我们回顾一下微信订单支付的流程图:
我们先来实现调用微信预付费接口的服务端。 首先我们可以在微信支付的官方文档中找到相关内容:/wiki/doc/api/wxa/.php?=9_1,
我们可以发现调用这个预付费接口需要一系列的参数。 我们可以先只关注必填字段,包括小程序、用户、通过签名算法得到的签名值、随机字符串等。乍一看,我们可能会感到困惑,但实际上我们不需要详细讲一下。 密切关注每个参数。 微信给我们提供了SDK,帮我们封装了大部分参数。 如果您不想使用 SDK,也没关系。 您必须检查每个参数,然后组合它们以向服务器发送请求。 当然,如果没有特殊情况,我个人推荐使用SDK。 它将帮助我们生成签名和随机字符串。 等参数,我们只需要传入一些必要的SDK的用户相关参数即可(如小程序ID、商户号等与用户无关的参数)。 哪些参数与用户相关? 主要有两个:
1.如何获得这个? 我们可以使用缓存中的来交换缓存。
2、用户订单的订单号。 要获取这个订单号,需要在客户端接收能够代表用户订单的信息:数据表中有两个东西能够代表用户的订单,一是订单号,二是主键id表中的顺序。 我们可以选择使用传递给我们的 API 的主键 id。
这个SDK在哪里下载...如果在小程序的支付文档中找不到...小程序的支付文档中没有提供这个。 仅提供IOS版本和微信小程序客户端版本。 SDK,我们需要的SDK可以在公众号支付中找到:
选择下载的PHP版本的压缩包,在项目目录下的目录下新建一个文件目录,将SDK压缩包解压进去:
准备好SDK后,我们就可以开始调用预订订单接口的实现了。 我们先来看看我们的控制器:
我们的支付和点餐应该只是针对普通用户,所以在调用这个控制器方法之前,我们需要使用一个前置方法来检查一下,检查缓存中对应的。 用户权限是否为普通用户权限。
前面提到,我们需要两个参数,一个是用户的,这个是我们可以换取客户端携带的的。 另外一个是订单号,可以代表我们表中的订单。 为了方便起见,我们选择主键 id 作为参数。 该参数需要客户端传入。 我们还需要对客户端传入的订单id做一个简单的测试,看是否为正整数。
对于支付这样的比较流程,我们还是选择在层中实现。 我们在文件夹中创建一个新的 Pay.php。
我们定义两个成员变量来分别存储订单id和订单号:
我们在初始化这个支付类的时候,需要初始化相关的成员变量:
我们接下来要做什么? 是调用微信的相关接口吗? 不是的,我们在前面的设计过程中提到,在我们付款之前,我们还需要进行库存检查,因为我们不一定在生成订单后立即付款,而这期间库存仍然会发生变化。 ,所以我们需要再次检查库存。 此外,我们还需要考虑几点:
1、订单号是否存在?
2、订单所属的用户ID和当前支付的用户ID是否相同?
3.订单已经付款了吗?
有很多点需要验证。 我们应该从哪一点开始呢? 一般来说,我们有两个原则,一是先验证出现概率大的,二是先验证消耗小的数据库。 我们选择先检查订单是否存在、用户ID和付款状态,然后检查库存(订单实际上并不唯一)。
我们在表中用a来表示订单的支付状态。 为了方便阅读,我们使用一个枚举值:
我们可以写一个方法来验证上面提到的123点:
验证完这三点之后,我们取出订单号,方便我们后续的操作,然后给我们调用的main方法返回true。 接下来我们需要对我们的库存进行一个测试,但是我们在生成订单的时候就已经设计好了这个库存测试,我们可以复用它。 不过,方法()中需要使用到两个成员变量,分别是订单商品信息列表和数据库中对应商品的信息列表。 我们可以声明一个新方法并将订单 ID 接收到表中以查找订单产品。 信息列表,然后利用订单商品信息在数据库中查找实际的商品信息,可以复用()方法:
然后我们根据返回数组中的‘pass’值来判断我们的库存是否充足。 当库存充足的时候,我们就开始调用微信的预付款接口。 首先我们会使用微信提供的SDK。 当我们阅读SDK时,我们会发现该SDK与我们之前调用的一些内部接口有所不同。 是的,它们之间的主要区别之一是微信提供的 SDK 类没有命名空间,所以我们不再像以前那样使用 use 来导入这些类。 那么我们如何使用这些类呢? 我们知道,在原生PHP中,当我们想要在一个类中使用另一个类时,我们需要一个另一个类所在的文件,然后才能使用这个文件中的类,但是在TP5中我们经常使用一个而不是使用。 这是因为TP5内部遵循PSR、PSR-4和PSR-0的自动加载规范。 正是因为遵守了这样的规范,我们才不需要在TP5中显示位置。 某个 PHP 文件可以使用其命名空间。 只要我们遵循TP5定义的一系列目录和目录命名约定,它就可以自动加载PHP文件。 但很多SDK根本不提供命名空间,而是使用原生PHP类来编写。 那么我们如何使用它们呢? 其实介绍的解决方案有很多,这里我们以其中一种为例。 我们手动加载这些类。 首先我们记下SDK文件放置的位置,然后使用\中的方法:
只要我们不修改常量,所有放置在文件夹中的带有命名空间的类都可以被TP5自动加载。但是当没有命名空间或者某些情况下我们不需要使用自动加载时,我们可以使用中的方法\加载
这样我们的SDK就可以引入了。 这里我们只需要引入.Api.php,因为其他的已经在.Api.php中引入了。 .Api.php中为我们定义了统一的下单方法。 该方法需要一个参数数组。 .Data.php为我们提供了一个初始化方法,可以为我们完成签名和随机字符串。 参数,在使用.Data.php中的生成方法之前,我们需要在..php中配置相关参数:
配置完成后,我们就可以使用.Data.php中的类了:
使用该类并调用其方法可以生成我们调用预订接口所需的数组:
(需要设置接收微信服务器异步返回的支付结果)
生成这个参数数组后,我们就可以向服务器发起调用了。 我们使用.Api.php中统一的方法来发起调用:
(该方法的实际场景还有进一步的步骤,暂时不做)
这样,即使我们已经完成了对预约订单接口的调用,我们也可以通过查看调试结果来看到微信返回给我们的值:
待续…。