mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 21:03:17 +08:00
357 lines
9.5 KiB
Markdown
357 lines
9.5 KiB
Markdown
|
|
# 建行相关App服务方接入文档分析
|
|||
|
|
|
|||
|
|
## 一、文档概述
|
|||
|
|
|
|||
|
|
这份文档(v2.20_20250725)是建行生活App和中国建设银行App的服务方接入指南,涵盖了:
|
|||
|
|
- 环境识别方法
|
|||
|
|
- 收银台调用方式
|
|||
|
|
- 支付参数规范
|
|||
|
|
- 接口地址和协议
|
|||
|
|
|
|||
|
|
## 二、关键接口地址(确认)
|
|||
|
|
|
|||
|
|
### 2.1 后台接口地址
|
|||
|
|
|
|||
|
|
| 环境 | 地址 | 用途 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| **测试环境** | `http://124.127.94.60:18088/uat_new/tp_service/txCtrl/server?txcode=xxx` | 后台交易接口 |
|
|||
|
|
| **生产环境** | `https://yunbusiness.ccb.com/tp_service/txCtrl/server?txcode=xxx` | 后台交易接口 |
|
|||
|
|
|
|||
|
|
### 2.2 前端收银台地址
|
|||
|
|
|
|||
|
|
| 环境 | 地址 | 用途 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| **测试环境** | `http://124.127.94.60:18088/uat_new/clp_service/txCtrl` | 收银台处理URL |
|
|||
|
|
| **生产环境** | `https://yunbusiness.ccb.com/clp_service/txCtrl` | 收银台处理URL |
|
|||
|
|
|
|||
|
|
**调用格式**:
|
|||
|
|
```
|
|||
|
|
url?txcode=A3341OM01&svcid=服务方编号&cnt=加密内容&mac=签名
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 三、H5商城在建行App中的运行机制
|
|||
|
|
|
|||
|
|
### 3.1 环境识别
|
|||
|
|
|
|||
|
|
#### 建行生活App识别:
|
|||
|
|
```javascript
|
|||
|
|
// 方法1:检查URL参数
|
|||
|
|
if (location.search.includes('platform=ccblife')) {
|
|||
|
|
console.log('在建行生活App中');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 方法2:检查UA(更准确)
|
|||
|
|
window.CCBBridge.requestNative(JSON.stringify({
|
|||
|
|
action: "getUA",
|
|||
|
|
params: {}
|
|||
|
|
}), "getUACallBack");
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 中国建设银行App识别:
|
|||
|
|
```javascript
|
|||
|
|
// 检查URL参数中是否有platform=ccb
|
|||
|
|
if (location.search.includes('platform=ccb')) {
|
|||
|
|
console.log('在中国建设银行App中');
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.2 跳转URL格式
|
|||
|
|
|
|||
|
|
建行App跳转到H5商城时,URL格式为:
|
|||
|
|
```
|
|||
|
|
https://your-h5-mall.com?platform=ccblife&channel=mbs&ccbParamSJ=xxx&CITYID=330100&USERCITYID=440100
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**参数说明**:
|
|||
|
|
- `platform`:平台标识(ccblife或ccb)
|
|||
|
|
- `ccbParamSJ`:加密参数串(包含用户信息)
|
|||
|
|
- `CITYID`:用户所在城市
|
|||
|
|
- `USERCITYID`:用户选择城市
|
|||
|
|
|
|||
|
|
## 四、支付接入详解
|
|||
|
|
|
|||
|
|
### 4.1 调起收银台方法
|
|||
|
|
|
|||
|
|
#### 在建行生活App中(iOS):
|
|||
|
|
```javascript
|
|||
|
|
function MBS_DIRECT_PAY(payInfo) {
|
|||
|
|
// payInfo为支付参数串
|
|||
|
|
window.location = "mbspay://direct?" + payInfo;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 在建行生活App中(Android):
|
|||
|
|
```javascript
|
|||
|
|
function MBS_DIRECT_PAY(payInfo) {
|
|||
|
|
window.mbspay.directpay(payInfo);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 在中国建设银行App中:
|
|||
|
|
需要先进行RSA加密,然后跳转到收银台URL:
|
|||
|
|
```javascript
|
|||
|
|
// 1. 组装支付参数
|
|||
|
|
// 2. RSA加密
|
|||
|
|
// 3. 跳转到收银台URL
|
|||
|
|
window.location = 'https://yunbusiness.ccb.com/clp_service/txCtrl?txcode=A3341OM01&svcid=' + serviceId + '&cnt=' + encryptedData + '&mac=' + signature;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 支付参数详解
|
|||
|
|
|
|||
|
|
#### 必需参数:
|
|||
|
|
| 字段 | 说明 | 示例 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| MERCHANTID | 商户代码 | 由建行分配 |
|
|||
|
|
| POSID | 柜台代码 | 由建行分配 |
|
|||
|
|
| BRANCHID | 分行代码 | 由建行分配 |
|
|||
|
|
| ORDERID | 订单号 | 商户订单号 |
|
|||
|
|
| PAYMENT | 支付金额 | 单位:元 |
|
|||
|
|
| CURCODE | 币种 | 01-人民币 |
|
|||
|
|
| REMARK2 | 备注2 | **填写服务方编号(YS开头)** |
|
|||
|
|
| MAC | MD5签名 | 见签名规则 |
|
|||
|
|
| ENCPUB | 商户公钥密文 | RSA加密后的公钥 |
|
|||
|
|
|
|||
|
|
#### 重要字段说明:
|
|||
|
|
- **REMARK2必须填写服务方编号**(如:YS44000098000600)
|
|||
|
|
- **NOTIFY_URL**:支付通知回调地址(生产环境必须HTTPS)
|
|||
|
|
- **PAYSUCCESSURL**:支付成功页面(可选)
|
|||
|
|
|
|||
|
|
### 4.3 支付成功回调设置
|
|||
|
|
|
|||
|
|
在调起收银台前,设置回调地址:
|
|||
|
|
```javascript
|
|||
|
|
var requestObj = {
|
|||
|
|
action: 'setCache',
|
|||
|
|
params: {
|
|||
|
|
key: 'YS44000098000600', // 服务方编号,与REMARK2一致
|
|||
|
|
value: 'https://your-domain.com/payment/success' // 回调URL
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
window.CCBBridge.requestNative(JSON.stringify(requestObj), 'callBackName');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.4 签名生成规则
|
|||
|
|
|
|||
|
|
MD5签名生成步骤:
|
|||
|
|
1. 按参数名ASCII排序拼接成字符串
|
|||
|
|
2. 在字符串末尾加上服务方公钥
|
|||
|
|
3. 使用MD5算法生成签名
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
// PHP示例
|
|||
|
|
$params = [
|
|||
|
|
'MERCHANTID' => '105910100194086',
|
|||
|
|
'POSID' => '313368474',
|
|||
|
|
'ORDERID' => 'ORD123456',
|
|||
|
|
// ... 其他参数
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// 1. 排序并拼接
|
|||
|
|
ksort($params);
|
|||
|
|
$signStr = http_build_query($params);
|
|||
|
|
|
|||
|
|
// 2. 加上服务方公钥
|
|||
|
|
$signStr .= '&PLATFORMPUB=' . $platformPublicKey;
|
|||
|
|
|
|||
|
|
// 3. 生成MD5
|
|||
|
|
$mac = md5($signStr . $privateKey);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 五、完整对接流程
|
|||
|
|
|
|||
|
|
### 5.1 业务流程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant User as 用户
|
|||
|
|
participant H5 as H5商城
|
|||
|
|
participant Backend as 服务方后台
|
|||
|
|
participant CCBApp as 建行App
|
|||
|
|
participant CCBServer as 建行服务器
|
|||
|
|
|
|||
|
|
User->>CCBApp: 打开建行App
|
|||
|
|
CCBApp->>H5: 跳转H5商城(带参数)
|
|||
|
|
H5->>H5: 识别运行环境
|
|||
|
|
User->>H5: 选购商品
|
|||
|
|
H5->>Backend: 创建订单
|
|||
|
|
Backend->>CCBServer: 推送订单(A3341TP01)
|
|||
|
|
Backend-->>H5: 返回支付参数
|
|||
|
|
H5->>CCBApp: 调起收银台
|
|||
|
|
User->>CCBApp: 确认支付
|
|||
|
|
CCBApp->>CCBServer: 支付请求
|
|||
|
|
CCBServer-->>Backend: 支付通知
|
|||
|
|
CCBServer-->>CCBApp: 支付结果
|
|||
|
|
CCBApp-->>H5: 跳转回调页
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.2 接入步骤
|
|||
|
|
|
|||
|
|
1. **环境准备**
|
|||
|
|
- 申请服务方编号(YS开头)
|
|||
|
|
- 生成RSA密钥对
|
|||
|
|
- 获取建行平台公钥
|
|||
|
|
|
|||
|
|
2. **H5页面适配**
|
|||
|
|
- 识别运行环境
|
|||
|
|
- 实现收银台调用方法
|
|||
|
|
- 设置支付回调
|
|||
|
|
|
|||
|
|
3. **后端接口开发**
|
|||
|
|
- 实现订单推送接口
|
|||
|
|
- 实现支付参数生成
|
|||
|
|
- 处理支付通知
|
|||
|
|
|
|||
|
|
4. **测试验证**
|
|||
|
|
- 在UAT环境测试
|
|||
|
|
- 验证支付流程
|
|||
|
|
- 确认回调正确
|
|||
|
|
|
|||
|
|
## 六、UniApp实现方案
|
|||
|
|
|
|||
|
|
### 6.1 环境识别封装
|
|||
|
|
```javascript
|
|||
|
|
// utils/ccb-env.js
|
|||
|
|
export default {
|
|||
|
|
// 检查是否在建行环境
|
|||
|
|
isInCCBApp() {
|
|||
|
|
// #ifdef H5
|
|||
|
|
const search = location.search.toLowerCase();
|
|||
|
|
return search.includes('platform=ccblife') ||
|
|||
|
|
search.includes('platform=ccb');
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// #ifndef H5
|
|||
|
|
return false;
|
|||
|
|
// #endif
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 获取平台类型
|
|||
|
|
getPlatform() {
|
|||
|
|
// #ifdef H5
|
|||
|
|
if (location.search.includes('platform=ccblife')) {
|
|||
|
|
return 'ccblife'; // 建行生活
|
|||
|
|
}
|
|||
|
|
if (location.search.includes('platform=ccb')) {
|
|||
|
|
return 'ccb'; // 中国建设银行
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
return null;
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 获取加密参数
|
|||
|
|
getCCBParams() {
|
|||
|
|
// #ifdef H5
|
|||
|
|
const params = new URLSearchParams(location.search);
|
|||
|
|
return {
|
|||
|
|
ccbParamSJ: params.get('ccbParamSJ'),
|
|||
|
|
cityId: params.get('CITYID'),
|
|||
|
|
userCityId: params.get('USERCITYID')
|
|||
|
|
};
|
|||
|
|
// #endif
|
|||
|
|
return {};
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 6.2 收银台调用封装
|
|||
|
|
```javascript
|
|||
|
|
// utils/ccb-payment.js
|
|||
|
|
export default {
|
|||
|
|
// 调起建行收银台
|
|||
|
|
pay(paymentString) {
|
|||
|
|
// #ifdef H5
|
|||
|
|
const platform = this.getPlatform();
|
|||
|
|
|
|||
|
|
if (platform === 'ccblife') {
|
|||
|
|
// 建行生活App
|
|||
|
|
if (this.isIOS()) {
|
|||
|
|
window.location = "mbspay://direct?" + paymentString;
|
|||
|
|
} else {
|
|||
|
|
// Android
|
|||
|
|
if (window.mbspay && window.mbspay.directpay) {
|
|||
|
|
window.mbspay.directpay(paymentString);
|
|||
|
|
} else {
|
|||
|
|
console.error('mbspay对象不存在');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else if (platform === 'ccb') {
|
|||
|
|
// 中国建设银行App - 需要跳转到收银台URL
|
|||
|
|
// 这里需要后端返回加密后的URL
|
|||
|
|
window.location = paymentString; // 这里应该是完整的收银台URL
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 设置支付回调
|
|||
|
|
setPayCallback(serviceId, callbackUrl) {
|
|||
|
|
// #ifdef H5
|
|||
|
|
if (window.CCBBridge && window.CCBBridge.requestNative) {
|
|||
|
|
const requestObj = {
|
|||
|
|
action: 'setCache',
|
|||
|
|
params: {
|
|||
|
|
key: serviceId,
|
|||
|
|
value: callbackUrl
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
window.CCBBridge.requestNative(
|
|||
|
|
JSON.stringify(requestObj),
|
|||
|
|
'setPayCallbackResult'
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
// #endif
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 判断是否iOS
|
|||
|
|
isIOS() {
|
|||
|
|
return /iPhone|iPad|iPod/i.test(navigator.userAgent);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
getPlatform() {
|
|||
|
|
if (location.search.includes('platform=ccblife')) {
|
|||
|
|
return 'ccblife';
|
|||
|
|
}
|
|||
|
|
if (location.search.includes('platform=ccb')) {
|
|||
|
|
return 'ccb';
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 七、重要注意事项
|
|||
|
|
|
|||
|
|
### 7.1 关键配置
|
|||
|
|
- **REMARK2必须填写服务方编号**
|
|||
|
|
- **生产环境必须使用HTTPS**
|
|||
|
|
- **支付通知接口需要验签**
|
|||
|
|
|
|||
|
|
### 7.2 常见问题
|
|||
|
|
|
|||
|
|
**Q: 如何区分建行生活和中国建设银行App?**
|
|||
|
|
A: 通过URL参数platform判断,ccblife是建行生活,ccb是中国建设银行。
|
|||
|
|
|
|||
|
|
**Q: 支付参数需要加密吗?**
|
|||
|
|
A: 在建行生活App中直接传递,在中国建设银行App中需要RSA加密。
|
|||
|
|
|
|||
|
|
**Q: 支付成功后如何跳转?**
|
|||
|
|
A: 通过setCache方法设置回调URL,或使用PAYSUCCESSURL参数。
|
|||
|
|
|
|||
|
|
### 7.3 测试要点
|
|||
|
|
1. 环境识别是否准确
|
|||
|
|
2. 收银台能否正常调起
|
|||
|
|
3. 支付回调是否正常
|
|||
|
|
4. 订单状态同步是否及时
|
|||
|
|
|
|||
|
|
## 八、总结
|
|||
|
|
|
|||
|
|
这份文档确认了:
|
|||
|
|
1. ✅ **接口地址明确**:包括后台接口和收银台URL
|
|||
|
|
2. ✅ **支付流程清晰**:不同App环境有不同调用方式
|
|||
|
|
3. ✅ **参数规范完整**:包括签名、加密等要求
|
|||
|
|
4. ✅ **PHP/UniApp可以实现**:通过HTTP接口和JavaScript调用
|
|||
|
|
|
|||
|
|
关键点:
|
|||
|
|
- 服务方编号(REMARK2)是核心参数
|
|||
|
|
- 建行生活和中国建设银行App调用方式不同
|
|||
|
|
- 所有接口都是标准HTTP/HTTPS,PHP完全可以对接
|