请用php帮我写一个对接支付宝当面付的例子
以下是一个简单的对接支付宝当面付的例子,包括生成订单、生成支付二维码、查询订单状态和验签等功能:
<?php
// 支付宝当面付配置信息
$appId = 'your_app_id';
$merchantPrivateKey = 'your_merchant_private_key';
$alipayPublicKey = 'alipay_public_key';
$gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$notifyUrl = 'http://your_notify_url'; // 支付宝异步通知回调地址
// 生成订单号
function generateOrderNo()
{
return date('YmdHis') . rand(1000, 9999);
}
// 生成支付二维码
function generateQRCode($orderNo, $amount)
{
require_once 'vendor/autoload.php'; // 引入phpqrcode库,用于生成二维码
$qrCode = new \Endroid\QrCode\QrCode();
$qrCode->setText('alipays://platformapi/startapp?appId=20000067&orderNo=' . $orderNo . '&amount=' . $amount);
$qrCode->setSize(300);
$qrCode->setPadding(10);
$qrCode->setErrorCorrection('high');
return $qrCode->writeString();
}
// 查询订单状态
function queryOrderStatus($orderNo)
{
$params = array(
'app_id' => $appId,
'method' => 'alipay.trade.query',
'format' => 'JSON',
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'biz_content' => json_encode(array('out_trade_no' => $orderNo))
);
$params['sign'] = generateSign($params); // 生成签名
$http = new HttpClient($gatewayUrl);
$response = $http->post($params); // 发起POST请求
$json = json_decode($response, true);
if ($json['alipay_trade_query_response']['code'] == '10000') {
return $json['alipay_trade_query_response']['trade_status'];
} else {
return null;
}
}
// 验证支付宝异步通知签名
function verifySign($params)
{
$sign = $params['sign'];
$params['sign'] = null;
$params['sign_type'] = null;
ksort($params);
$data = '';
foreach ($params as $key => $value) {
if ($value !== '' && $key !== 'sign' && $key !== 'sign_type') {
$data .= $key . '=' . $value . '&';
}
}
$data = rtrim($data, '&');
$publicKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($alipayPublicKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----";
$res = openssl_get_publickey($publicKey);
$result = openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);
openssl_free_key($res);
return $result === 1;
}
// 生成签名
function generateSign($params)
{
ksort($params);
$data = '';
foreach ($params as $key => $value) {
if ($value !== '' && $key !== 'sign' && $key !== 'sign_type') {
$data .= $key . '=' . $value . '&';
}
}
$data = rtrim($data, '&');
$privateKey = "-----BEGIN PRIVATE KEY-----\n" . wordwrap($merchantPrivateKey, 64, "\n", true) . "\n-----END PRIVATE KEY-----";
$res = openssl_get_privatekey($privateKey);
openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
openssl_free_key($res);
return base64_encode($sign);
}
// 引入HTTP客户端库,用于发起HTTP请求
require_once 'HttpClient.php';
// 生成订单
$orderNo = generateOrderNo();
$amount = 0.01; // 支付金额,单位为元
$params = array(
'app_id' => $appId,
'method' => 'alipay.trade.precreate',
'format' => 'JSON',
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'notify_url' => $notifyUrl,
'biz_content' => json_encode(array('out_trade_no' => $orderNo, 'total_amount' => $amount, 'subject' => '测试订单'))
);
$params['sign'] = generateSign($params); // 生成签名
$http = new HttpClient($gatewayUrl);
$response = $http->post($params); // 发起POST请求
$json = json_decode($response, true);
if ($json['alipay_trade_precreate_response']['code'] == '10000') {
$qrcode = generateQRCode($orderNo, $amount); // 生成支付二维码
echo '<img src="data:image/png;base64,' . base64_encode($qrcode) . '">';
} else {
echo $json['alipay_trade_precreate_response']['sub_msg'];
}
// 查询订单状态
$status = queryOrderStatus($orderNo);
if ($status == 'TRADE_SUCCESS') {
// 订单支付成功
} else {
// 订单未支付或支付失败
}
// 验证支付宝异步通知签名
if (verifySign($_POST)) {
// 签名验证成功,处理业务逻辑
} else {
// 签名验证失败
}
注意:上述代码中的HttpClient类需要自行编写或使用第三方库实现,用于发起HTTP请求。另外,生成二维码需要使用phpqrcode库,也需要自行引入或使用Composer安装。
原文地址: https://www.cveoy.top/t/topic/NjF 著作权归作者所有。请勿转载和采集!