mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 12:57:32 +08:00
252 lines
6.9 KiB
Markdown
252 lines
6.9 KiB
Markdown
# 建行生活 H5 商城对接实施指南
|
||
|
||
## 项目概述
|
||
|
||
本文档描述了 Shopro 商城系统与建行生活 App 的完整对接方案实现。所有代码已根据您的实际数据库结构进行调整,确保与现有系统完美兼容。
|
||
|
||
## 已实现功能清单
|
||
|
||
### 1. 核心加密模块
|
||
- ✅ **RSA 加密解密** (`CcbRSA.php`):支持 1024 位 RSA,117/128 字节分段处理
|
||
- ✅ **MD5 签名** (`CcbMD5.php`):API 消息签名和支付串签名
|
||
- ✅ **URL 参数解密** (`CcbUrlDecrypt.php`):双层 BASE64 + DES 解密
|
||
|
||
### 2. 业务服务类
|
||
- ✅ **HTTP 客户端** (`CcbHttpClient.php`):处理与建行 API 的通信
|
||
- ✅ **订单服务** (`CcbOrderService.php`):订单推送、查询、状态更新、退款
|
||
- ✅ **支付服务** (`CcbPaymentService.php`):支付串生成、回调处理、支付验证
|
||
|
||
### 3. 控制器接口
|
||
- ✅ **用户登录** (`Ccblife.php`):建行用户登录、自动登录、用户绑定
|
||
- ✅ **支付处理** (`Ccbpayment.php`):生成支付串、处理回调、推送订单
|
||
- ✅ **测试接口** (`Ccbtest.php`):全面的功能测试接口
|
||
|
||
### 4. 前端集成
|
||
- ✅ **JSBridge 库** (`ccblife-bridge.js`):封装建行原生交互功能
|
||
- ✅ **示例页面** (`ccblife-demo.html`):演示如何使用 JSBridge
|
||
|
||
## 数据库结构(已执行)
|
||
|
||
### 用户表改造
|
||
```sql
|
||
ALTER TABLE `fa_user`
|
||
ADD COLUMN `ccb_user_id` varchar(50) DEFAULT NULL COMMENT '建行用户ID';
|
||
```
|
||
|
||
### 订单表改造
|
||
```sql
|
||
ALTER TABLE `fa_shopro_order`
|
||
ADD COLUMN `ccb_user_id` varchar(30) DEFAULT NULL COMMENT '建行用户ID',
|
||
ADD COLUMN `ccb_pay_flow_id` varchar(50) DEFAULT NULL COMMENT '建行支付流水号',
|
||
ADD COLUMN `ccb_sync_status` tinyint(1) DEFAULT '0' COMMENT '建行同步状态',
|
||
ADD COLUMN `ccb_sync_time` int(11) DEFAULT NULL COMMENT '建行同步时间';
|
||
```
|
||
|
||
### 支付日志表
|
||
```sql
|
||
-- fa_ccb_payment_log 表用于记录支付流水
|
||
```
|
||
|
||
### 同步日志表
|
||
```sql
|
||
-- fa_ccb_sync_log 表用于记录与建行的同步日志
|
||
```
|
||
|
||
## 配置说明
|
||
|
||
配置文件位置:`/addons/shopro/config/ccblife.php`
|
||
|
||
关键配置项(从 .env 读取):
|
||
- `CCB_SERVICE_ID`: 服务方编号(生产:YS44000009001853)
|
||
- `CCB_MERCHANT_ID`: 商户号
|
||
- `CCB_POS_ID`: POS 号
|
||
- `CCB_BRANCH_ID`: 分行号
|
||
- `CCB_PRIVATE_KEY`: RSA 私钥(BASE64 格式)
|
||
- `CCB_PUBLIC_KEY`: RSA 公钥(BASE64 格式)
|
||
|
||
## 接口调用流程
|
||
|
||
### 1. 用户登录流程
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant U as 用户
|
||
participant CCB as 建行App
|
||
participant H5 as H5商城
|
||
participant API as 后端API
|
||
participant DB as 数据库
|
||
|
||
U->>CCB: 点击进入商城
|
||
CCB->>H5: 跳转URL(携带ccbParamSJ)
|
||
H5->>API: 调用 /ccblife/login
|
||
API->>API: 解密ccbParamSJ参数
|
||
API->>DB: 查询/创建用户
|
||
DB-->>API: 返回用户信息
|
||
API->>API: 生成Token
|
||
API-->>H5: 返回Token和用户信息
|
||
H5-->>U: 显示商城首页
|
||
```
|
||
|
||
### 2. 支付流程
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant U as 用户
|
||
participant H5 as H5商城
|
||
participant API as 后端API
|
||
participant CCB as 建行App
|
||
participant CCBAPI as 建行API
|
||
|
||
U->>H5: 提交订单
|
||
H5->>API: 创建订单
|
||
API-->>H5: 返回订单信息
|
||
H5->>API: 请求支付串 /ccbpayment/createPayment
|
||
API->>API: 生成支付串和MAC签名
|
||
API-->>H5: 返回支付串
|
||
H5->>CCB: 调用JSBridge发起支付
|
||
CCB->>U: 显示收银台
|
||
U->>CCB: 确认支付
|
||
CCB->>CCBAPI: 处理支付
|
||
CCBAPI-->>CCB: 支付结果
|
||
CCB->>H5: 返回支付结果
|
||
H5->>API: 回调 /ccbpayment/callback
|
||
API->>CCBAPI: 验证支付结果
|
||
API->>API: 更新订单状态
|
||
API->>CCBAPI: 推送订单信息
|
||
API-->>H5: 返回最终结果
|
||
```
|
||
|
||
## 测试步骤
|
||
|
||
### 1. 环境检查
|
||
访问:`http://fengketrade.test/addons/shopro/ccbtest`
|
||
|
||
检查项:
|
||
- 配置检查:`/ccbtest/checkConfig`
|
||
- 数据库检查:`/ccbtest/checkDatabase`
|
||
|
||
### 2. 功能测试
|
||
|
||
#### 基础功能
|
||
- RSA 测试:`/ccbtest/testRsa`
|
||
- MD5 测试:`/ccbtest/testMd5`
|
||
- URL 解密:`/ccbtest/testUrlDecrypt`
|
||
|
||
#### 业务功能
|
||
- 用户登录:`POST /ccbtest/testUserLogin`
|
||
- 订单推送:`/ccbtest/testOrderPush?order_id=1`
|
||
- 支付串生成:`/ccbtest/testPaymentString?order_id=1`
|
||
|
||
### 3. 前端测试
|
||
1. 访问示例页面:`http://fengketrade.test/ccblife-demo.html`
|
||
2. 测试各项功能:
|
||
- 检测运行环境
|
||
- 获取用户信息
|
||
- 自动登录
|
||
- 模拟支付
|
||
|
||
## 前端集成示例
|
||
|
||
### 初始化 JSBridge
|
||
```javascript
|
||
// 在页面加载时初始化
|
||
CcbLifeBridge.init({
|
||
debug: true,
|
||
apiBaseUrl: '/addons/shopro'
|
||
});
|
||
```
|
||
|
||
### 获取用户信息
|
||
```javascript
|
||
CcbLifeBridge.getUserInfo(function(result) {
|
||
if (result.success) {
|
||
console.log('用户信息:', result.data);
|
||
// result.data 包含: ccb_user_id, mobile, nickname, avatar
|
||
}
|
||
});
|
||
```
|
||
|
||
### 调起支付
|
||
```javascript
|
||
// 先调用后端生成支付串
|
||
fetch('/addons/shopro/ccbpayment/createPayment', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'token': localStorage.getItem('ccb_token')
|
||
},
|
||
body: JSON.stringify({ order_id: orderId })
|
||
})
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
if (data.code === 1) {
|
||
// 调起建行支付
|
||
CcbLifeBridge.payment({
|
||
payment_string: data.data.payment_string
|
||
}, function(result) {
|
||
if (result.success) {
|
||
// 支付成功,通知后端
|
||
notifyPaymentSuccess(orderId);
|
||
}
|
||
});
|
||
}
|
||
});
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
### 1. 安全要求
|
||
- 所有敏感配置必须存储在 `.env` 文件中
|
||
- RSA 密钥必须是 BASE64 格式(不含 PEM 头尾)
|
||
- 生产环境必须启用 HTTPS
|
||
|
||
### 2. 数据同步
|
||
- 订单状态变更必须同步到建行
|
||
- 使用 `fa_ccb_sync_log` 表记录所有同步操作
|
||
- 支持批量同步未同步的订单
|
||
|
||
### 3. 错误处理
|
||
- 所有 API 调用都有重试机制(默认 3 次)
|
||
- 失败的同步任务会记录到日志表
|
||
- 支付失败需要明确提示用户
|
||
|
||
### 4. 兼容性
|
||
- iOS:通过 URL Scheme 调起支付(comccbpay://)
|
||
- Android:通过 window.mbspay 对象调用
|
||
- H5:在非建行环境降级处理
|
||
|
||
## 部署检查清单
|
||
|
||
- [ ] 确认 `.env` 配置正确
|
||
- [ ] 数据库表结构已更新
|
||
- [ ] RSA 密钥已配置
|
||
- [ ] HTTPS 证书已安装
|
||
- [ ] 前端 JS 文件已部署
|
||
- [ ] 测试接口访问正常
|
||
- [ ] 日志目录可写
|
||
|
||
## 常见问题
|
||
|
||
### Q: RSA 加密失败
|
||
A: 检查密钥格式是否为 BASE64,不要包含 PEM 头尾标记
|
||
|
||
### Q: 用户登录失败
|
||
A: 确认 ccbParamSJ 参数正确,服务方编号与配置一致
|
||
|
||
### Q: 订单推送失败
|
||
A: 检查必需的 34 个字段是否都已填充,特别注意日期格式
|
||
|
||
### Q: 支付无响应
|
||
A: 确认在建行 App 内访问,检查 JSBridge 是否就绪
|
||
|
||
## 技术支持
|
||
|
||
如有问题,请检查:
|
||
1. 系统日志:`runtime/log/ccblife/`
|
||
2. 同步日志:`fa_ccb_sync_log` 表
|
||
3. 支付日志:`fa_ccb_payment_log` 表
|
||
|
||
---
|
||
|
||
*最后更新:2025-01-17*
|
||
*作者:Billy* |