一、项目背景与目标
1.1 合作背景
微爱帮监狱寄信写信小程序与焦作市邮政管理局、焦作邮政支局建立战略合作,实现"线上电子化-线下实体化"的监狱信件流转闭环,确保信件安全、合规、可追溯。
1.2 技术目标
三方系统对接目标:
┌─────────────────┬─────────────────────────────┐
│ 对接方 │ 技术目标 │
├─────────────────┼─────────────────────────────┤
│ 微爱帮平台 │ 生成标准加密信件文件 │
│ 焦作邮政管理局 │ 监管审核与数据备案 │
│ 焦作邮政支局 │ 物理打印与物流录入 │
│ 中国邮政系统 │ 物流轨迹追踪与信息同步 │
└─────────────────┴─────────────────────────────┘
二、整体技术架构
2.1 系统对接架构
┌─────────────────────────────────────────┐
│ 微爱帮平台(云端) │
│ 信件生成 → 加密打包 → 数字签名 │
└───────────────┬─────────────────────────┘
│ HTTPS双向认证 + 国密加密
▼
┌─────────────────────────────────────────┐
│ 焦作市邮政管理局安全网关 │
│ 等保3.0合规区 → 监管审核 → 数据备案 │
└───────────────┬─────────────────────────┘
│ 政务专线 + 数字证书
▼
┌─────────────────────────────────────────┐
│ 焦作邮政支局内网系统 │
│ 文件解密 → 安全打印 → 物流录入 │
└───────────────┬─────────────────────────┘
│ 邮政内网专线
▼
┌─────────────────────────────────────────┐
│ 中国邮政物流系统 │
│ 运单生成 → 轨迹跟踪 → 状态回传 │
└─────────────────────────────────────────┘
2.2 数据流转流程

