一网通账户钱包功能
开发须知
依赖于商户自己对签约开户时保留的协议号,要求商户方保证协议号的唯一性,映射为签约开户时的卡号。
名词解释
协议号: 卡号作为敏感信息不能直接提供给商户,因此在开户时由商户针对客户生成唯一协议号作为
要开通的一网通账户卡号的映射
一网通账户钱包功能
一网通账户钱包功能
功能说明:
钱包功能对应于一网通账户签约开户的后续账户管理功能,包括钱包总览、充值、提现
调用方式
测试环境: https://virtualjump.csst.cmburl.cn/Jz9NgZAA?jsonRequestData=XXXXXX
生产环境:https://t.cmbchina.com/8hNAEYAA?jsonRequestData=XXXXXX
请求参数 (支持get和post两种传参方式)
参数 | 类型 | 必须字段 | 说明 | 备注 |
jsonRequestData | Json | M | 参数详情 | 该字段是json格式的字符串进行encodeURIComponent编码 |
· MODEL: jsonRequestData----必须字段M表示该字段必传
参数 | 类型 | 必须字段 | 说明 | 备注 |
version | String | M | 版本 | 固定传2.0 |
charset | String | M | 编码 | 固定传UTF-8 |
sign | String | M | 签名 | 对reqData字段内容进行排序后得到排序结果再拼接上商户配置的秘钥,对组合成的结果字段串进行国密哈希加签 |
signType | String | M | 签名算法 | 固定传NationalDigest |
reqData | Json | M | 请求数据 | Json格式请求数据,具体见reqData的内容 |
· MODEL: reqData
参数 | 类型 | 必须字段 | 说明 | 备注 |
branchNo | String | M | 分行号 | |
merchantNo | String | M | 商户号 | |
dateTime | String | M | 时间戳 | 判断系统时间范围内有效,防止重试 |
transSerialNo | String | O | 商户端提供的交易流水 | 充值时透传给主机,全数字,长度不超过40,且保证唯一,需要查询充值结果的,该值必传 |
extendInfoEncrypType | String | M | 敏感信息加密方式 | NationalAES |
extendInfo | String | M | 敏感信息加密内容 | |
copCode | String | M | 合作方编码 | |
title | String | O | 暂无使用 | |
rtnLink | String | O | 结果页跳转 | 充值/提现成功结果页返回按钮链接或直接跳转链接,长度不能超过256。为空时,先取业务参数管理系统中配置的返回链接,都为空时回到钱包总览页 |
failRtnLink | String | O | 失败返回链接 | 充值结果失败页返回按钮链接或直接失败链接,长度不能超过256。为空时,默认回到钱包总览页 |
chnType | String | M | 渠道类型 | 风控字段,长度不能超过2 |
ip | String | M | IP地址 | 风控字段 |
networkAccess | String | 网络接入方式 | 风控字段,长度不能超过4 | |
appVersion | String | 合作方APP版本号 | 风控字段,长度不能超过10 | |
phyId | String | 设备编号 | 风控字段,长度不能超过64 | |
isTrustDevice | String | 是否可信设备 | 风控字段,长度不能超过1 | |
userAgent | String | 用户代理(终端信息) | 风控字段,长度不能超过256 | |
mobileProducer | String | 手机厂商 | 风控字段,长度不能超过64 | |
mobileModel | String | 手机型号 | 风控字段,长度不能超过64 | |
romVolume | String | 手机ROM最大容量 | 风控字段,长度不能超过16 | |
ramVolume | String | 手机RAM最大容量 | 风控字段,长度不能超过16 | |
cpuModel | String | CPU型号 | 风控字段,长度不能超过64 | |
phoneNum | String | 设备上的手机号 | 风控字段 | |
imsi | String | IMSI编号 | 风控字段,长度不能超过32 | |
imeiIdfa | String | IMEI或IDFA编号 | 风控字段,长度不能超过64 | |
ssId | String | Wi-Fi名称 | 风控字段,长度不能超过40 | |
bssId | String | Wi-Fi的MAC地址 | 分控字段,长度不能超过40 | |
lon | String | 经度 | 风控字段,长度不能超过20 | |
lat | String | 纬度 | 风控字段,长度不能超过20 | |
sysVer | String | 操作系统版本 | 风控字段,长度不能超过20 |
· MODEL: reqData.extendInfo
参数 | 类型 | 必须字段 | 说明 | 备注 |
agrNo | String | M | 协议号 | 对应开户时候的协议号,长度不超过40 |
walletType | String | O | 类型 | AccountView-总览TransIn-转入 |
transMoney | String | O | 交易金额,11位整数2位小数的格式 | |
hideTransInResult | String | O | 隐藏充值成功结果页 | Y或空,为Y时,rtnLink必须有值。 |
示例代码
签名请求示例
//生产签名字段的方法
public static string GenerateSign<T>(Object reqdata, string signType, string password) {
string sortStr = SortParams<T>(reqdata);
sortStr = sortStr + "&" + password;
if (signType == "NationalDigest")
{
//国密
return NationalCipher.Digest(sortStr);
}
else
{
throw new Exception("Error signType " + signType);
}
}
//排序
public static string SortParams<T>(Object obj)
{
PropertyInfo[] pis = obj.GetType().GetProperties();
Array.Sort(pis, new PropertyInfoComparer());
StringBuilder sb = new StringBuilder();
int i = 0;
foreach (PropertyInfo pi in pis)
{
if (pi.GetValue(obj, null) != null)
{
if (i == 0)
{
sb.Append(pi.Name + "=" + pi.GetValue(obj, null));
i++;
}
else
{
sb.Append("&" + pi.Name + "=" + pi.GetValue(obj, null));
}
}
}
return sb.ToString();
}
//排序算法
private class PropertyInfoComparer : IComparer<PropertyInfo>
{
public int Compare(PropertyInfo x, PropertyInfo y)
{
return x.Name.CompareTo(y.Name);
}
}