203 lines
6.1 KiB
Python
203 lines
6.1 KiB
Python
|
|
"""
|
|||
|
|
微信小程序 HTTPS 后端服务器示例
|
|||
|
|
支持 Flask 和 FastAPI 两种框架
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
# ==================== Flask 版本 ====================
|
|||
|
|
from flask import Flask, jsonify, request
|
|||
|
|
from flask_cors import CORS
|
|||
|
|
import ssl
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
app = Flask(__name__)
|
|||
|
|
# 配置 CORS,允许微信小程序访问
|
|||
|
|
CORS(app, resources={
|
|||
|
|
r"/api/*": {
|
|||
|
|
"origins": "*", # 生产环境建议指定具体域名
|
|||
|
|
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
|||
|
|
"allow_headers": ["Content-Type", "Authorization"]
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
@app.route('/api/test', methods=['GET'])
|
|||
|
|
def test():
|
|||
|
|
"""测试接口"""
|
|||
|
|
return jsonify({
|
|||
|
|
'code': 200,
|
|||
|
|
'message': 'HTTPS 接口测试成功',
|
|||
|
|
'data': {
|
|||
|
|
'timestamp': request.headers.get('X-Request-Time', ''),
|
|||
|
|
'user_agent': request.headers.get('User-Agent', '')
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
@app.route('/api/user/login', methods=['POST'])
|
|||
|
|
def login():
|
|||
|
|
"""登录接口示例"""
|
|||
|
|
data = request.get_json()
|
|||
|
|
username = data.get('username', '')
|
|||
|
|
password = data.get('password', '')
|
|||
|
|
|
|||
|
|
# 这里添加您的登录逻辑
|
|||
|
|
if username and password:
|
|||
|
|
return jsonify({
|
|||
|
|
'code': 200,
|
|||
|
|
'message': '登录成功',
|
|||
|
|
'data': {
|
|||
|
|
'token': 'example_token_12345',
|
|||
|
|
'user_id': 1
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
else:
|
|||
|
|
return jsonify({
|
|||
|
|
'code': 400,
|
|||
|
|
'message': '用户名或密码不能为空'
|
|||
|
|
}), 400
|
|||
|
|
|
|||
|
|
@app.route('/api/health', methods=['GET'])
|
|||
|
|
def health():
|
|||
|
|
"""健康检查接口"""
|
|||
|
|
return jsonify({
|
|||
|
|
'status': 'healthy',
|
|||
|
|
'service': 'wechat-miniprogram-api'
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
def run_flask_server():
|
|||
|
|
"""运行 Flask HTTPS 服务器"""
|
|||
|
|
# SSL 证书路径(根据您的实际情况修改)
|
|||
|
|
cert_file = os.getenv('SSL_CERT', '/etc/letsencrypt/live/yourdomain.com/fullchain.pem')
|
|||
|
|
key_file = os.getenv('SSL_KEY', '/etc/letsencrypt/live/yourdomain.com/privkey.pem')
|
|||
|
|
|
|||
|
|
# 检查证书文件是否存在
|
|||
|
|
if not os.path.exists(cert_file) or not os.path.exists(key_file):
|
|||
|
|
print(f"警告:证书文件不存在!")
|
|||
|
|
print(f"证书路径: {cert_file}")
|
|||
|
|
print(f"私钥路径: {key_file}")
|
|||
|
|
print("请先配置 SSL 证书,或使用 Nginx 反向代理")
|
|||
|
|
# 开发环境可以运行 HTTP(仅用于测试)
|
|||
|
|
app.run(host='0.0.0.0', port=8000, debug=True)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
# 配置 SSL
|
|||
|
|
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
|||
|
|
context.load_cert_chain(cert_file, key_file)
|
|||
|
|
|
|||
|
|
print("启动 Flask HTTPS 服务器...")
|
|||
|
|
print(f"访问地址: https://yourdomain.com/api/test")
|
|||
|
|
|
|||
|
|
app.run(
|
|||
|
|
host='0.0.0.0',
|
|||
|
|
port=443,
|
|||
|
|
ssl_context=context,
|
|||
|
|
debug=False # 生产环境设为 False
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ==================== FastAPI 版本 ====================
|
|||
|
|
try:
|
|||
|
|
from fastapi import FastAPI, Request
|
|||
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|||
|
|
from fastapi.responses import JSONResponse
|
|||
|
|
import uvicorn
|
|||
|
|
|
|||
|
|
fastapi_app = FastAPI(title="微信小程序 API", version="1.0.0")
|
|||
|
|
|
|||
|
|
# 配置 CORS
|
|||
|
|
fastapi_app.add_middleware(
|
|||
|
|
CORSMiddleware,
|
|||
|
|
allow_origins=["*"], # 生产环境建议指定具体域名
|
|||
|
|
allow_credentials=True,
|
|||
|
|
allow_methods=["*"],
|
|||
|
|
allow_headers=["*"],
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
@fastapi_app.get("/api/test")
|
|||
|
|
async def test_api(request: Request):
|
|||
|
|
"""测试接口"""
|
|||
|
|
return {
|
|||
|
|
'code': 200,
|
|||
|
|
'message': 'HTTPS 接口测试成功',
|
|||
|
|
'data': {
|
|||
|
|
'timestamp': request.headers.get('x-request-time', ''),
|
|||
|
|
'user_agent': request.headers.get('user-agent', '')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@fastapi_app.post("/api/user/login")
|
|||
|
|
async def login_api(data: dict):
|
|||
|
|
"""登录接口示例"""
|
|||
|
|
username = data.get('username', '')
|
|||
|
|
password = data.get('password', '')
|
|||
|
|
|
|||
|
|
if username and password:
|
|||
|
|
return {
|
|||
|
|
'code': 200,
|
|||
|
|
'message': '登录成功',
|
|||
|
|
'data': {
|
|||
|
|
'token': 'example_token_12345',
|
|||
|
|
'user_id': 1
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else:
|
|||
|
|
return JSONResponse(
|
|||
|
|
status_code=400,
|
|||
|
|
content={
|
|||
|
|
'code': 400,
|
|||
|
|
'message': '用户名或密码不能为空'
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
@fastapi_app.get("/api/health")
|
|||
|
|
async def health_check():
|
|||
|
|
"""健康检查接口"""
|
|||
|
|
return {
|
|||
|
|
'status': 'healthy',
|
|||
|
|
'service': 'wechat-miniprogram-api'
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def run_fastapi_server():
|
|||
|
|
"""运行 FastAPI HTTPS 服务器"""
|
|||
|
|
cert_file = os.getenv('SSL_CERT', '/etc/letsencrypt/live/yourdomain.com/fullchain.pem')
|
|||
|
|
key_file = os.getenv('SSL_KEY', '/etc/letsencrypt/live/yourdomain.com/privkey.pem')
|
|||
|
|
|
|||
|
|
if not os.path.exists(cert_file) or not os.path.exists(key_file):
|
|||
|
|
print(f"警告:证书文件不存在!")
|
|||
|
|
print(f"证书路径: {cert_file}")
|
|||
|
|
print(f"私钥路径: {key_file}")
|
|||
|
|
print("请先配置 SSL 证书,或使用 Nginx 反向代理")
|
|||
|
|
# 开发环境可以运行 HTTP(仅用于测试)
|
|||
|
|
uvicorn.run(fastapi_app, host="0.0.0.0", port=8000)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
print("启动 FastAPI HTTPS 服务器...")
|
|||
|
|
print(f"访问地址: https://yourdomain.com/api/test")
|
|||
|
|
|
|||
|
|
uvicorn.run(
|
|||
|
|
fastapi_app,
|
|||
|
|
host="0.0.0.0",
|
|||
|
|
port=443,
|
|||
|
|
ssl_keyfile=key_file,
|
|||
|
|
ssl_certfile=cert_file
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
except ImportError:
|
|||
|
|
print("FastAPI 未安装,跳过 FastAPI 示例")
|
|||
|
|
print("安装命令: pip install fastapi uvicorn")
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ==================== 主程序 ====================
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
# 选择框架:'flask' 或 'fastapi'
|
|||
|
|
framework = os.getenv('FRAMEWORK', 'flask').lower()
|
|||
|
|
|
|||
|
|
if framework == 'fastapi':
|
|||
|
|
try:
|
|||
|
|
run_fastapi_server()
|
|||
|
|
except NameError:
|
|||
|
|
print("FastAPI 未安装,使用 Flask")
|
|||
|
|
run_flask_server()
|
|||
|
|
else:
|
|||
|
|
run_flask_server()
|