PHP会员支付系统源码

一套php源代码,完成以下功能:1、会员注册、登录、通过设置的问题答案找回密码、修改密码 2、通过信用卡、PayPal、比特币充值积分,0.1美元1积分。 3、生成mysql数据库表
ChatGPT 说:
要完成功能,我们可以将系统分为以下几个模块:会员注册与登录、找回密码、修改密码、充值积分、数据库设计等。下面是每个部分的PHP源代码,以及相应的MySQL数据库表设计。

1. 数据库设计
首先,我们需要创建数据库和相应的表结构。假设数据库名为 user_system。


CREATE DATABASE user_system;

USE user_system;

-- 会员表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100),
    question VARCHAR(255),
    answer VARCHAR(255),
    points INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 充值记录表
CREATE TABLE recharge_records (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10, 2),  -- 充值金额
    points INT,  -- 充值积分
    method ENUM('credit_card', 'paypal', 'bitcoin') NOT NULL,  -- 充值方式
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

2. PHP源代码
2.1 用户注册 (register.php)


<?php
include('db.php');  // 包含数据库连接

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);  // 加密密码
    $email = $_POST['email'];
    $question = $_POST['question'];
    $answer = $_POST['answer'];

    // 插入用户数据
    $sql = "INSERT INTO users (username, password, email, question, answer) VALUES (?, ?, ?, ?, ?)";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("sssss", $username, $password, $email, $question, $answer);
    
    if ($stmt->execute()) {
        echo "注册成功!";
    } else {
        echo "注册失败: " . $conn->error;
    }
}
?>
<form method="POST">
    用户名: <input type="text" name="username"><br>
    密码: <input type="password" name="password"><br>
    邮箱: <input type="email" name="email"><br>
    密保问题: <input type="text" name="question"><br>
    密保答案: <input type="text" name="answer"><br>
    <input type="submit" value="注册">
</form>

2.2 用户登录 (login.php)

<?php
include('db.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $sql = "SELECT * FROM users WHERE username = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result = $stmt->get_result();
    $user = $result->fetch_assoc();

    if ($user && password_verify($password, $user['password'])) {
        echo "登录成功!";
    } else {
        echo "用户名或密码错误!";
    }
}
?>
<form method="POST">
    用户名: <input type="text" name="username"><br>
    密码: <input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>

2.3 找回密码 (forgot_password.php)

<?php
include('db.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $answer = $_POST['answer'];

    $sql = "SELECT * FROM users WHERE username = ? AND answer = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ss", $username, $answer);
    $stmt->execute();
    $result = $stmt->get_result();
    $user = $result->fetch_assoc();

    if ($user) {
        echo "找回密码成功!可以重置密码。";
    } else {
        echo "用户名或密保答案错误!";
    }
}
?>
<form method="POST">
    用户名: <input type="text" name="username"><br>
    密保答案: <input type="text" name="answer"><br>
    <input type="submit" value="找回密码">
</form>

2.4 修改密码 (change_password.php)

<?php
include('db.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $old_password = $_POST['old_password'];
    $new_password = password_hash($_POST['new_password'], PASSWORD_DEFAULT);

    // 检查旧密码是否正确
    $sql = "SELECT * FROM users WHERE username = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result = $stmt->get_result();
    $user = $result->fetch_assoc();

    if ($user && password_verify($old_password, $user['password'])) {
        // 更新新密码
        $sql = "UPDATE users SET password = ? WHERE username = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("ss", $new_password, $username);
        
        if ($stmt->execute()) {
            echo "密码修改成功!";
        } else {
            echo "修改失败: " . $conn->error;
        }
    } else {
        echo "旧密码错误!";
    }
}
?>
<form method="POST">
    用户名: <input type="text" name="username"><br>
    旧密码: <input type="password" name="old_password"><br>
    新密码: <input type="password" name="new_password"><br>
    <input type="submit" value="修改密码">
</form>

2.5 充值积分 (recharge.php)

