用户管理类¶
个人用户开户 U01¶
校验逻辑¶
- 姓名和身份证号进行实名认证。
- 同一商户下同一身份号只能开立一个用户客户号。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 固定为10,如版本升级,能向前兼容 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U01 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
用户姓名 | user_name | 变长50位String | 必须 | 用户的真实姓名 |
身份证号 | cert_id | 变长18位String | 必须 | 用户的身份证号 |
手机号 | user_mobile | 定长11位String | 必须 | 用户的手机号 |
证件有效期 | vali_date | 定长8位String | 可选 | 填写证件上有效期的截至日期,格式为: YYYYMMDD ,例如: 20290420 |
用户省份 | cust_prov | 定长4位String | 必须 | 用户省份,如上海0031 |
用户地区 | cust_area | 定长4位String | 必须 | 用户地区,如上海3100 |
住址 | cust_address | 变长250位String | 必须 | 填写证件上的住址 |
职业 | occupation | 定长2位String | 必须 | 见个人职业分类表 |
邮箱 | user_email | 变长40位String | 可选 | 用户的电子邮箱 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
设备静态信息 | dev_info | 变长512位String | 必须 | 参见 设备静态信息 。 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U01 |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
用户客户号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
手机号 | user_mobile | 定长11位String | 必须 | 用户的手机号 |
商户后台应答地址 | bg_ret_url | 变长120位String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文; 2) 必须是外网地址结果。 |
商户私有域 | mer_priv | 变长128位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("version", "10");
map.put("cmd_id", "U01");
map.put("mer_cust_id", "6666000000118348");
map.put("order_id", DateUtils.getCurrentDateTime());
map.put("order_date", "20180927");
map.put("user_name", "zhangfei");
map.put("cert_id", "310000198204093712");
map.put("user_mobile", "15155820021");
map.put("cust_prov", "0031");
map.put("cust_area", "3100");
map.put("bg_ret_url", "http://tech.chinapnr.com/hftest/page/test7943_3.jsp");
map.put("mer_priv", "");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U01"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U01",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "90000",
"return_desc": "交易成功",
"user_name": "zhangfei",
"cert_id": "310000198204093712",
"user_mobile": "15155820021",
"cust_prov": "0031",
"cust_area": "3100",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp"
"extension": "extension",
"mer_priv": "mer_priv"
}
失败响应示例
200
{
"cmd_id": "U01",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "10099",
"return_desc": "交易处理失败",
"error_code": "100001",
"error_desc": "请求订单号重复",
"user_name": "zhangfei",
"cert_id": "310000198204093712",
"user_mobile": "15155820021",
"cust_prov": "0031",
"cust_area": "3100",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp"
"extension": "extension",
"mer_priv": "mer_priv"
}
企业用户开户 U02¶
校验逻辑¶
- 接口会弹出页面用于上传企业开户所需的材料,企业开户需要上传:【统一信用代码】(或者【营业执照】、【组织机构证】、【税务证】)、【法人身份证正反面】、【开户许可证或一般户证明】。
- 企业开户需要人工审核(T+1日完成审核),所以该接口同步返回【企业开户申请号】,审核成功后异步通知返回【企业用户客户号】。
- 股东信息需按照工商网填写完整。
- 对公账户银行凭证还需加盖商户有色公章。
- 持股比例25%以上股东信息需填写名称、证件类型、证件号(个人股东填写身份证信息,企业股东填写营业执照信息)。
上传附件要求¶
- 5 证必须提供全,若三证合一,则只需要传三证合一的附件。
- 上传图片必须清晰,证件字体能清楚辨认,每张证件必须盖有注册企业的有色公章且证件均需在有效期内。
- “对公账户信息”提供印鉴卡、银行流水单号、银行开户许可证、银行开户回执单,4项中任一即可。
- “对公账户信息”中必须显示对应银行的支行信息,并附有银行公章。
- 一般账户、基本账户的上传资料内容及要求一致。
- 一旦审核失败,用相同的企业开户申请号,重新提交审核。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 固定为10,如版本升级,能向前兼容 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易, 此处为 U02 |
商户唯一标识号 | mer_cust_id | 定长16位String | 必须 | 商户的唯一标识号 |
企业开户申请号 | apply_id | 变长18 位String | 必须 | 申请企业开户的唯一标识 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8 位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
操作类型 | operate_type | 定长8位String | 必须 | 00090000-新增; 00090001-修改。 |
企业证照类型 | corp_license_type | 定长8位String | 必须 | 01030100-普通营业执照企业; 01030101-三证合一企业。 |
企业名称 | corp_name | 变长50位String | 必须 | 企业的公司全称 |
营业执照注册号 | business_code | 变长30位String | 可选 | 普通营业执照企业必填 |
组织机构代码 | institution_code | 定长9位String | 可选 | 普通营业执照企业必填 |
税务登记证号 | tax_code | 变长30位String | 可选 | 普通营业执照企业必填 |
统一社会信用 代码 | social_credit_code | 定长18位String | 可选 | 三证合一企业必填, 普通营业执照企业不填 |
证照起始日期 | license_start_date | 定长8 位String | 必须 | 企业的营业证照起始日期, 精确到年月日 |
证照结束日期 | license_end_date | 定长8 位String | 必须 | 企业的营业证照结束日期, 精确到年月日,支持“永久” |
企业经营地址 | corp_business_address | 变长250位String | 必须 | 企业的经营地址 |
企业注册地址 | corp_reg_address | 变长250位String | 必须 | 企业的注册地址 |
企业固定电话 | corp_fixed_telephone | 变长15位String | 必须 | 企业的固定电话 |
经营范围 | business_scope | 变长1000位String | 必须 | 企业的经营范围 |
控股股东 (实际控制人) | controlling_shareholder | 变长1000位String | 必须 | 数据格式: [{“name”:”关羽”, “certType”:”01020100”, “certId”:”330204199008187881”}] |
法人姓名 | legal_name | 变长20位String | 必须 | 企业的法人姓名 |
法人证件类型 | legal_cert_type | 定长8位String | 必须 | 01020100:身份证; 01020101:护照; 01020102:军官证; 01020103士兵证; 01020104:回乡证; 01020105警官证; 01020106:台胞证; 01020107:其他。暂时只支持身份证。 |
法人证件号码 | legal_cert_id | 变长20位String | 必须 | 法人的证件号码,与证件类型对应 |
法人证件起始 日期 | legal_cert_start_date | 定长8 位String | 必须 | 法人的证件起始日期,精确到年月日 |
法人证件结束 日期 | legal_cert_end_date | 定长8 位String | 必须 | 法人的证件结束日期,精确到年月日,支持“永久” |
法人手机号码 | legal_mobile | 定长11位String | 必须 | 法人的手机号码 |
企业联系人姓名 | contact_name | 变长50位String | 必须 | 企业联系人的姓名 |
联系人手机号 | contact_mobile | 定长11为String | 必须 | 联系人的手机号码 |
联系人邮箱 | contact_email | 变长40位String | 必须 | 联系人的邮箱地址 |
开户银行账户名 | bank_acct_name | 变长40位String | 必须 | 企业开户银行账户名,需与企业名称保持一致 |
开户银行 | bank_id | 定长8位String | 必须 | 具体见附件:开户银行代号 |
开户银行账号 | bank_acct_no | 变长32位String | 必须 | 企业开户银行账号 |
开户银行 支行名称 | bank_branch | 变长100位String | 必须 | 企业开户银行的支行名称 |
开户银行省份 | bank_prov | 定长4位String | 必须 | 银行卡开户省份 |
开户银行地区 | bank_area | 定长4位String | 必须 | 银行卡开户地区 |
行业 | industry | 定长2位String | 可选 | 企业行业类别,具体见附件:行业 |
商户后台应答 地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
页面返回URL | ret_url | 变长128位String | 可选 | 交易结果通过页面方式发送到该地址上 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | |
设备静态信息 | dev_info | 变长512位String | 必须 | 参见 设备静态信息 。 |
控股股东(controlling_shareholder)
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
姓名 | name | 变长20位String | 必须 | |
证件类型 | certType | 定长8位String | 必须 | 01020100:身份证; 01020101:护照; 01020102:军官证; 01020103:士兵证; 01020104:回乡证; 01020105:警官证; 01020106:台胞证; 01020107:其他。暂时只支持身份证。 |
证件号码 | certId | 变长20位String | 必须 | 股东的证件号码,与证件类型对应 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U02 |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
企业开户申请号 | apply_id | 变长20位 String | 必须 | 由商户提供,申请企业开户的唯一标识 |
企业用户客户号 | user_cust_id | 定长16位String | 可选 | |
订单号 | order_id | 定长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8 位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
商户唯一标识号 | mer_cust_id | 变长16位String | 必须 | 由汇付生成,商户的唯一标识号 |
企业名称 | corp_name | 变长50位String | 必须 | 企业的公司全称 |
提现绑定银行卡ID | cash_bind_card_id | 变长20位String | 可选 | |
审核状态 | audit_status | 定长2位String | 必须 | 00:通过; 01:待修改; 02:拒绝; 04:待审核。 |
审核描述 | audit_desc | 变长500位String | 可选 | |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
页面返回URL | ret_url | 变长128位String | 可选 | 交易完成后,本平台系统把交易结果通过页面方式,发送到该地址上 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | |
子账户号 | acct_id | 变长9位String | 可选 | 由汇付生成,用户的默认子账户号 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("version", "10");
map.put("cmd_id", "U02");
map.put("mer_cust_id", "6666000000118348");
map.put("apply_id", "2018080800043652");
map.put("order_id", DateUtils.getCurrentDateTime());
map.put("order_date", "20180927");
map.put("operate_type", "00090000");
map.put("corp_license_type", "01030100");
map.put("business_code", "5842146232018178");
map.put("institution_code", "584214631");
map.put("tax_code", "2018170");
map.put("corp_type", "01030000");
map.put("corp_name", "corpname11");
map.put("license_start_date", "20160808");
map.put("license_end_date", "20200808");
map.put("corp_business_address", "businessaddress");
map.put("corp_reg_address", "regaddress");
map.put("corp_fixed_telephone", "021-68680001");
map.put("business_scope", "businessscope");
map.put("controlling_shareholder", "[{"name":"关羽", "certType":"01020100", "certId":"310000197804030104"}]");
map.put("legal_name", "legalname");
map.put("legal_cert_type", "01020100");
map.put("legal_cert_id", "310000197804030104");
map.put("legal_cert_start_date", "19990919");
map.put("legal_cert_end_date", "20190919");
map.put("legal_mobile", "14755824575");
map.put("contact_name", "contactname");
map.put("contact_mobile", "14755824575");
map.put("contact_email", "xingkui7.chen@huifu.com");
map.put("bank_acct_name", "corpname11");
map.put("bank_id", "01050000");
map.put("bank_acct_no", "6232510000001086");
map.put("bank_branch", "bankbranch");
map.put("bank_prov", "0031");
map.put("bank_area", "3100");
map.put("bg_ret_url", "http://172.31.19.92:8081/eacloud/bgResponse/corpRegAuditAsynNotice");
map.put("mer_priv", "");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U02"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"return_code": "90000",
"return_desc": "交易成功",
"cmd_id": "U02",
"mer_cust_id": "6666000000118348",
"apply_id": "2018080800043652",
"order_id": DateUtils.getCurrentDateTime(,
"order_date": "20180927",
"operate_type": "00090000",
"corp_license_type": "01030100",
"business_code": "5842146232018178",
"institution_code": "584214631",
"tax_code": "2018170",
"corp_type": "01030000",
"corp_name": "corpname11",
"license_start_date": "20160808",
"license_end_date": "20200808",
"corp_business_address": "businessaddress",
"corp_reg_address": "regaddress",
"corp_fixed_telephone": "021-68680001",
"business_scope": "businessscope",
"controlling_shareholder": "[{"name":"关羽", "certType":"01020100", "certId":"310000197804030104"}]",
"legal_name": "legalname",
"legal_cert_type": "01020100",
"legal_cert_id": "310000197804030104",
"legal_cert_start_date": "19990919",
"legal_cert_end_date": "20190919",
"legal_mobile": "14755824575",
"contact_name": "contactname",
"contact_mobile": "14755824575",
"contact_email": "xingkui7.chen@huifu.com",
"bank_acct_name": "corpname11",
"bank_id": "01050000",
"bank_acct_no": "6232510000001086",
"bank_branch": "bankbranch",
"bank_prov": "0031",
"bank_area": "3100",
"bg_ret_url": "http://172.31.19.92:8081/eacloud/bgResponse/corpRegAuditAsynNotice",
"mer_priv": ""
}
失败响应示例
200
{
"return_code": "10099",
"return_desc": "交易处理失败",
"error_code": "100001",
"error_desc": "请求订单号重复",
"cmd_id": "U02",
"mer_cust_id": "6666000000118348",
"apply_id": "2018080800043652",
"order_id": DateUtils.getCurrentDateTime(),
"order_date": "20180927",
"operate_type": "00090000",
"corp_license_type": "01030100",
"business_code": "5842146232018178",
"institution_code": "584214631",
"tax_code": "2018170",
"corp_type": "01030000",
"corp_name": "corpname11",
"license_start_date": "20160808",
"license_end_date": "20200808",
"corp_business_address": "businessaddress",
"corp_reg_address": "regaddress",
"corp_fixed_telephone": "021-68680001",
"business_scope": "businessscope",
"controlling_shareholder": "[{"name":"关羽", "certType":"01020100", "certId":"310000197804030104"}]",
"legal_name": "legalname",
"legal_cert_type": "01020100",
"legal_cert_id": "310000197804030104",
"legal_cert_start_date": "19990919",
"legal_cert_end_date": "20190919",
"legal_mobile": "14755824575",
"contact_name": "contactname",
"contact_mobile": "14755824575",
"contact_email": "xingkui7.chen@huifu.com",
"bank_acct_name": "corpname11",
"bank_id": "01050000",
"bank_acct_no": "6232510000001086",
"bank_branch": "bankbranch",
"bank_prov": "0031",
"bank_area": "3100",
"bg_ret_url": "http://172.31.19.92:8081/eacloud/bgResponse/corpRegAuditAsynNotice",
"mer_priv": ""
}
绑定提现卡 U04¶
校验逻辑¶
- 返回【银行卡绑定ID】作为唯一标志,后续用户银行卡解绑、用户提现等操作。
- 一个用户只支持绑定一张取现卡。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 固定为10,如版本升级,能向前兼容 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U04 |
商户唯一标识号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户唯一标识号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
银行代号 | bank_id | 定长8位String | 可选 | 对公:必填;对私:可选 |
银行卡号 | card_no | 变长32位String | 必须 | |
借贷标记 | dc_flag | 定长1位String | 必须 | 0:借记卡(固定) |
银行卡开户省份 | card_prov | 定长4位String | 必须 | |
银行卡开户地区 | card_area | 定长4位String | 必须 | |
银行预留手机号 | card_mobile | 变长11位String | 必须 | |
后台返回地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户绑卡结果 注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
设备静态信息 | dev_info | 变长512位String | 必须 | 参见 设备静态信息 。 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U04 |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
商户唯一标识号 | mer_cust_id | 定长16位 | 必须 | 由汇付生成,商户的唯一性标识 |
用户唯一标识号 | user_cust_id | 定长16位 | 必须 | 由汇付生成,用户的唯一性标识 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
银行代号 | bank_id | 定长8位String | 必须 | 银行代号 |
银行卡号 | card_no | 变长32位String | 必须 | 银行卡号掩码 |
银行卡绑定ID | cash_bind_card_id | 变长20位String | 必须 | |
借贷标记 | dc_flag | 定长1位String | 必须 | 0:借记卡; 1:贷记卡。 |
银行卡开户省份 | card_prov | 定长4位String | 必须 | |
银行卡开户地区 | card_area | 定长4位String | 必须 | |
后台返回地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户绑卡结果 注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("version", "10");
map.put("cmd_id", "U04");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", "6666000000118473");
map.put("order_id", DateUtils.getCurrentDateTime());
map.put("order_date", "20181015");
map.put("bank_id", "01050000");
map.put("card_no", "6232510000001179");
map.put("card_mobile", "18904960178");
map.put("dc_flag", "0");
map.put("card_prov", "0031");
map.put("card_area", "3100");
map.put("bg_ret_url", "http://tech.chinapnr.com/hftest/page/test7943_3.jsp");
map.put("mer_priv", "");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U04"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U04",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "90000",
"return_desc": "交易成功",
"bank_id": "01050000",
"card_no": "6232510000001179",
" cash_bind_card_id": "62325",
" card_mobile": "15155820021",
"dc_flag": "0"
"cust_prov": "0031",
"cust_area": "3100",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp"
"extension": "extension",
"mer_priv": "mer_priv"
}
失败响应示例
200
{
"cmd_id": "U04",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "10099",
"return_desc": "交易处理失败",
"error_code": "100001",
"error_desc": "请求订单号重复",
"bank_id": "01050000",
"card_no": "6232510000001179",
" cash_bind_card_id": "62325",
" card_mobile": "15155820021",
"dc_flag": "0"
"cust_prov": "0031",
"cust_area": "3100",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp"
"extension": "extension",
"mer_priv": "mer_priv"
}
银行卡解绑 U05¶
校验逻辑¶
- 通过绑卡ID来确定是解绑哪一张卡。
- 区分已绑定卡是用于提现还是快捷业务,所以请正确填写【卡业务类型】。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本 | version | 固定2位String | 必须 | 固定为10,如版本升级,能向前兼容 |
消息类型 | cmd_id | 固定3位String | 必须 | 每一种消息类型代表一种交易,此处为 U05 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
银行代码 | bank_id | 定长8位String | 必须 | 具体见附件二:快捷支付支持银行列表 |
绑卡ID | card_id | 变长20位String | 必须 | 绑卡ID |
银行卡预留手机号 | card_mobile | 定长11位String | 必须 | 银行卡预留手机号 |
卡业务类型 | card_buss_type | 固定1位String | 必须 | 0:提现;2:快捷。 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户解绑结果 注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
设备静态信息 | dev_info | 变长512位String | 必须 | 参见 设备静态信息 。 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U05 |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 商户唯一标识,由汇付生成 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 用户唯一标识,由汇付生成 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
银行代码 | bank_id | 定长8位String | 必须 | |
绑卡ID | card_id | 变长20位String | 必须 | |
卡业务类型 | card_buss_type | 固定1位String | 必须 | 0提现卡;2快捷卡; |
银行卡预留手机号 | card_mobile | 定长11位String | 必须 | 银行卡预留手机号 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户解绑结果 注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("cmd_id", "U05");
map.put("mer_cust_id", "6666000000043642");
map.put("user_cust_id", "6666000000043951");
map.put("order_id", DateUtils.getCurrentDateTime());
map.put("order_date", "20180817");
map.put("bank_id", "01050000");
map.put("card_id", "1000002168");
map.put("card_mobile", "13156680129");
map.put("card_buss_type", "2");
map.put("bg_ret_url", "http://tech.chinapnr.com/hftest/page/test7943_3.jsp");
map.put("mer_priv", "");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U05"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U05",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "90000",
"return_desc": "交易成功",
"bank_id": "01050000",
"card_id": "1000002168",
"card_buss_type": "2",
"card_mobile": "15155820021",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp",
"extension": "extension",
"mer_priv": "mer_priv"
}
失败响应示例
200
{
"cmd_id": "U05",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "10099",
"return_desc": "交易处理失败",
"error_code": "100001",
"error_desc": "请求订单号重复",
"bank_id": "01050000",
"card_id": "1000002168",
"card_buss_type": "2",
"card_mobile": "15155820021",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp",
"extension": "extension",
"mer_priv": "mer_priv"
}
创建子账户 U06¶
校验逻辑¶
- 支付账户指可以用于收款、支付(出款)以及提现的虚拟账户。
- 非支付账户只能用于收款、提现的虚拟账户。
- 企账通所有用户都支持开通不超过5个子账户,5个子账户包含支付账户和非支付账户。个人用户限制只创建一个支付账户,非支付账户数量不限。
- 账户安全措施为短信验证或支付密码。如有特殊要求需要申请经汇付审核。账户安全措施为短信验证时,需先调用短信发送接口,将用户收到的短信验证码上送本接口短信验证码字段中,汇付会验证短信验证码正确性。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本 | version | 固定2位String | 必须 | 固定为10,如版本升级,能向前兼容 |
消息类型 | cmd_id | 固定3位String | 必须 | 每一种消息类型代表一种交易,此处为 U06 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
账户类型 | acct_type | 定长3位String | 必须 | 100:支付账户;200:非支付账户 |
短信验证码 | sms_code | 定长6位String | 可选 | 当商户配置不使用汇付协议页面并且单独调了发短信接口则必填;使用汇付协议页面时可选 |
页面返回URL | ret_url | 变长128位String | 可选 | 本平台把交易结果通过页面方式返回商户 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 本平台把交易结果通过后台异步通知商户 注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
设备静态信息 | dev_info | 变长512位String | 必须 | 参见 设备静态信息 。 |
是否同意支付协议 | is_agree_pay_protocol | 定长1位String | 可选 | 1-同意 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U06 |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 原样返回 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 原样返回 |
订单日期 | order_date | 定长8位String | 必须 | 原样返回 |
订单号 | order_id | 变长20位String | 必须 | 原样返回 |
账户类型 | acct_type | 定长3位String | 可选 | 原样返回 |
支付账户 | acct_id | 变长16位String | 可选 | 用户开通的支付账户,开通成功则必填 |
支付账户等级 | acct_level | 定长2位String | 可选 | 01:一类帐户;02:二类帐户;03:三类帐户 |
页面返回URL | ret_url | 变长128位String | 可选 | 原样返回 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 原样返回 |
商户私有域 | mer_priv | 变长120位String | 可选 | 原样返回 |
扩展域 | extension | 变长512位String | 可选 | 原样返回 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("version", "10");
map.put("cmd_id", "U06");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", "6666000000136203");
map.put("order_id", DateUtils.getCurrentDateTime());
map.put("order_date", "20181018");
map.put("acct_type", "100");
map.put("acct_name", "支付账户");
map.put("confirm_flag", "Y");
map.put("sms_code", "");
map.put("ret_url", "");
map.put("bg_ret_url", "http://tech.chinapnr.com/hftest/page/test7943_3.jsp");
map.put("mer_priv", "mer_priv");
map.put("extension", "extension");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U06"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U06",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "90000",
"return_desc": "交易成功",
"acct_type", "100",
"sms_code", "",
"acct_id ": "15155",
"acct_level": "01",
"ret_url", "",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp",
"extension": "extension",
"mer_priv": "mer_priv"
}
失败响应示例
200
{
"cmd_id": "U06",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000136008",
"order_date": "20181018",
"order_id": "20181018000001",
"return_code": "10099",
"return_desc": "交易处理失败",
"error_code": "100001",
"error_desc": "请求订单号重复",
"acct_type", "100",
"sms_code", "",
"acct_id ": "",
"acct_level": "",
"ret_url", "",
"bg_ret_url": "http://192.168.0.200:8008/hftest/common/commonResult.jsp",
"extension": "extension",
"mer_priv": "mer_priv"
}
短信发送 U07¶
校验逻辑¶
- 商户账户安全措施选择短信验证时,需要调用本接口先发送短信验证码。
- 短信验证码的时效为10分钟,若过期,请重新生成订单号调用本接口。
- 同一笔订单号的短信验证码验证失败总次数不得超过5次。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本 | version | 固定2位String | 必须 | 固定为10,如版本升级,能向前兼容 |
消息类型 | cmd_id | 固定3位String | 必须 | 每一种消息类型代表一种交易,此处为 U07 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
业务类型 | busi_type | 定长3位String | 必选 | T11-余额支付; T07-提现; U06-创建子账户。 |
用户手机号 | user_mobile | 定长11位String | 必须 | 必须与用户开户手机号保持一致 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 固定3位String | 必须 | 每一种消息类型代表一种交易,此处为 U07 |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
业务类型 | busi_type | 定长2位String | 必选 | T11-余额支付; T07-提现; U06-创建子账户。 |
用户手机号 | user_mobile | 定长11位String | 必须 | 必须与用户开户手机号保持一致 |
商户私有域 | mer_priv | 变长120位String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位String | 可选 | 用于扩展请求参数 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("version", "10");
map.put("cmd_id", "U07");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", "6666000000133631");
map.put("order_date", "20181019");
map.put("order_id", "20181019000001");
map.put("busi_type", "T07");
map.put("user_mobile", "17126027941");
map.put("mer_priv", "mer_priv");
map.put("extension", "extension");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", " U07"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"busi_type": "T07",
"cmd_id": "U07",
"extension": "extension",
"mer_cust_id": "6666000000118348",
"mer_priv": "mer_priv",
"order_date": "20181019",
"order_id": "20181019000001",
"return_code": "90000",
"return_desc": "交易成功",
"user_cust_id": "6666000000133631",
"user_mobile": "17126027941"
}
失败响应示例
200
{
"busi_type": "T07",
"cmd_id": "U07",
"extension": "extension",
"mer_cust_id": "6666000000118348",
"mer_priv": "mer_priv",
"order_date": "20181019",
"order_id": "20181019000001",
"return_code": "10099",
"return_desc": "交易处理失败",
"error_code": "100001",
"error_desc": "请求订单号重复",
"user_cust_id": "6666000000133631",
"user_mobile": "17126027941"
}
证件上传 U08¶
校验逻辑¶
- 开通【支付账户】时会对照片做认证。
- 本接口上送身份证号必须为用户开户时身份证号保持一致。
- 两张身份证照片大小加起来不超过1M。
- 如果个人开通支付账户但没有上传证照,交易、提现可能会被风控拦截。如出现相关拦截提示请按要求上传证照。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 固定为10,如版本升级,能向前兼容 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U08 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为 YYYYMMDD |
证件号 | cert_id | 定长18位String | 必须 | |
证件姓名 | cert_name | 变长50位String | 必须 | |
证件类型 | cert_type | 定长2位String | 必须 | 证件类型:00-身份证 |
来源渠道 | source_channel | 定长1位String | 必须 | 0-PC;1-ANDROID;2-IOS |
后台返回地址 | bg_ret_url | 变长256位String | 必须 | |
证件照1 | file1 | multipart-file | 必须 | 身份证正面照 |
证件照2 | file2 | multipart-file | 必须 | 身份证反面照 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U08 |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
证件号 | cert_id | 定长18位String | 必须 | |
证件姓名 | cert_name | 变长50位String | 必须 | |
证件类型 | cert_type | 定长2位String | 必须 | 证件类型:00-身份证 |
来源渠道 | source_channel | 定长1位String | 必须 | 0-PC;1-ANDROID;2-IOS |
后台返回地址 | bg_ret_url | 变长256位String | 必须 | |
实名验证状态 | check_stat | 定长1位String | 必须 | S-验证通过; F-验证失败; P-验证中; I-未验证。 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>(16);
map.put("version", "10");
map.put("cmd_id", "U08");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", " 6666000000118473");
map.put("order_id", "201810180000001");
map.put("order_date", "20181018");
map.put("cert_type", " 00");
map.put("source_channel", "0");
map.put("cert_name", "姓名");
map.put("cert_id", " 310000197504183045");
map.put("bg_ret_url", "http://192.168.0.200:8008/hftest/common/commonResult.jsp");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
Map<String, Object> paramMap = new HashMap<>(16);
paramMap.put("mer_cust_id", "6666000000118348");
paramMap.put("cmd_id", "U08");
paramMap.put("version", "10");
paramMap.put("check_value", chkValue);
paramMap.put("file1", new File("\tmp\1.png"));
paramMap.put("file2", new File("\tmp\1.png"));
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
if (entry.getValue() instanceof File) {
multipartEntityBuilder.addBinaryBody(entry.getKey(), (File) entry.getValue());
} else {
multipartEntityBuilder.addTextBody(entry.getKey(), (String) entry.getValue());
}
}
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(multipartEntityBuilder.build());
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"return_code": "90000",
"return_desc": "交易成功",
"cert_type":"00",
"source_channel":"0",
"cert_id":"310000197504183045",
"check_stat":"S",
"order_date":"20181018",
"bg_ret_url":"http://192.168.0.200:8008/hftest/common/commonResult.jsp",
"cert_name":"姓名",
"user_cust_id":"6666000000118473",
"order_id":"201810180000001",
"cmd_id":"U08",
"mer_cust_id":"6666000000118348"
}
失败响应示例
200
{
"return_code": "10099",
"return_desc": "交易处理失败",
"error_code": "100001",
"error_desc": "请求订单号重复",
"cert_type":"00",
"source_channel":"0",
"cert_id":"310000197504183045",
"check_stat":"F",
"order_date":"20181018",
"bg_ret_url":"http://192.168.0.200:8008/hftest/common/commonResult.jsp",
"cert_name":"姓名",
"user_cust_id":"6666000000118473",
"order_id":"201810180000001",
"cmd_id":"U08",
"mer_cust_id":"6666000000118348"
}
个体工商户开户 U09¶
校验逻辑¶
- 【操作类型】为新增时,【个体工商户开户申请号】必须唯一。
- 【操作类型】为修改时,【个体工商户开户申请号】对应的前一次申请记录必须为待修改状态,即用这个申请号第一次发起开户申请的审核结果状态为待修改。
- 【营业执照注册号】必须唯一,不能重复开户。
- 【附件编号列表】为 商户文件上传 的【附件编号】字段,用英文逗号隔开且最多为10个。
- 为保证审核通过率,建议附件上传的文件类型包含营业执照、法人身份证照片正反面、结算卡正反面信息。
上传附件要求¶
- 五证必须提供全,若三证合一,则只需要传三证合一的附件。
- 上传图片必须清晰,证件字体能清楚辨认,每张证件必须盖有注册企业的有色公章且证件均需在有效期内。
- “对公账户信息”提供印鉴卡、银行流水单号、银行开户许可证、银行开户回执单,4项中任一即可。
- “对公账户信息”中必须显示对应银行的支行信息,并附有银行公章。
- 一般账户、基本账户的上传资料内容及要求一致。
- 一旦审核失败,用相同的企业开户申请号,重新提交审核。
- 注:若个体工商户无公章,可上传 经营者有色指印+签名 的复印件。
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为U09 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
操作类型 | operate_type | 定长8位String | 必须 | 00090000:新增 00090001:修改 |
个体工商户开户申请号 | apply_id | 变长20位String | 必须 | 个体工商户开户申请号 |
订单号 | order_id | 定长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
订单日期 | order_date | 定长8 位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
个体户名称 | user_name | 变长50位String | 必须 | |
营业执照注册号 | business_code | 变长30位的String | 必须 | 个体工商户的营业执照注册号 |
证照起始日期 | license_start_date | 定长8 位String | 必须 | 个体工商户的营业证照起始日期,精确到年月日 |
证照结束日期 | license_end_date | 定长8 位String | 必须 | 个体工商户的营业证照结束日期,精确到年月日,支持“永久” |
个体工商户经营地址 | solo_business_address | 变长250位字符串 | 必须 | 个体工商户的经营地址 |
个体工商户注册地址 | solo_reg_address | 变长250位字符串 | 必须 | 个体工商户的注册地址 |
个体工商户固定电话 | solo_fixed_telephone | 变长15位字符串 | 必须 | 个体工商户的固定电话 |
经营范围 | business_scope | 变长1000位字符串 | 必须 | 个体工商户的经营范围 |
经营者姓名 | legal_name | 变长20位String | 必须 | 个体工商户的法人姓名 |
经营者证件类型 | legal_cert_type | 定长8位String | 必须 | 01020100:身份证 01020101:护照 01020102:军官证 01020103士兵证 01020104:回乡证 01020105警官证 01020106:台胞证 01020107:其他。暂时只支持身份证。 |
经营者证件号码 | legal_cert_id | 变长20位String | 必须 | 经营者的证件号码,与证件类型对应 |
经营者证件起始日期 | legal_cert_start_date | 定长8 位String | 必须 | 经营者的证件起始日期,精确到年月日 |
经营者证件到期日期 | legal_cert_end_date | 定长8 位String | 必须 | 经营者的证件结束日期,精确到年月日,支持“永久” |
经营者手机号码 | legal_mobile | 定长11位String | 必须 | 法人的手机号码 |
个体工商户联系人姓名 | contact_name | 变长50位String | 必须 | 个体工商户联系人的姓名 |
联系人手机号 | contact_mobile | 定长11为String | 必须 | 联系人的手机号码 |
联系人邮箱 | contact_email | 变长40位的String | 必须 | 联系人的邮箱地址 |
职业 | occupation | 定长2位的String | 必须 | 参见 个人职业分类 |
住址 | address | 变长256位的String | 必须 | 填写经营者的住址 |
附件编号列表 | attach_nos | 变长210位String | 必须 | 商户文件上传的附件编号列表,多个附件编号之间用逗号隔开,如:abc123或者abc123,abc1234;附件最多十个 |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
设备静态信息 | dev_info | 变长512位String | 必须 | 参见 设备静态信息 。 |
是否同意支付协议 | is_agree_pay_protocol | 定长1位String | 可选 | 1-同意。 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为U09 |
返回码 | return_code | 定长6位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
个体工商户开户申请号 | apply_id | 变长20 的String | 必须 | 由商户提供,申请个体工商户开户的唯一标识 |
个体工商户用户客户号 | user_cust_id | 定长16位String | 可选 | |
订单号 | order_id | 定长20位String | 必须 | 由商户生成,必须保证唯一, 20位内的字母或数字组合 |
订单日期 | order_date | 定长8 位String | 必须 | 格式为YYYYMMDD,例如:20160307 |
商户唯一标识号 | mer_cust_id | 变长16位的String | 必须 | 由汇付生成,商户的唯一标识号 |
经营者姓名 | legal_name | 变长20位String | 必须 | 个体工商户的法人姓名 |
审核状态 | audit_status | 定长2位String | 必须 | 00:通过 01:待修改 02:拒绝 04:待审核 |
审核描述 | audit_desc | 变长500位String | 可选 | |
商户后台应答地址 | bg_ret_url | 变长128位的String | 必须 | 通过后台异步通知商户开户结果 注意: 1) 使用时不要包含中文 2) 必须是外网地址 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
子账户号 | acct_id | 变长9位String | 可选 | 由汇付生成,用户的默认子账户号 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("cmd_id", "U09");
map.put("version", "10");
map.put("mer_cust_id", "6666000000118348");
map.put("operate_type", " 00090000");
map.put("apply_id", "00001");
map.put("order_date", "20181121");
map.put("order_id", "201811210001");
map.put("user_name", "用户名");
map.put("business_code", " 10000000001");
map.put("license_start_date", "20180101");
map.put("license_end_date", "永久");
map.put("solo_business_address", "上海");
map.put("solo_reg_address", "上海");
map.put("solo_fixed_telephone", " 5931-59548");
map.put("business_scope", "经营范围");
map.put("legal_name", "经营者姓名");
map.put("legal_cert_type", " 01020100");
map.put("legal_cert_id", " 110101199003078873 ");
map.put("legal_cert_start_date", " 20180101");
map.put("legal_cert_end_date", "永久");
map.put("legal_mobile", " 13156680000");
map.put("contact_name", "联系人姓名");
map.put("contact_mobile", " 13156680000 ");
map.put("contact_email", " 13156680000@qq.com");
map.put("occupation", "01");
map.put("address", "地址");
map.put("attach_nos", " 201811203253883419");
map.put("bg_ret_url", " http://192.168.0.200:8008/hftest/common/commonResult.jsp");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U09"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"apply_id": "200903038295092",
"audit_desc": "待审核",
"audit_status": "00",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp",
"cmd_id": "U09",
"error_code": "",
"error_desc": "",
"legal_name": "经营者姓名",
"mer_cust_id": "6666000000118348",
"order_date": "20181121",
"order_id": "201811210001",
"return_code": "90000",
"return_desc": "交易成功"
}
失败响应示例
200
{
"apply_id": "200903038295092",
"audit_desc": "审核拒绝",
"audit_status": "02",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp",
"cmd_id": "U09",
"error_code": "100000",
"error_desc": "交易成功",
"legal_name": "经营者姓名",
"mer_cust_id": "6666000000118348",
"order_date": "20181121",
"order_id": "201811210001",
"return_code": "90000",
"return_desc": "交易成功"
}
用户签约 U20¶
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为U20 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
签约方式 | user_sign_type | 定长1 位String | 必须 | 固定值1 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U20 |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
扩展域 | extension | 变长512位String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 商户的唯一标识 |
商户私有域 | mer_priv | 变长120位String | 可选 | 商户的自定义字段,该字段在交易完成后由本平台原样返回 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
签约方式 | user_sign_type | 定长1 位String | 必须 | 1-线下 |
状态码 | resp_code | 变长8位String | 必须 | U20000–交易成功,其他见状态码表 |
状态描述 | resp_desc | 变长128位String | 必须 | |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("cmd_id", "U20");
map.put("version", "10");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", " 6666000000195772");
map.put("user_sign_type", "1");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U20"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U20",
"error_code": "",
"errorDesc": "",
"respCode": "U20000",
"respDesc": "交易成功",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"user_sign_type": "1",
"return_code": "90000",
"return_desc": "交易成功"
}
失败响应示例
200
{
"cmd_id": "U20",
"error_code": "100300",
"errorDesc": "用户已签约",
"respCode": "U20300",
"respDesc": "用户已签约",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"user_sign_type": "1",
"return_code": "10099",
"return_desc": "交易处理失败"
}
用户入驻 U21¶
功能说明¶
用户完成一户一码签约成功后,调用企账通“用户入驻”接口,完成用户(企业用户或者个体工商户)在支付宝和微信的入驻。微信用户完成入驻后需进行实名认证,操作步骤详见附件 实名认证指引。
调用方式:系统调用
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为U21 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
支付通道 | pay_way | 定长1位String | 必须 | 1支付宝,2微信 |
客服电话 | customer_mobile | 变长32位String | 必须 | 客服电话(纯数字组成,座机不能带-) |
经营类目 | business_category | 变长128位String | 必须 | 微信:微信经营类目 |
支付宝:支付宝经营类目 | ||||
用户简称 | short_name | 变长10位String | 必须 | 用户简称,最多10个汉字 |
省份编码 | prov_code | 变长6位String | 必须 | 见 入驻参数 |
城市编码 | area_code | 变长6位String | 必须 | 见 入驻参数 |
区县编码 | zip_code | 变长6位String | 必须 | 见 入驻参数 |
商户经营类型 | business_oper_type | 定长1位String | 必须 | 1-实体;2-虚拟 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户结果,注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U21 |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
扩展域 | extension | 变长512位String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 商户的唯一标识 |
商户私有域 | mer_priv | 变长120位String | 可选 | 商户的自定义字段,该字段在交易完成后由本平台原样返回 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
状态码 | resp_code | 变长8位String | 必须 | U21000–交易成功,其他见状态码表 |
状态描述 | resp_desc | 变长128位String | 必须 | |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
支付通道 | pay_way | 定长1位String | 必须 | 1支付宝,2微信 |
客服电话 | customer_mobile | 变长32位String | 必须 | 客服电话(纯数字组成,座机不能带-) |
经营类目 | business_category | 变长128位String | 必须 | 微信:微信经营类目 |
支付宝:支付宝经营类目 | ||||
用户简称 | short_name | 变长10位String | 必须 | 用户简称,最多10个汉字 |
省份编码 | prov_code | 变长6位String | 必须 | 见 入驻参数 |
城市编码 | area_code | 变长6位String | 必须 | 见 入驻参数 |
区县编码 | zip_code | 变长6位String | 必须 | 见 入驻参数 |
商户经营类型 | business_oper_type | 定长1位String | 必须 | 1-实体;2-虚拟 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户结果,注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("cmd_id", "U21");
map.put("version", "10");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", " 6666000000195772");
map.put("order_date", "20190507");
map.put("order_id", "20190307134944310");
map.put("pay_way", "1");
map.put("customer_mobile", "13114982839");
map.put("business_category", "2016062900190124");
map.put("short_name", "test");
map.put("prov_code", "110000");
map.put("area_code", "110100");
map.put("zip_code", "110101");
map.put("business_oper_type", "2");
map.put("bg_ret_url", "http://192.168.0.200:8008/hftest/page/test7906_5.jsp");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U21"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U21",
"error_code": "",
"errorDesc": "",
"respCode": "U21000",
"respDesc": "交易成功",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"return_code": "90000",
"return_desc": "交易成功",
"order_date": "20190507",
"order_id": "20190307134944310",
"pay_way": "1",
"customer_mobile": "13114982839",
"business_category": "2016062900190124",
"short_name": "test",
"prov_code": "110000",
"area_code": "110100",
"zip_code": "110101",
"business_oper_type": "2",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp"
}
失败响应示例
200
{
"cmd_id": "U21",
"error_code": "100307",
"errorDesc": "商户渠道号未配置",
"respCode": "U21307",
"respDesc": "商户渠道号未配置",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"return_code": "10099",
"return_desc": "交易处理失败",
"order_date": "20190507",
"order_id": "20190307134944310",
"pay_way": "1",
"customer_mobile": "13114982839",
"business_category": "2016062900190124",
"short_name": "test",
"prov_code": "110000",
"area_code": "110100",
"zip_code": "110101",
"business_oper_type": "2",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp"
}
用户入驻修改 U22¶
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为U22 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
支付通道 | pay_way | 定长1位String | 必须 | 1支付宝,2微信 |
客服电话 | customer_mobile | 变长32位String | 必须 | 客服电话(纯数字组成,座机不能带-) |
用户简称 | short_name | 变长10位String | 必须 | 用户简称,最多10个汉字 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户结果,注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U22 |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
扩展域 | extension | 变长512位String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 商户的唯一标识 |
商户私有域 | mer_priv | 变长120位String | 可选 | 商户的自定义字段,该字段在交易完成后由本平台原样返回 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
状态码 | resp_code | 变长8位String | 必须 | U22000–交易成功,其他见状态码表 |
状态描述 | resp_desc | 变长128位String | 必须 | |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
支付通道 | pay_way | 定长1位String | 必须 | 1支付宝,2微信 |
客服电话 | customer_mobile | 变长32位String | 必须 | 客服电话(纯数字组成,座机不能带-) |
用户简称 | short_name | 变长10位String | 必须 | 用户简称,最多10个汉字 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户结果,注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("cmd_id", "U22");
map.put("version", "10");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", " 6666000000195772");
map.put("order_date", "20190507");
map.put("order_id", "2019030713491110");
map.put("pay_way", "1");
map.put("customer_mobile", "13114982840");
map.put("short_name", "test");
map.put("bg_ret_url", "http://192.168.0.200:8008/hftest/page/test7906_5.jsp");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U22"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U22",
"error_code": "",
"errorDesc": "",
"respCode": "U22000",
"respDesc": "交易成功",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"return_code": "90000",
"return_desc": "交易成功",
"order_date": "20190507",
"order_id": "2019030713491110",
"pay_way": "1",
"customer_mobile": "13114982840",
"short_name": "test",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp"
}
失败响应示例
200
{
"cmd_id": "U22",
"error_code": "100202",
"errorDesc": "交易订单号重复",
"respCode": "U22202",
"respDesc": "交易订单号重复",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"return_code": "10099",
"return_desc": "交易处理失败",
"order_date": "20190507",
"order_id": "2019030713491110",
"pay_way": "1",
"customer_mobile": "13114982840",
"short_name": "test",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp"
}
用户配置 U23¶
功能说明¶
商户为用户入驻微信配置绑定appid,配置授权目录,推荐关注公众号。公众号及小程序支付时需要调用此接口。最多支持配置5条记录(第6条覆盖第1条)。推荐公众号appid的主体需和绑定的公众号appid主体一致。小程序支付仅需配置appid。
调用方式:系统调用
请求参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
版本号 | version | 定长2位String | 必须 | 目前固定为10 |
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为U23 |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 由汇付生成,商户的唯一性标识 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
配置值 | conf_value | 变长1000位String | 必须 | 格式如下:appid:wxxxxx,path:http://xxx.com, subscribeAppid:wxxxx分别是需要绑定的appid,需要配置的授权目录,推荐关注公众号中间用英文逗号分隔 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户结果,注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
商户私有域 | mer_priv | 变长120位的String | 可选 | 为商户的自定义字段,该字段在交易完成后由本平台原样返回 |
扩展域 | extension | 变长512位的String | 可选 | 用于扩展请求参数 |
返回参数¶
参数中文名称 | 参数名称 | 数据格式 | 是否必须 | 说明 |
---|---|---|---|---|
消息类型 | cmd_id | 定长3位String | 必须 | 每一种消息类型代表一种交易,此处为 U23 |
错误码 | error_code | 定长6位String | 可选 | 参见 错误码 |
错误描述 | error_desc | 变长String | 可选 | |
扩展域 | extension | 变长512位String | 可选 | |
商户客户号 | mer_cust_id | 定长16位String | 必须 | 商户的唯一标识 |
商户私有域 | mer_priv | 变长120位String | 可选 | 商户的自定义字段,该字段在交易完成后由本平台原样返回 |
用户客户号 | user_cust_id | 定长16 位String | 必须 | 由汇付生成,用户的唯一性标识 |
状态码 | resp_code | 变长8位String | 必须 | U23000–交易成功,其他见状态码表 |
状态描述 | resp_desc | 变长128位String | 必须 | |
返回码 | return_code | 定长5位String | 必须 | 参见 返回码 |
返回描述 | return_desc | 变长String | 必须 | |
订单日期 | order_date | 定长8位String | 必须 | 保证订单号和订单日期唯一,格式为YYYYMMDD |
订单号 | order_id | 变长20位String | 必须 | 保证订单号和订单日期唯一 |
商户后台应答地址 | bg_ret_url | 变长128位String | 必须 | 通过后台异步通知商户结果,注意: 1) 使用时不要包含中文; 2) 必须是外网地址。 |
配置值 | conf_value | 变长1000位String | 必须 | 格式如下:appid:wxxxxx,path:http://xxx.com, subscribeAppid:wxxxx分别是需要绑定的appid, |
需要配置的授权目录,推荐关注公众号中间用英文逗号分隔 |
代码示例¶
JAVA
请求示例
// 测试环境请求地址
String requestUrl = "https://eacloud.testpnr.com/api/publicRequests";
Map<String, String> map = new HashMap<>();
map.put("cmd_id", "U23");
map.put("version", "10");
map.put("mer_cust_id", "6666000000118348");
map.put("user_cust_id", " 6666000000195772");
map.put("order_date", "20190507");
map.put("order_id", "2019030713491111");
map.put("conf_value", "appid:wxxxxx,path:http://xxx.com, subscribeAppid:wxxxx");
map.put("bg_ret_url", "http://192.168.0.200:8008/hftest/page/test7906_5.jsp");
// 将请求参数转换为json字符串
String jsonStr = JSON.toJSONString(map);
// 将json字符串使用CFCA加签
String chkValue = cfcaSEncrypt(jsonStr);
// 组装接口调用参数
List<NameValuePair> nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("mer_cust_id", "6666000000118348"));
nameValuePairs.add(new BasicNameValuePair("cmd_id", "U23"));
nameValuePairs.add(new BasicNameValuePair("version", "10"));
nameValuePairs.add(new BasicNameValuePair("check_value", chkValue));
UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
// 创建httpPost
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.setEntity(uefEntity);
InputStreamReader isr;
BufferedReader br;
String line;
try {
// 使用HttpClient发送请求
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
isr = new InputStreamReader(response.getEntity().getContent(), Consts.UTF_8);
StringBuffer resultString = new StringBuffer();
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
resultString.append(line);
}
// 返回结果解签
String resultJson = cfcaSDncrypt(resultString.toString());
} catch (Exception e) {
// 处理异常
}
成功响应示例
200
{
"cmd_id": "U23",
"error_code": "",
"errorDesc": "",
"respCode": "U23000",
"respDesc": "交易成功",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"return_code": "90000",
"return_desc": "交易成功",
"order_date": "20190507",
"order_id": "2019030713491111",
"conf_value": "appid:wxxxxx,path:http://xxx.com, subscribeAppid:wxxxx",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp"
}
失败响应示例
200
{
"cmd_id": "U23",
"error_code": "100202",
"errorDesc": "交易订单号重复",
"respCode": "U23202",
"respDesc": "交易订单号重复",
"mer_cust_id": "6666000000118348",
"user_cust_id": "6666000000195772",
"return_code": "10099",
"return_desc": "交易处理失败",
"order_date": "20190507",
"order_id": "2019030713491111",
"conf_value": "appid:wxxxxx,path:http://xxx.com, subscribeAppid:wxxxx",
"bg_ret_url": "http://192.168.0.200:8008/hftest/page/test7906_5.jsp"
}