📅  最后修改于: 2023-12-03 14:57:07.092000             🧑  作者: Mango
本文将介绍如何使用 PHP 实现自动完成订单支付的功能。
首先,我们需要从支付服务商获取必要的信息,如商户号、密钥等。本文以支付宝为例,具体操作步骤请参考支付宝官方文档。
同时,我们需要安装 PHP 的相关扩展,如 openssl、curl 等。
本次实现的自动完成订单支付是基于支付宝的支付宝网页支付接口(即 PC 端支付)。实现过程可分为以下几个步骤:
我们需要将订单信息、商户信息等打包成一个参数数组,发送给支付宝网页支付接口。
<?php
$paramArr = array(
'service' => 'create_direct_pay_by_user',
'partner' => '2088000000000000',
'seller_id' => '2088000000000000',
'payment_type' => '1',
'notify_url' => 'http://www.example.com/notify.php',
'return_url' => 'http://www.example.com/return.php',
'out_trade_no' => '201908280001',
'subject' => '订单支付',
'total_fee' => 0.01,
'body' => '商品描述',
'_input_charset' => 'utf-8'
);
其中,各参数的具体含义和取值可参考支付宝官方文档。
我们需要使用支付宝提供的密钥对支付请求参数进行签名,以保证请求的完整性和安全性。
<?php
function buildRequestMysign($paramArr, $key) {
$prestr = createLinkstring($paramArr);
$prestr = $prestr . $key;
return md5($prestr);
}
function createLinkstring($para) {
$arg = "";
while (list ($key, $val) = each($para)) {
$arg .= $key . "=" . $val . "&";
}
$arg = substr($arg, 0, count($arg) - 2);
if (get_magic_quotes_gpc()) {
$arg = stripslashes($arg);
}
return $arg;
}
我们需要使用 curl 库向支付宝网页支付接口发送支付请求,并获取响应结果,以确认支付结果。
<?php
function httpRequest($url, $postFields) {
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_FAILONERROR, false );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 10 );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/x-www-form-urlencoded;charset=utf-8' ) );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postFields );
$response = curl_exec ( $ch );
if (curl_errno ( $ch )) {
throw new Exception(curl_error ( $ch ), 0);
}
curl_close ( $ch );
return $response;
}
当支付宝网页支付接口收到用户的支付请求后,会向商户提供的 notify_url 发送支付结果通知。
<?php
$verify_result = verifyNotify($_POST, $key);
if($verify_result) {
// 处理支付结果,更新订单状态等
echo 'success'; // 返回响应给支付宝
} else {
// 支付结果验证失败,记录日志等
echo 'fail';
}
function verifyNotify($params, $key) {
ksort($params);
$param_str = '';
foreach($params as $k=>$v) {
if($k != 'sign' && $k != 'sign_type' && $v != '') {
$param_str .= trim($k) . '=' . trim($v) . '&';
}
}
$param_str = substr($param_str, 0, -1);
$sign = '';
if(!empty($params['sign'])) {
$sign = $params['sign'];
}
$sign_type = '';
if(!empty($params['sign_type'])) {
$sign_type = $params['sign_type'];
}
if(empty($sign) || empty($sign_type)) {
return false;
}
if($sign_type != 'MD5') {
return false;
}
$pre_str = $param_str . $key;
$my_sign = md5($pre_str);
if($my_sign != $sign) {
return false;
}
return true;
}
本文介绍了使用 PHP 实现自动完成订单支付的方法,仅供参考。实际场景中,开发者需要根据自己的业务需求进行调整和扩展。