首先完成开发者账号注册并获取密钥,接着通过官方SDK或手动方式调用支付宝、微信支付API实现订单创建与支付请求,最后正确处理异步回调验证签名并更新订单状态。
在PHP项目中集成第三方支付(如支付宝、微信支付)是电商网站或在线服务的常见需求。实现支付功能的关键在于调用支付平台提供的API接口,完成订单创建、支付请求、回调验证等流程。下面以支付宝和微信支付为例,介绍PHP集成第三方支付的基本方法与代码实例。
使用任何第三方支付前,必须先在对应平台注册开发者账号:
将这些凭证安全保存,后续请求签名会用到。
支付宝提供官方SDK,也可手动构建请求。以下是使用官方SDK发起支付的简单示例:
安装支付宝SDK(推荐使用Composer):composer require alipaysdk/easysdk
发起支付请求代码:
require_once 'vendor/autoload.php'; use Alipay\EasySDK\Kernel\Factory; Factory::setOptions([ 'app_id' => 'your_app_id', 'private_key' => 'your_private_key', 'alipay_public_key' => 'alipay_public_key', ]); $response = Factory::payment()->page()->pay( '订单标题', // 订单标题 'OUT_TRADE_NO_001', // 商户订单号 '100.00', // 订单金额 'https://yourdomain.com/return.php' // 支付完成后跳转地址 ); // 输出表单并自动提交 echo $response->body;
用户支付后,支付宝会跳转到return.php进行结果展示,同时通过notify_url异步通知服务器支付结果。
微信支付需构造统一下单请求,以下为简化版实现逻辑:
function wechatPay($openid, $outTradeNo, $totalFee, $body) {
$appid = 'your_appid';
$mch_id = 'your_mch_id';
$key = 'your_api_key';
$notify_url = 'https://yourdomain.com/wechat_notify.php';
$params = [
'appid' => $appid,
'mch_id' => $mch_id,
'nonce_str' => md5(uniqid(microtime(true), true)),
'body' => $body,
'out_trade_no' => $outTradeNo,
'total_fee' => $totalFee, // 单位:分
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
'notify_url' => $notify_url,
'trade_type' => 'JSAPI',
'openid' => $openid
];
// 生成签名
ksort($params);
$string = '';
foreach ($params as $k => $v) {
if ($v !== '' && $k != 'sign') {
$string .= "{$k}={$v}&";
}
}
$string .= "key={$key}";
$params['sign'] = strtoupper(md5($string));
// 转为XML
$xml = '';
foreach ($params as $k => $v) {
$xml .= "<{$k}>{$v}{$k}>";
}
$xml .= ' ';
// 请求微信统一下单接口
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
return simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA);
}
前端根据返回的prepay_id生成支付参数,调起微信支付。
支付平台会在用户支付成功后发送异步通知,必须正确响应并验证签名,防止伪造请求。
以支付宝回调为例(notify.php):
$notify_data = $_POST;
// 验证签名
$flag = verifyAlipaySign($notify_data); // 使用支付宝公钥验签
if ($flag && $notify_data['trade_status'] == 'TRADE_SUCCESS') {
// 更新本地订单状态
updateOrderStatus($notify_data['out_trade_no'], 'paid');
echo 'success'; // 必须原样返回success,否则会重复通知
} else {
echo 'fail';
}
微信支付回调接收XML数据,需解析并验签:
$input = file_get_contents('php://input');
$data = simplexml_load_string($input, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($data && $data->return_code == 'SUCCESS') {
// 验证签名
if (wechatVerifySign($data)) {
// 处理订单逻辑
updateOrderStatus((string)$data->out_trade_no, 'paid');
echo ' ';
}
}
基本上就这些。核心是理解支付流程:生成订单 → 调起支付 → 回调验证 → 更新状态。确保密钥安全、验签完整、异步通知处理幂等,就能稳定运行。