<?php
include('db.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $user_id = $_POST['user_id'];
    $method = $_POST['method'];  // 充值方式
    $amount = $_POST['amount'];  // 充值金额
    $points = $amount * 10;  // 假设 1 美元 = 10 积分

    // 插入充值记录
    $sql = "INSERT INTO recharge_records (user_id, amount, points, method) VALUES (?, ?, ?, ?)";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("idss", $user_id, $amount, $points, $method);
    
    if ($stmt->execute()) {
        // 更新用户积分
        $sql = "UPDATE users SET points = points + ? WHERE id = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("ii", $points, $user_id);
        $stmt->execute();

        echo "充值成功,获得积分:" . $points;
    } else {
        echo "充值失败: " . $conn->error;
    }
}
?>
<form method="POST">
    用户ID: <input type="text" name="user_id"><br>
    充值金额: <input type="number" name="amount" step="0.01"><br>
    充值方式: 
    <select name="method">
        <option value="credit_card">信用卡</option>
        <option value="paypal">PayPal</option>
        <option value="bitcoin">比特币</option>
    </select><br>
    <input type="submit" value="充值">
</form>

3. 数据库连接 (db.php)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "user_system";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
?>

总结
上述代码实现了用户注册、登录、找回密码、修改密码、充值积分的基本功能,并且设计了相应的数据库表。你可以根据自己的需求进一步扩展功能,例如添加验证码、优化UI、处理支付集成等。

完善以上代码,包括支付接口的完善

为了完善支付接口并集成外部支付系统,我们需要在 充值积分 功能中加入实际的支付接口,比如 PayPal、信用卡支付(通常通过第三方服务,如 Stripe)和 比特币支付。这些支付接口通常需要通过 API 来与支付平台进行通信,并处理支付成功后的回调。

由于不同支付方式集成的复杂度较高,下面我会展示如何集成这些支付方式的基本框架和关键步骤。由于这里不能实际运行支付代码,我将提供接口的基本结构以及如何接入这些服务。

1. 信用卡支付 (通过 Stripe)
Stripe 是一个广泛使用的支付网关,支持信用卡支付。你需要先在 Stripe 官网 注册并获取 API 密钥。以下是如何集成 Stripe 支付的基本框架。

1.1 Stripe 支付处理 (stripe_payment.php)
首先,安装 Stripe SDK:

composer require stripe/stripe-php

然后,在 stripe_payment.php 中创建支付页面和处理支付的后端代码。

<?php
require 'vendor/autoload.php';  // Stripe SDK

// 设置 Stripe 密钥
\Stripe\Stripe::setApiKey('your_secret_key_here');  // 请替换为你自己的密钥

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 获取用户输入的金额
    $amount = $_POST['amount'];  // 金额应以最小单位 (例如,1.99美元为199)
    $currency = 'usd';  // 默认货币为美元

    try {
        // 创建支付意图(Payment Intent)
        $paymentIntent = \Stripe\PaymentIntent::create([
            'amount' => $amount * 100,  // 金额以分为单位
            'currency' => $currency,
            'description' => '充值积分',
        ]);

        // 将返回的客户端密钥传递给前端,供客户端使用
        echo json_encode([
            'clientSecret' => $paymentIntent->client_secret,
        ]);
    } catch (\Stripe\Exception\ApiErrorException $e) {
        echo json_encode(['error' => $e->getMessage()]);
    }
}
?>
<form method="POST">
    充值金额: <input type="number" name="amount" step="0.01" required><br>
    <input type="submit" value="进行支付">
</form>

1.2 前端代码集成 (stripe_checkout.html)
在用户提交表单后,使用 Stripe 提供的 JavaScript SDK 处理支付。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Stripe Payment</title>
    <script src="https://js.stripe.com/v3/"></script>
</head>
<body>
    <form id="payment-form">
        <div id="card-element"></div>  <!-- Stripe's Card Element -->
        <button id="submit">支付</button>
    </form>

    <script>
        var stripe = Stripe('your_publishable_key_here');  // 使用你的公开密钥
        var elements = stripe.elements();
        var card = elements.create('card');
        card.mount('#card-element');

        // 处理表单提交
        document.getElementById('payment-form').addEventListener('submit', async function(event) {
            event.preventDefault();

            const {paymentIntent, error} = await stripe.confirmCardPayment(
                clientSecret,  // 从后端获取
                {
                    payment_method: {
                        card: card,
                    }
                }
            );

            if (error) {
                console.log(error.message);
            } else if (paymentIntent.status === 'succeeded') {
                alert('支付成功');
            }
        });
    </script>
