以下是一个简单的对接支付宝当面付的例子,包括生成订单、生成支付二维码、查询订单状态和验签等功能:

<?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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录