三、安全技术标准
3.1 等保3.0合规要求
安全等级: 第三级
合规领域:
物理安全:
- 邮政支局专用安全打印室
- 视频监控与门禁系统
- 防电磁泄漏设备
网络安全:
- 政务外网与互联网物理隔离
- 边界防火墙策略
- VPN加密隧道
主机安全:
- 国产化操作系统(麒麟/统信)
- 安全基线配置
- 防病毒软件
应用安全:
- 双向数字证书认证
- 国密算法加密
- 完整操作审计
数据安全:
- 信件内容加密存储
- 数据传输加密
- 防篡改签名机制
3.2 HTTPS配置规范
# 焦作邮政管理局服务器HTTPS配置
server {
listen 443 ssl http2;
server_name jz.post.weiaibang.com;
# EV SSL证书
ssl_certificate /etc/ssl/jiaozuo_post/ev_cert.pem;
ssl_certificate_key /etc/ssl/jiaozuo_post/private.key;
# 强制使用TLS 1.2+
ssl_protocols TLSv1.2 TLSv1.3;
# 国密算法优先
ssl_ciphers 'ECDHE-SM4-SM3:ECDHE-SM4-GCM-SM3:ECDHE-RSA-AES256-GCM-SHA384';
# 双向证书验证
ssl_verify_client on;
ssl_client_certificate /etc/ssl/jiaozuo_post/ca.crt;
# HSTS头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 微爱帮API接口
location /api/v1/letters {
# 验证微爱帮客户端证书
if ($ssl_client_verify != SUCCESS) {
return 403;
}
# 请求限制
limit_req zone=post_api burst=10 nodelay;
# 代理到内部处理服务
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Client-Cert $ssl_client_cert;
}
}
四、信件数据标准
4.1 加密信件包结构
# 信件包数据结构
class EncryptedLetterPackage:
"""加密信件包(符合邮政标准)"""
def __init__(self):
# 信封信息(明文字段)
self.envelope = {
"version": "1.0",
"package_id": self.generate_package_id(),
"create_time": datetime.now().isoformat(),
"post_office_code": "410800", # 焦作邮政代码
"dest_post_office": "410802", # 目标支局代码
"priority": "normal", # 优先级
"security_level": "confidential" # 密级
}
# 信件内容(加密字段)
self.encrypted_content = {
"letter_id": "", # 信件ID
"inmate_info": {}, # 服刑人员信息
"family_info": {}, # 家属信息
"letter_content": "", # 信件正文
"attachments": [], # 附件列表
"audit_log": [] # 审核记录
}
# 安全控制字段
self.security = {
"encryption_algorithm": "SM4-GCM",
"key_id": "", # 加密密钥ID
"digital_signature": "", # 数字签名
"hash_value": "", # 内容哈希
"timestamp": int(time.time())
}
def to_postal_format(self):
"""转换为邮政标准格式"""
return {
"header": {
"format_version": "JZPOST-1.0",
"data_type": "PRISON_LETTER",
"encoding": "UTF-8"
},
"transport_info": self.envelope,
"encrypted_data": {
"ciphertext": self.encrypt_content(),
"iv": self.generate_iv(),
"tag": self.generate_auth_tag()
},
"verification": {
"signature": self.generate_signature(),
"certificate_chain": self.get_certificate_chain(),
"timestamp": self.security["timestamp"]
},
"barcode_info": self.generate_barcode()
}
def generate_barcode(self):
"""生成邮政标准条形码"""
# 格式: JZP[年份][月日][序列号][校验位]
barcode_data = {
"type": "128B",
"content": f"JZP{datetime.now().strftime('%y%m%d')}{self.envelope['package_id'][-6:]}",
"check_digit": self.calculate_check_digit()
}
return barcode_data
4.2 物流信息对接标准
{
"logistics_info": {
"waybill_number": "YT1234567890123",
"post_office_code": "410802",
"operator_id": "JZYZ001",
"operation_time": "2025-01-15T14:30:00+08:00",
"sender_info": {
"name": "焦作邮政支局监狱通信专窗",
"address": "河南省焦作市解放区邮政支局",
"phone": "0391-2912345",
"postcode": "454000"
},
"receiver_info": {
"prison_name": "焦作焦南监狱",
"department": "狱政科通信办",
"address": "河南省焦作市监狱路1号",
"contact": "王警官",
"postcode": "454150"
},
"parcel_info": {
"weight": 0.02,
"size": "A4",
"package_type": "信件",
"declared_value": 0,
"special_handling": "监所邮件"
},
"tracking_events": [
{
"event_code": "ACCEPTED",
"event_time": "2025-01-15T14:35:00+08:00",
"location": "焦作邮政支局",
"operator": "张处理员",
"remark": "收寄成功"
}
]
}
}
五、系统对接实现
5.1 微爱帮平台输出模块
# 微爱帮邮政对接模块
class PostalExportService:
"""邮政信件导出服务"""
def __init__(self):
self.sm4_cipher = SM4Cipher()
self.cert_manager = CertificateManager()
self.postal_api = PostalAPIClient()
def export_to_postal(self, letter_data: dict) -> dict:
"""导出信件到邮政系统"""
try:
# 1. 数据验证与清洗
validated_data = self.validate_letter_data(letter_data)
# 2. 生成加密信件包
letter_package = EncryptedLetterPackage()
letter_package.load_data(validated_data)
# 3. 数字签名
signature = self.cert_manager.sign(
letter_package.to_json(),
private_key="weiaibang_postal_key"
)
letter_package.security["digital_signature"] = signature
# 4. 生成最终输出文件
output_files = self.generate_output_files(letter_package)
# 5. 传输到邮政管理局
transfer_result = self.transfer_to_post_bureau(output_files)
# 6. 记录传输日志
self.log_transfer(letter_data["letter_id"], transfer_result)
return {
"success": True,
"package_id": letter_package.envelope["package_id"],
"transfer_id": transfer_result["transfer_id"],
"postal_receipt": transfer_result["receipt"]
}
except Exception as e:
logger.error(f"邮政导出失败: {str(e)}")
return {
"success": False,
"error": str(e),
"retry_count": self.get_retry_count(letter_data["letter_id"])
}
def generate_output_files(self, package: EncryptedLetterPackage) -> dict:
"""生成输出文件集"""
return {
# 主数据文件(加密JSON)
"data_file": {
"filename": f"{package.envelope['package_id']}.json.enc",
"content": package.to_postal_format(),
"mime_type": "application/json"
},
# 打印文件(PDF格式,含条码)
"print_file": {
"filename": f"{package.envelope['package_id']}.pdf",
"content": self.generate_printable_pdf(package),
"mime_type": "application/pdf"
},
# 清单文件(供邮局核对)
"manifest_file": {
"filename": f"{package.envelope['package_id']}.manifest",
"content": self.generate_manifest(package),
"mime_type": "text/plain"
},
# 校验文件(MD5校验)
"checksum_file": {
"filename": f"{package.envelope['package_id']}.md5",
"content": self.calculate_checksums(package),
"mime_type": "text/plain"
}
}
def transfer_to_post_bureau(self, files: dict) -> dict:
"""传输到邮政管理局"""
# 使用HTTPS客户端传输
client = PostalHTTPSClient(
base_url="https://jz.post.weiaibang.com",
cert_path="/etc/ssl/weiaibang/client.pem",