酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

生成代码:PHP对接支付宝支付完整代码,包括支付结果回调,不依赖支付宝官方SDK

# PHP对接支付宝支付完整代码(不依赖官方SDK) 以下是完整的PHP实现支付宝支付对接方案,包含支付请求生成和异步回调处理: ## 1. 配置文件 `alipay_config.php` ```php <?php // 支付宝配置信息 return [ 'app_id' => '你的APPID', 'merchant_private_key' => '-----BEGIN RSA PRIVATE KEY----- 你的商户私钥 -----END RSA PRIVATE KEY-----', 'alipay_public_key' => '-----BEGIN PUBLIC KEY----- 支付宝公钥 -----END PUBLIC KEY-----', 'gateway_url' => 'https://openapi.alipay.com/gateway.do', 'charset' => 'UTF-8', 'sign_type' => 'RSA2', 'notify_url' => 'https://你的域名/alipay_notify.php', // 异步通知地址 'return_url' => 'https://你的域名/alipay_return.php', // 同步跳转地址 ]; ?> ``` ## 2. 支付请求生成 `alipay_pay.php` ```php <?php require_once 'alipay_config.php'; require_once 'alipay_function.php'; $config = include 'alipay_config.php'; // 订单信息 $out_trade_no = date('YmdHis').mt_rand(1000,9999); // 商户订单号 $total_amount = '0.01'; // 支付金额 $subject = '测试订单'; // 订单 // 构造请求参数 $biz_content = [ 'out_trade_no' => $out_trade_no, 'product_code' => 'FAST_INSTANT_TRADE_PAY', 'total_amount' => $total_amount, 'subject' => $subject, ]; $params = [ 'app_id' => $config['app_id'], 'method' => 'alipay.trade.page.pay', 'charset' => $config['charset'], 'sign_type' => $config['sign_type'], 'timestamp' => date('Y-m-d H:i:s'), 'version' => '1.0', 'notify_url' => $config['notify_url'], 'return_url' => $config['return_url'], 'biz_content' => json_encode($biz_content, JSON_UNESCAPED_UNICODE), ]; // 生成签名 $params['sign'] = generateSign($params, $config['merchant_private_key']); // 构建请求URL $request_url = $config['gateway_url'] . '?' . http_build_query($params); // 跳转到支付宝支付页面 header("Location: {$request_url}"); exit; ?> ``` ## 3. 支付工具函数 `alipay_function.php` ```php <?php / * 生成签名 */ function generateSign($params, $privateKey) { ksort($params); $stringToBeSigned = ""; foreach ($params as $k => $v) { if($k == 'sign' || $v === '' || is_array($v)) continue; $stringToBeSigned .= "{$k}={$v}&"; } $stringToBeSigned = rtrim($stringToBeSigned, '&'); $res = openssl_get_privatekey($privateKey); openssl_sign($stringToBeSigned, $sign, $res, OPENSSL_ALGO_SHA256); openssl_free_key($res); return base64_encode($sign); } / * 验证签名 */ function verifySign($params, $publicKey) { $sign = $params['sign']; unset($params['sign']); unset($params['sign_type']); ksort($params); $stringToBeSigned = ""; foreach ($params as $k => $v) { if($v === '' || is_array($v)) continue; $stringToBeSigned .= "{$k}={$v}&"; } $stringToBeSigned = rtrim($stringToBeSigned, '&'); $res = openssl_get_publickey($publicKey); $result = (bool)openssl_verify($stringToBeSigned, base64_decode($sign), $res, OPENSSL_ALGO_SHA256); openssl_free_key($res); return $result; } / * 处理异步通知 */ function handleNotify($config) { $params = $_POST; if(empty($params) { $params = $_GET; } // 验证签名 $signVerified = verifySign($params, $config['alipay_public_key']); if($signVerified) { // 验证交易状态 if($params['trade_status'] == 'TRADE_SUCCESS' || $params['trade_status'] == 'TRADE_FINISHED') { // 处理业务逻辑,如更新订单状态 // 记录日志 file_put_contents('alipay_notify.log', date('Y-m-d H:i:s').' - '.json_encode($params)."\n", FILE_APPEND); return true; } } return false; } ?> ``` ## 4. 异步通知处理 `alipay_notify.php` ```php <?php require_once 'alipay_config.php'; require_once 'alipay_function.php'; $config = include 'alipay_config.php'; if(handleNotify($config)) { // 处理成功,返回success给支付宝 echo 'success'; } else { // 处理失败 echo 'fail'; } ?> ``` ## 5. 同步跳转处理 `alipay_return.php` ```php <?php require_once 'alipay_config.php'; require_once 'alipay_function.php'; $config = include 'alipay_config.php'; $params = $_GET; // 验证签名 $signVerified = verifySign($params, $config['alipay_public_key']); if($signVerified) { // 支付成功,跳转到订单完成页面 header('Location: /order_success.php?out_trade_no='.$params['out_trade_no']); } else { // 支付失败,跳转到错误页面 header('Location: /pay_error.php'); } exit; ?> ``` ## 注意事项 1. 密钥配置:确保商户私钥和支付宝公钥格式正确,包含完整的`-----BEGIN...`和`-----END...`标记 2. 异步通知:支付宝会在交易完成后多次发送异步通知,直到收到success响应,需做好幂等处理 3. 日志记录:建议记录完整的通知参数,便于后续查证和问题排查 ## 三条额外需要注意的逻辑点 1. 金额处理:支付宝金额单位为元,需确保金额格式为字符串且保留两位小数 2. 订单号唯一性:商户订单号(out_trade_no)必须在商户系统中唯一 3. 验签失败处理:无论同步还是异步通知,验签失败都应视为无效请求,不执行业务逻辑 [2025-05-06 14:39:21 | AI写代码神器 | 1565点数解答]

相关提问