目前互联网项目如果涉及到第三方支付模块,那么支付宝/微信无非是最好的选择,此文先以支付宝为例讲解,想了解微信支付的可以看我之后的文章,当然支付也分很多种形式,比如扫码付、当面付、声波付、调用APP付,网页直接付等等。但最常用的形式还是服务端+APP+调用支付宝APP或服务端+网页扫码/调用支付宝APP/直接支付,所以接下来我就以ThinkPHP5.1作为服务端从接入SDK到实现支付请求以及回调业务流程完整的操作讲解一下,虽然我用的是TP5.1但是TP5和TP5.1在此使用过程中没有太大的区别,无非TP5.1使用了一些TP5没有的静态方法而已,所以使用TP5的也可以通过本文无障碍的接入使用。至于使用沙箱的原因是考虑到有些没有接触具体项目而且自己也没有申请商户资格的用户,使用沙箱环境便不用考虑这些,直接使用支付宝提供的沙箱号接入测试即可,当然如果你是将上线的项目只需将APPID等信息改为项目需求的即可正常使用,接下来进入正文。
目录
一、接入支付宝SDK
1.下载SDK放入框架
首先第一步当然是下载支付宝提供的SDK,这里我们选择支付宝的服务端PHP SDK下载即可(点我进入下载页)
下载得到的是一个压缩包,接下来我们打开TP5.1框架,在extend文件夹下新建一个Alipay(文件夹命名随意,但要和之后命名空间对应,本文全程以Alipay为例)的文件夹,然后将压缩包内容全部解压进Alipay中,效果如下:
2.为SDK所需类添加命名空间
先整理一下之后所需要的SDK类
生成供APP使用的支付串码:AlipayTradeAppPayRequest.php、AopClient.php
网页支付:AlipayTradePagePayRequest、AopClient.php
异步通知回调验签:AopClient.php
综上我们需要使用SDK中这三个类,首先找到这三个类,手动为其添加命名空间
AopClient.php位置:extend/Alipay/aop/AopClient.php
AlipayTradeAppPayRequest.php位置:extend/Alipay/aop/request/AlipayTradeAppPayRequest.php
AlipayTradePagePayRequest.php位置:extend/Alipay/aop/request/AlipayTradePagePayRequest
分别为其添加命名空间如下
AopClient.php需添加此命名空间namespace Alipay\aop;
AlipayTradeAppPayRequest.php和AlipayTradePagePayRequest需添加命名空间namespace Alipay\aop\request;
3.控制器中引用
为所需类库文件添加好命名空间后就可以在控制器引用了,只需要简单的使用use即可,如下:
二、沙箱环境
1.获取商家/用户沙箱账号
首先使用你的支付宝账号登录支付宝开放平台然后点击进入我的开放平台,顶部导航栏开发中心中选择研发服务,即可跳转到沙箱页面。
在沙箱页面我们可以看到支付宝为我们生成的相应信息和账号,之后我们使用SDK时要使用这些相应信息:
记得下载沙箱版支付宝,可以用于之后测试支付,余额可以自己充值。
2.配置公钥,私钥
SDK中主要需要的是四个参数,分别是APPID、支付宝网关、应用私钥,支付宝公钥。
想要得到支付宝公钥需要先生成一个私钥然后将对应的公钥提交才会获取支付宝公钥,生成私钥需要我们下载支付宝的支付宝开放平台开发助手。打开后生成即可,记得选择非JAVA适用
将公钥复制到沙箱页面提交即可获取支付宝公钥,至此我们就得到了之后所需的私钥和支付宝公钥。
三、APP支付(服务端提供串码供APP调用支付宝APP)
具体环境和参数得到后使用起来就很简单了,只需要将需要的参数写入然后调用SDK提供的api即可生成可供APP端调起支付宝所需的串码。
public function appAlipay()
{
$aop = new AopClient;
$aop->gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; //网关地址要使用沙箱网关alipaydev
$aop->appId = "填写你自己的APPID";
$aop->rsaPrivateKey = '填写你自己的应用私钥';
$aop->format = "json";
$aop->postCharset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = '填写沙箱页面给你的支付宝公钥';
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$request = new AlipayTradeAppPayRequest();
//SDK