php实现支付功能
PHP实现支付功能的方法
使用第三方支付平台API
支付宝、微信支付、PayPal等主流支付平台均提供开发者API接口。以支付宝为例,需注册开发者账号并获取AppID、商户私钥等信息。调用支付宝的支付接口时,需按照文档构造请求参数并签名。
// 支付宝支付示例
require_once 'alipay-sdk/AopSdk.php';
$c = new AopClient();
$c->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$c->appId = 'your_app_id';
$c->rsaPrivateKey = 'your_private_key';
$c->alipayPublicKey = 'alipay_public_key';
$request = new AlipayTradePagePayRequest();
$request->setBizContent(json_encode([
'out_trade_no' => uniqid(),
'total_amount' => '100.00',
'subject' => '测试商品',
'product_code' => 'FAST_INSTANT_TRADE_PAY'
]));
$response = $c->pageExecute($request);
echo $response;
集成支付SDK
Stripe、PayPal等国际支付平台提供PHP SDK,简化集成流程。以Stripe为例,安装SDK后配置API密钥即可创建支付订单。
// Stripe支付示例
require 'vendor/autoload.php';
\Stripe\Stripe::setApiKey('sk_test_your_key');
$session = \Stripe\Checkout\Session::create([
'payment_method_types' => ['card'],
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => ['name' => '测试商品'],
'unit_amount' => 1000,
],
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => 'https://example.com/success',
'cancel_url' => 'https://example.com/cancel',
]);
header("Location: " . $session->url);
数据库订单管理
支付功能需与订单系统结合。在MySQL中创建订单表,记录交易状态。
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_no VARCHAR(50) NOT NULL,
amount DECIMAL(10,2) NOT NULL,
status ENUM('pending','paid','failed') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
PHP处理支付回调时更新订单状态:
// 支付回调处理
$orderNo = $_POST['out_trade_no'];
$paymentStatus = $_POST['trade_status'];
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("UPDATE orders SET status = ? WHERE order_no = ?");
$stmt->execute([$paymentStatus === 'TRADE_SUCCESS' ? 'paid' : 'failed', $orderNo]);
支付安全措施
验证支付回调签名防止伪造请求。支付宝回调验证示例:
$alipayPublicKey = 'alipay_public_key';
$sign = $_POST['sign'];
$params = $_POST;
unset($params['sign'], $params['sign_type']);
ksort($params);
$signContent = '';
foreach ($params as $k => $v) {
$signContent .= "$k=$v&";
}
$signContent = rtrim($signContent, '&');
$isValid = openssl_verify($signContent, base64_decode($sign), $alipayPublicKey, OPENSSL_ALGO_SHA256);
if ($isValid !== 1) {
die('签名验证失败');
}
本地支付测试环境
使用沙箱环境测试支付流程。支付宝沙箱需配置特殊网关和测试账号:
$c->gatewayUrl = 'https://openapi.alipaydev.com/gateway.do';
$c->appId = '沙箱APPID';
微信支付沙箱需调用获取沙箱密钥接口:

$sandboxKey = file_get_contents('https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey?mch_id=商户号&key=密钥');






