📜  自动完成订单支付1 - PHP (1)

📅  最后修改于: 2023-12-03 14:57:07.092000             🧑  作者: Mango

自动完成订单支付1

本文将介绍如何使用 PHP 实现自动完成订单支付的功能。

环境准备

首先,我们需要从支付服务商获取必要的信息,如商户号、密钥等。本文以支付宝为例,具体操作步骤请参考支付宝官方文档。

同时,我们需要安装 PHP 的相关扩展,如 openssl、curl 等。

实现过程

本次实现的自动完成订单支付是基于支付宝的支付宝网页支付接口(即 PC 端支付)。实现过程可分为以下几个步骤:

1. 创建支付请求参数

我们需要将订单信息、商户信息等打包成一个参数数组,发送给支付宝网页支付接口。

<?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'
);

其中,各参数的具体含义和取值可参考支付宝官方文档。

2. 生成签名

我们需要使用支付宝提供的密钥对支付请求参数进行签名,以保证请求的完整性和安全性。

<?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;
}
3. 发送支付请求

我们需要使用 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;
}
4. 处理支付结果

当支付宝网页支付接口收到用户的支付请求后,会向商户提供的 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 实现自动完成订单支付的方法,仅供参考。实际场景中,开发者需要根据自己的业务需求进行调整和扩展。