</body>
</html>

1.3 后端更新充值记录
在用户支付成功后,需要在后端更新充值记录(如存储支付金额、充值积分等)。

在 recharge.php 中,可以使用 Stripe 的 Webhook 来接收支付成功的回调:

// Stripe webhook 监听支付成功
$endpoint_secret = 'your_webhook_secret';  // Webhook 密钥
$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];

try {
    $event = \Stripe\Webhook::constructEvent($payload, $sig_header, $endpoint_secret);

    if ($event->type == 'payment_intent.succeeded') {
        $paymentIntent = $event->data->object;  // 获取 PaymentIntent 对象
        $user_id = $paymentIntent->metadata->user_id;  // 在创建 PaymentIntent 时存储用户ID
        $amount = $paymentIntent->amount_received / 100;  // 转换金额

        // 这里可以执行积分的增加
        $sql = "UPDATE users SET points = points + ? WHERE id = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("ii", $amount * 10, $user_id);
        $stmt->execute();

        // 插入充值记录
        $sql = "INSERT INTO recharge_records (user_id, amount, points, method) VALUES (?, ?, ?, 'credit_card')";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("idi", $user_id, $amount, $amount * 10);
        $stmt->execute();
    }
} catch (Exception $e) {
    echo 'Webhook Error: ' . $e->getMessage();
    http_response_code(400);  // 返回 400 错误
    exit();
}

http_response_code(200);  // 返回 200 响应

2. PayPal 支付集成
PayPal 支付集成的步骤类似。你需要首先创建一个 PayPal 商家账户,并获得 API 密钥。PayPal 提供了 REST API,可以通过它实现支付。

2.1 PayPal 支付请求示例 (paypal_payment.php)

<?php
$clientId = 'your_paypal_client_id';
$secret = 'your_paypal_secret';
$paypalUrl = 'https://api.sandbox.paypal.com/v1/payments/payment';  // 沙盒环境

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $amount = $_POST['amount'];

    // 获取 access_token
    $ch = curl_init('https://api.sandbox.paypal.com/v1/oauth2/token');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERPWD, $clientId . ":" . $secret);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=client_credentials');
    $response = curl_exec($ch);
    $responseData = json_decode($response);
    $accessToken = $responseData->access_token;

    // 创建支付请求
    $paymentData = [
        'intent' => 'sale',
        'payer' => [
            'payment_method' => 'paypal',
        ],
        'transactions' => [
            [
                'amount' => [
                    'total' => $amount,
                    'currency' => 'USD',
                ],
                'description' => '充值积分',
            ],
        ],
        'redirect_urls' => [
            'return_url' => 'http://yourdomain.com/paypal_success.php',
            'cancel_url' => 'http://yourdomain.com/paypal_cancel.php',
        ],
    ];

    $ch = curl_init($paypalUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Bearer ' . $accessToken]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($paymentData));
    $response = curl_exec($ch);
    $payment = json_decode($response);

    // 获取支付链接
    foreach ($payment->links as $link) {
        if ($link->rel == 'approval_url') {
            header('Location: ' . $link->href);  // 重定向到 PayPal 进行支付
            exit();
        }
    }
}
?>
<form method="POST">
    充值金额: <input type="number" name="amount" step="0.01" required><br>
    <input type="submit" value="进行支付">
</form>

3. 比特币支付 (通过 Coinbase 或其他加密货币支付网关)
比特币支付通常通过服务提供商,如 Coinbase、BitPay 等集成。你需要注册并获取 API 密钥。以 Coinbase Commerce 为例,你可以创建一个付款按钮并使用它的 API 发起支付。

3.1 比特币支付集成示例

// Coinbase Commerce API 集成
$client = new \CoinbaseCommerce\ApiClient();
$client->setApiKey('your_coinbase_api_key');

$chargeData = [
    'name' => '充值积分',
    'description' => '充值积分 10 美元 = 100 积分',
    'pricing_type' => 'fixed_price',
    'local_price' => [
        'amount' => '10.00',
        'currency' => 'USD',
    ],
    'metadata' => [
        'user_id' => 123,  // 用户ID
   
Posted in PHP