简介:本文详细讲解PHP对接支付宝当面付接口的全流程,涵盖环境准备、密钥配置、API调用、异步通知处理等关键环节,提供可落地的代码示例和调试技巧。
支付宝当面付是支付宝针对线下场景推出的支付解决方案,支持条码支付、扫码支付、声波支付等多种方式。其核心优势在于低门槛接入、高安全性保障和快速到账能力。PHP开发者通过调用支付宝开放平台提供的API,可快速实现线下收款功能。
支付宝当面付主要提供两种接口:
根据业务场景选择合适接口,条码支付场景推荐使用前者,扫码支付推荐后者。
建议使用支付宝官方提供的沙箱环境进行前期开发测试,避免对生产环境造成影响。
使用OpenSSL生成RSA密钥对:
openssl genrsa -out app_private_key.pem 2048openssl rsa -in app_private_key.pem -pubout -out app_public_key.pem
登录支付宝开放平台:
安全存储建议:
以条码支付为例,核心实现步骤:
安装支付宝SDK(推荐使用官方SDK):
composer require alipay/easysdk
初始化客户端配置:
```php
use Alipay\EasySDK\Kernel\Config;
use Alipay\EasySDK\Kernel\Factory;
$config = new Config();
$config->protocol = ‘https’;
$config->gatewayHost = ‘openapi.alipay.com’;
$config->signType = ‘RSA2’;
$config->appId = ‘你的APPID’;
$config->merchantPrivateKey = ‘你的应用私钥’;
$config->alipayPublicKey = ‘支付宝公钥’;
$config->notifyUrl = ‘你的异步通知地址’;
Factory::setOptions($config);
3. 构建支付请求:```phptry {$result = Factory::payment()->faceToFace()->pay('用户付款码', '订单金额', '订单标题', '商户订单号');// 处理同步返回结果if ($result->code == '10000') {echo '支付成功: ' . $result->tradeNo;} else {echo '支付失败: ' . $result->msg;}} catch (Exception $e) {echo '接口调用异常: ' . $e->getMessage();}
支付结果分为同步返回和异步通知两种方式:
示例验证代码:
function verifySign($params, $alipayPublicKey) {$sign = $params['sign'];unset($params['sign']);$content = http_build_query($params);$res = openssl_get_publickey($alipayPublicKey);$result = openssl_verify($content, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);openssl_free_key($res);return $result === 1;}
// 验证签名
if (verifySign($params, $alipayPublicKey)) {
// 验证交易状态
if ($params[‘trade_status’] == ‘TRADE_SUCCESS’) {
// 处理业务逻辑
$outTradeNo = $params[‘out_trade_no’];
$tradeNo = $params[‘trade_no’];
$totalAmount = $params[‘total_amount’];
// 返回成功响应echo 'success';}
} else {
echo ‘fail’;
}
2. 重要验证点:- 验证通知ID的唯一性- 验证交易金额是否一致- 验证商户订单号是否存在# 四、高级功能实现## 4.1 退款功能实现```phptry {$result = Factory::payment()->refund()->byOutTradeNo('商户订单号', '退款金额', '退款单号');if ($result->code == '10000') {echo '退款成功';}} catch (Exception $e) {// 异常处理}
$result = Factory::payment()->query()->byOutTradeNo('商户订单号');if ($result->tradeStatus == 'TRADE_SUCCESS') {// 交易成功处理}
$result = Factory::payment()->bill()->downloadQuery('账单类型', '账单日期');// 处理下载的账单文件
$config->timeout = 30; // 默认10秒
安全建议:
性能优化:
监控体系:
测试建议:
<?phprequire_once __DIR__ . '/vendor/autoload.php';use Alipay\EasySDK\Kernel\Config;use Alipay\EasySDK\Kernel\Factory;class AlipayService {private $config;public function __construct() {$this->config = new Config();$this->config->protocol = 'https';$this->config->gatewayHost = 'openapi.alipay.com';$this->config->signType = 'RSA2';$this->config->appId = getenv('ALIPAY_APPID');$this->config->merchantPrivateKey = getenv('ALIPAY_PRIVATE_KEY');$this->config->alipayPublicKey = getenv('ALIPAY_PUBLIC_KEY');$this->config->notifyUrl = 'https://yourdomain.com/alipay/notify';Factory::setOptions($this->config);}public function pay($authCode, $amount, $subject, $outTradeNo) {try {$result = Factory::payment()->faceToFace()->pay($authCode, $amount, $subject, $outTradeNo);return ['success' => $result->code == '10000','trade_no' => $result->tradeNo ?? null,'message' => $result->msg ?? '未知错误'];} catch (Exception $e) {return ['success' => false,'message' => $e->getMessage()];}}public function verifyNotify($params) {$sign = $params['sign'];unset($params['sign']);$content = http_build_query($params);$res = openssl_get_publickey($this->config->alipayPublicKey);$result = openssl_verify($content, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);openssl_free_key($res);return $result === 1;}}// 使用示例$alipay = new AlipayService();$result = $alipay->pay('用户付款码', '0.01', '测试订单', 'ORDER_' . time());if ($result['success']) {echo "支付成功,交易号:{$result['trade_no']}";} else {echo "支付失败:{$result['message']}";}?>
PHP对接支付宝当面付接口需要掌握三个核心要点:正确的密钥配置、严谨的签名验证和完善的异步通知处理。通过本文介绍的流程,开发者可以快速实现安全可靠的线下支付功能。
未来发展方向建议:
建议开发者持续关注支付宝开放平台的更新日志,及时适配接口变更,保持系统的兼容性和安全性。