高性能PHP框架webman集成支付宝支付
开源技术小栈本文导读:本文介绍如何在webman框架中集成支付宝支付,并实现支付功能。
概述
本文将以高性能PHP框架webman为技术载体,深度解析支付宝支付在现代化企业系统中的集成策略与实践方案。通过本文,开发者将掌握从沙箱环境配置到生产环境部署的全链路实现方案,了解如何利用webman的异步非阻塞特性与支付宝的RESTful API构建高并发支付系统,并获取支付接口安全加固、交易状态同步等关键环节的最佳实践。
文章特别针对webman框架的模块化设计特点,提供可复用的支付SDK集成方案,涵盖当面付、手机网站支付等主流场景,同时详解异步通知机制与对账系统的实现要点,助力开发者打造既符合企业级安全标准又具备优异用户体验的支付解决方案。
应用场景
本方案专为采用webman前后端分离架构的企业级应用量身定制,旨在助力集成支付宝支付功能。常见应用场景广泛,涵盖在线商城的商品交易支付,让消费者能够便捷购买心仪商品;会员充值场景,方便用户快速完成会员权益的续费或升级;以及各类订单支付场景,确保企业业务流程中的资金流转高效、安全,全面提升用户支付体验,满足企业多样化的线上支付需求。
解决方案
- 搭建支付基础环境:要开展支付宝支付集成工作,首先需准备好支付环境。这其中关键的一步是完成支付宝开发者账户的配置,你要在支付宝开放平台完成账号注册,严格按照平台指引填写相关信息,完成身份认证等操作,以获取后续开发所需的各类权限和密钥。
- 集成支付 SDK:借助composer来添加项目所需依赖,从而实现支付宝 SDK 的集成。通过在项目根目录下运行特定的composer命令,从官方源拉取最新且稳定版本的支付宝 SDK 到项目中,让项目具备与支付宝支付系统交互的基础能力。
- 配置与读取支付参数:对支付所需的各项参数进行细致配置,这些参数涵盖商户号、密钥、回调地址等重要信息。将这些参数妥善存储在配置文件中,并编写代码实现从配置文件中读取参数,确保在支付流程中能正确引用这些关键信息。
- 编写支付业务逻辑:此环节是实现支付功能的核心。需要编写完整的支付业务逻辑,其中包括下单和回调处理等关键流程。在下单环节,要根据业务需求生成订单信息,并将其按照支付宝规定的格式封装后发送给支付宝支付系统;在回调处理环节,要对支付宝返回的支付结果通知进行验证和处理,确保订单状态与支付结果保持一致。
- 创建前端调用接口:为了让前端能够方便地触发支付流程,需要创建专门的支付接口。这些接口要遵循前后端约定的数据交互格式,接收前端传递的订单信息,调用之前编写的支付业务逻辑生成支付链接或支付二维码,然后将结果返回给前端,供前端展示给用户完成支付操作。
Step.1 配置支付环境
1. 登录支付宝:
2. 创建应用
3. 进入设置页面
4. 接口加签方式
5. 下载支付宝密钥工具
6. 生成CSR文件
7. 打开生成的文件
8. 支付宝页面下一步
9. 上传刚刚生成的CSR文件
10. 提交应用: 提交应用,等待签约审核成功
11. 下载证书
Step.2 集成支付 SDK
在项目中添加支付宝 SDK 依赖
代码语言:javascript代码运行次数:0运行复制composer require yansongda/pay ~3.0
Step.3 配置支付宝参数
开源技术小栈说明:以下以支付宝沙箱环境为环境进行文档编写,若有问题,请及时反馈哦!
配置文件config/payment.php
,通过支付宝沙箱环境
获取所需参数:
<?php
/**
* @desc 支付配置文件
* @author Tinywan(ShaoBo Wan)
*/
return [
'_force' => true,
'alipay' => [
'default' => [
// 必填-支付宝分配的 app_id
'app_id' => '20160909004708941',
// 必填-应用私钥 字符串或路径
'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
// 必填-应用公钥证书 路径
'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
// 必填-支付宝公钥证书 路径
'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
// 必填-支付宝根证书 路径
'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
// 选填-同步回调地址
'return_url' => '',
// 选填-异步回调地址
'notify_url' => '',
// 选填-服务商模式下的服务商 id,当 mode 为 Pay::MODE_SERVICE 时使用该参数
'service_provider_id' => '',
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
]
],
'logger' => [
'enable' => false,
'file' => runtime_path().'/logs/alipay.log',
'level' => 'debug', // 建议生产环境等级调整为 info,开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
]
];
代码语言:javascript代码运行次数:0运行复制开源技术小栈注意:证书目录没有规定,以上示例是放在的框架的
payment
目录下
├── payment
│ ├── alipayCertPublicKey_RSA2.crt
│ ├── alipayRootCert.crt
│ └── appCertPublicKey_2016090900470841.crt
Step.4 编写支付业务逻辑
获取config/payment.php
配置
$config = config('payment');
\Yansongda\Pay\Pay::config($config);
开源技术小栈注意:如果是支付宝沙箱模式,一定要记得开启配置文件
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
,该选项默认为默认为正常模式。
Step.5 编写支付业务逻辑
PC网页支付伪代码
代码语言:javascript代码运行次数:0运行复制<?php
usesupport\Request;
useYansongda\Pay\Pay;
/**
* @param Request $request
* @return string
*/
publicfunction payment(Request $request)
{
// 1. 初始化配置
Pay::config(config('payment'));
// 2. 网页支付
$order = [
'out_trade_no' => time(),
'total_amount' => '8888.88',
'subject' => 'webman payment',
'_method' => 'get'// 使用get方式跳转
];
return Pay::alipay()->web($order)->getBody()->getContents();
}
Step.6 异步回调处理
对于App支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url
,通过POST请求的形式将支付结果作为参数通知到商户系统。
<?php
usesupport\Request;
useYansongda\Pay\Pay;
/**
* @desc:『支付宝』异步通知
* @param Request $request
* @return Response
*/
publicfunction alipayNotify(Request $request): Response
{
// 1. 初始化配置
Pay::config(config('payment'));
// 2. 支付宝回调处理
$result = Pay::alipay()->callback($request->post());
// ===================================================================================================
// 请自行对 trade_status 进行判断及其它逻辑进行判断,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
// 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方;
// 4、验证app_id是否为该商户本身。
// 5、其它业务逻辑情况
// ===================================================================================================
// 5. 支付宝回调处理
returnnew Response(200, [], 'success');
}
开源技术小栈注意:不能使用插件本身
return Pay::alipay()->success();
响应支付宝回调,如果你用到中间件会出现中间件问题。所以响应支付宝需要使用webman的响应类support\Response;
服务器异步通知页面特性
开源技术小栈
- 必须保证服务器异步通知页面(
notify_url
)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等; - 支付宝是用
POST
方式发送通知信息,因此该页面中获取参数的方式,如:request.Form(“out_trade_no”)
、$_POST[‘out_trade_no’]
; - 支付宝主动发起通知,该方式才会被启用;
- 只有在支付宝的交易管理中存在该笔交易,且发生了交易状态的改变,支付宝才会通过该方式发起服务器通知(即时到账交易状态为“等待买家付款”的状态默认是不会发送通知的);
- 服务器间的交互,不像页面跳转同步通知可以在页面上显示出来,这种交互方式是不可见的;
- 第一次交易状态改变(即时到账中此时交易状态是交易完成)时,不仅会返回同步处理结果,而且服务器异步通知页面也会收到支付宝发来的处理结果通知;
- 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:
4m,10m,10m,1h,2h,6h,15h
); - 程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到success字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知;
- cookies、session等在此页面会失效,即无法获取这些数据;
- 该方式的调试与运行必须在服务器上,即互联网上能访问;
- 该方式的作用主要防止订单丢失,即页面跳转同步通知没有处理订单更新,它则去处理;
- 当商户收到服务器异步通知并打印出success时,服务器异步通知参数notify_id才会失效。也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出success导致支付宝重发数次通知),服务器异步通知参数notify_id是不变的。
特别注意说明
开源技术小栈
- 状态
TRADE_SUCCESS
的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功; - 交易状态
TRADE_FINISHED
的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。
调试流程
- 支付请求:在webman前后端分离架构的企业应用中,用户于前端发起支付,像在线商城购物、会员充值或订单支付场景,前端会将含订单金额、编号等数据的请求发至后端服务器。
- 获取链接:后端收到请求,依支付宝支付参数调用其接口,校验、格式化数据后,成功获取承载订单金额、有效期等信息的支付链接。
- 跳转支付:后端把链接回传,前端引导用户点击,跳转至支付宝页面,用户可选余额、银行卡、花呗等方式完成支付。
- 更新状态:支付成功,支付宝按
notifyUrl
向服务器回调,携带支付结果。服务器验证数据,确认无误后更新订单状态,完成库存扣减等后续操作
发布评论