跨境系统设计

完善的php集成PayPal和信用卡支付

以下是使用 PHP 生成一个简单跨境电商独立站并集成 PayPal 和信用卡支付的详细步骤和示例代码:

  1. 项目结构规划
    首先,我们需要规划项目的基本结构,以下是一个简单的示例:
    plaintext
    project/
    ├── index.php # 商品展示页面
    ├── checkout.php # 结算页面
    ├── paypal_ipn.php # PayPal 即时付款通知处理页面
    ├── credit_card_pay.php # 信用卡支付处理页面
  2. 商品展示页面(index.php)
    这个页面用于展示商品信息,用户可以选择商品并添加到购物车。
    php
    <!DOCTYPE html>


    跨境电商独立站 - 商品列表


    商品列表




    • 商品名称:T恤
      价格:$20
      结算



  3. 结算页面(checkout.php)
    该页面允许用户选择支付方式,如 PayPal 或信用卡支付。
    php
    <!DOCTYPE html>



    跨境电商独立站 - 结算


    结算


    <?php
    $product = $_GET[‘product’];
    $price = $_GET[‘price’];
    echo “

    商品名称:$product

    “;
    echo “

    价格:$$price

    “;
    ?>

    选择支付方式


     <input type="hidden" name="cmd" value="_xclick">
     <input type="hidden" name="business" value="your_paypal_email@example.com">
     <input type="hidden" name="item_name" value="<?php echo $product; ?>">
     <input type="hidden" name="amount" value="<?php echo $price; ?>">
     <input type="hidden" name="currency_code" value="USD">
     <input type="hidden" name="return" value="https://yourwebsite.com/success.php">
     <input type="hidden" name="cancel_return" value="https://yourwebsite.com/cancel.php">
     <input type="hidden" name="notify_url" value="https://yourwebsite.com/paypal_ipn.php">
     <input type="submit" value="使用 PayPal 支付">
    

     <input type="hidden" name="product" value="<?php echo $product; ?>">
     <input type="hidden" name="price" value="<?php echo $price; ?>">
     <input type="submit" value="使用信用卡支付">
    



    注意事项
    请将 your_paypal_email@example.com 替换为你的 PayPal 商家邮箱。
    https://yourwebsite.com 需要替换为你的实际网站域名。
  4. PayPal 即时付款通知处理页面(paypal_ipn.php)
    这个页面用于处理 PayPal 的即时付款通知(IPN),验证付款是否成功。
    php
    <?php
    // 接收 PayPal IPN 数据
    $raw_post_data = file_get_contents(‘php://input’);
    $raw_post_array = explode(‘&’, $raw_post_data);
    $myPost = array();
    foreach ($raw_post_array as $keyval) {
    $keyval = explode (‘=’, $keyval);
    if (count($keyval) == 2) {
     $myPost[$keyval[0]] = urldecode($keyval[1]);
    
    }
    }
    // 构建验证请求
    $req = ‘cmd=_notify-validate’;
    if(function_exists(‘get_magic_quotes_gpc’)) {
    $get_magic_quotes_exists = true;
    }
    foreach ($myPost as $key => $value) {
    if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
     $value = urlencode(stripslashes($value));
    
    } else {
     $value = urlencode($value);
    
    }
    $req .= “&$key=$value”;
    }
    // 向 PayPal 发送验证请求
    $ch = curl_init(‘https://ipnpb.sandbox.paypal.com/cgi-bin/webscr‘);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘Connection: Close’));
    $res = curl_exec($ch);
    curl_close($ch);
    // 验证响应
    if (strcmp ($res, “VERIFIED”) == 0) {
    // 处理付款成功逻辑
    $item_name = $_POST[‘item_name’];
    $payment_status = $_POST[‘payment_status’];
    $payment_amount = $_POST[‘mc_gross’];
    $payment_currency = $_POST[‘mc_currency’];
    $txn_id = $_POST[‘txn_id’];
    // 这里可以将付款信息记录到数据库等操作
    file_put_contents(‘paypal_ipn.log’, “Payment verified: $item_name, $payment_status, $payment_amount, $payment_currency, $txn_id\n”, FILE_APPEND);
    } elseif (strcmp ($res, “INVALID”) == 0) {
    // 处理无效付款逻辑
    file_put_contents(‘paypal_ipn.log’, “Payment invalid\n”, FILE_APPEND);
    }
    ?>
  5. 信用卡支付处理页面(credit_card_pay.php)
    这里我们使用 Stripe 作为示例来处理信用卡支付,因为它是一个流行的支付网关,支持多种信用卡。
    php
    <?php
    require_once(‘vendor/autoload.php’);
    \Stripe\Stripe::setApiKey(‘your_stripe_secret_key’);
    $product = $_POST[‘product’];
    $price = $_POST[‘price’];
    try {
    $intent = \Stripe\PaymentIntent::create([
     'amount' => $price * 100, // 金额需要以美分计算
     'currency' => 'usd',
     'description' => $product,
    
    ]);
    echo json_encode([
     'clientSecret' => $intent->client_secret
    
    ]);
    } catch (\Stripe\Exception\ApiErrorException $e) {
    http_response_code(500);
    echo json_encode([‘error’ => $e->getMessage()]);
    }
    ?>
    注意事项
    你需要先安装 Stripe PHP 库,可以使用 Composer 进行安装:composer require stripe/stripe-php。
    将 your_stripe_secret_key 替换为你的 Stripe 秘密密钥。
    前端集成 Stripe
    在结算页面(checkout.php)中添加以下 JavaScript 代码来处理 Stripe 支付:
    html
    <!DOCTYPE html>



    跨境电商独立站 - 结算


     <div id="card-element"></div>
     <button id="submit">使用信用卡支付</button>
    




    注意事项
    将 your_stripe_public_key 替换为你的 Stripe 公开密钥。
    总结
    通过以上步骤,你可以创建一个简单的跨境电商独立站,并集成 PayPal 和信用卡支付功能。需要注意的是,实际应用中还需要处理更多的错误情况、安全性问题和用户体验优化。
    帮我完善一下这个支付模块,要求安全完整,功能强大
    以下是对上述支付模块的完善方案,旨在提升其安全性、完整性和功能性。
  6. 项目结构优化
    为了更好地组织代码,我们可以进一步细化项目结构:
    plaintext
    project/
    ├── public/
    │ ├── index.php # 商品展示页面
    │ ├── checkout.php # 结算页面
    │ ├── success.php # 支付成功页面
    │ ├── cancel.php # 支付取消页面
    ├── includes/
    │ ├── config.php # 配置文件,存放密钥等信息
    │ ├── database.php # 数据库连接和操作类
    ├── paypal/
    │ ├── paypal_ipn.php # PayPal 即时付款通知处理页面
    ├── stripe/
    │ ├── credit_card_pay.php # 信用卡支付处理页面
  7. 配置文件(includes/config.php)
    将敏感信息(如 API 密钥、数据库连接信息等)存放在配置文件中,提高代码的安全性和可维护性。
    php
    <?php
    // PayPal 配置
    define(‘PAYPAL_BUSINESS_EMAIL’, ‘your_paypal_email@example.com’);
    define(‘PAYPAL_RETURN_URL’, ‘https://yourwebsite.com/success.php‘);
    define(‘PAYPAL_CANCEL_URL’, ‘https://yourwebsite.com/cancel.php‘);
    define(‘PAYPAL_NOTIFY_URL’, ‘https://yourwebsite.com/paypal/paypal_ipn.php‘);

// Stripe 配置
define(‘STRIPE_SECRET_KEY’, ‘your_stripe_secret_key’);
define(‘STRIPE_PUBLIC_KEY’, ‘your_stripe_public_key’);

// 数据库配置
define(‘DB_HOST’, ‘localhost’);
define(‘DB_USER’, ‘your_db_user’);
define(‘DB_PASSWORD’, ‘your_db_password’);
define(‘DB_NAME’, ‘your_db_name’);
?>

  1. 数据库连接和操作类(includes/database.php)
    创建一个数据库类,用于处理数据库连接和操作,方便记录支付信息。
    php
    <?php
    require_once ‘config.php’;

class Database {
private $conn;

public function __construct() {
    $this->conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if ($this->conn->connect_error) {
        die("Connection failed: " . $this->conn->connect_error);
    }
}

public function insertPayment($txn_id, $product, $amount, $currency, $payment_method, $status) {
    $stmt = $this->conn->prepare("INSERT INTO payments (txn_id, product, amount, currency, payment_method, status) VALUES (?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("ssdsis", $txn_id, $product, $amount, $currency, $payment_method, $status);
    $stmt->execute();
    $stmt->close();
}

public function __destruct() {
    $this->conn->close();
}

}
?>

  1. 商品展示页面(public/index.php)
    增加更多商品信息展示和购物车功能。
    php
    <!DOCTYPE html>


    跨境电商独立站 - 商品列表


    商品列表




    • 商品名称:T恤
      价格:$20
      结算


    • 商品名称:牛仔裤
      价格:$50
      结算



  2. 结算页面(public/checkout.php)
    完善支付表单和错误处理,增加 Stripe 支付的前端逻辑。
    php
    <!DOCTYPE html>


    跨境电商独立站 - 结算



    结算


    <?php
    require_once ‘../includes/config.php’;
    $product = $_GET[‘product’];
    $price = $_GET[‘price’];
    echo “

    商品名称:$product

    “;
    echo “

    价格:$$price

    “;
    ?>

    选择支付方式
























  3. PayPal 即时付款通知处理页面(paypal/paypal_ipn.php)
    完善 IPN 验证和数据库记录功能。
    php
    <?php
    require_once ‘../includes/config.php’;
    require_once ‘../includes/database.php’;

// 接收 PayPal IPN 数据
$raw_post_data = file_get_contents(‘php://input’);
$raw_post_array = explode(‘&’, $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
$keyval = explode (‘=’, $keyval);
if (count($keyval) == 2) {
$myPost[$keyval[0]] = urldecode($keyval[1]);
}
}
// 构建验证请求
$req = ‘cmd=_notify-validate’;
if(function_exists(‘get_magic_quotes_gpc’)) {
$get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
$value = urlencode(stripslashes($value));
} else {
$value = urlencode($value);
}
$req .= “&$key=$value”;
}
// 向 PayPal 发送验证请求
$ch = curl_init(‘https://ipnpb.sandbox.paypal.com/cgi-bin/webscr‘);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘Connection: Close’));
$res = curl_exec($ch);
curl_close($ch);
// 验证响应
if (strcmp ($res, “VERIFIED”) == 0) {
$item_name = $_POST[‘item_name’];
$payment_status = $_POST[‘payment_status’];
$payment_amount = $_POST[‘mc_gross’];
$payment_currency = $_POST[‘mc_currency’];
$txn_id = $_POST[‘txn_id’];
$db = new Database();
$db->insertPayment($txn_id, $item_name, $payment_amount, $payment_currency, ‘PayPal’, $payment_status);
file_put_contents(‘paypal_ipn.log’, “Payment verified: $item_name, $payment_status, $payment_amount, $payment_currency, $txn_id\n”, FILE_APPEND);
} elseif (strcmp ($res, “INVALID”) == 0) {
file_put_contents(‘paypal_ipn.log’, “Payment invalid\n”, FILE_APPEND);
}
?>

  1. 信用卡支付处理页面(stripe/credit_card_pay.php)
    完善 Stripe 支付处理和错误处理。
    php
    <?php
    require_once ‘../includes/config.php’;
    require_once ‘../includes/database.php’;
    require_once ‘vendor/autoload.php’;
    \Stripe\Stripe::setApiKey(STRIPE_SECRET_KEY);
    $product = $_POST[‘product’];
    $price = $_POST[‘price’];
    try {
    $intent = \Stripe\PaymentIntent::create([
     'amount' => $price * 100, // 金额需要以美分计算
     'currency' => 'usd',
     'description' => $product,
    
    ]);
    echo json_encode([
     'clientSecret' => $intent->client_secret
    
    ]);
    } catch (\Stripe\Exception\ApiErrorException $e) {
    http_response_code(500);
    echo json_encode([‘error’ => $e->getMessage()]);
    }
    ?>
  2. 支付成功页面(public/success.php)
    显示支付成功信息。
    php
    <!DOCTYPE html>


    支付成功


    支付成功!


    感谢您的购买,我们将尽快处理您的订单。



  3. 支付取消页面(public/cancel.php)
    显示支付取消信息。
    php
    <!DOCTYPE html>



    支付取消


    支付已取消


    如果您有任何疑问,请随时联系我们。




    安全性和其他建议
    输入验证:在处理用户输入时,要进行严格的验证和过滤,防止 SQL 注入和 XSS 攻击。
    HTTPS:确保网站使用 HTTPS 协议,保护用户的敏感信息。
    日志记录:记录所有支付相关的信息,方便后续排查问题。
    错误处理:在代码中添加详细的错误处理逻辑,给用户友好的错误提示。
    定期更新:及时更新 Stripe 和 PayPal 的 SDK 以及相关依赖,确保安全性。
    通过以上完善,支付模块的安全性、完整性和功能性都得到了显著提升。