本开发文档的阅读对象为:具有一定开发能力,了解PHP、JAVA、.NET等开发语言的开发、维护或管理人员。
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
版本号 | 更新说明 | 更新日期 |
---|---|---|
V1.0 | 创建 | 2017.07.27 |
-
商户会员号
Chinapnr网关支付时提交的为商户会员号,并非商户号,会员号=商户号+"01"(如商户号为abc时,会员号为abc01)
商户接入海关申报时,调用API须遵循以下规则:
传输方式 | 为保证交易安全性,采用 HTTPS 传输 |
提交方式 | 采用 POST 方法提交 |
数据格式 | HTTP KEY=VALUE 格式 |
字符编码 | 支持 UTF-8 字符编码 |
签名算法 | 商户生成签名字符串,现支持的签名算法类型为 RSA-SHA1 |
签名要求 | 请求和接收数据均需要校验签名 |
概述
本文档展示了如何从零开始,与Chinapnr跨境系统海关申报接口对接的流程。
第一步:获取账号信息
-
商户需与前端销售沟通开通测试账号或生产账号,并提供接受邮箱地址。
-
1-2个工作日内由开通组负责将开通的账号信息发送至商户邮箱。
第二步:配置密钥
-
开发者调用接口前需要先生成RSA密钥,RSA密钥包含私钥、公钥。生成密钥后在商户后台进行密钥配置,配置完成后可发起交易。详细步骤请参考《配置密钥》。
第三步:搭建和配置开发环境
-
下载示例代码Demo 为了帮助开发者调用开放接口,我们提供了示例代码下载,包含JAVA、PHP和.NET三语言版本,封装了签名&验签、HTTP接口请求等基础功能。请先下载对应语言版本的Demo并引入您的开发工程《Demo下载》。
-
将Demo运行成功,并将代码集成到您的项目中,记得修改商户号,终端号,和私钥证书。如生产环境,还需更换Chinapnr生产公钥证书。
调用流程
接口调用时序图:

图4.1 海关申报时序图
-
商户系统收集申报信息并通过《海关申报接口》向汇付天下(以下简称汇付)发起申报请求。
-
汇付对商户的支付请求进行处理后,实时返回商户申请结果,返回参数请参照《海关申报接口》中的返回参数章节。
-
汇付将商户请求转发海关系统进行海关申报。
-
海关申报处理完成后,返回汇付申报结果。
-
汇付系统在接受到海关申报结果后,通过《申报结果通知》接口通知商户系统该笔订单的申报结果。 后台通知以收到商户系统返回的http状态码200表示成功,否则将继续通知,如果连续通知10次仍不成功将停止通知。
注意:为确保安全,商户在收到汇付申报结果通知后,务必先验证返回的签名字段。
概述
Chinapnr开放平台采用了 RSA 安全签名机制,开发者可以通过Chinapnr公钥验证消息来源,同时可使用自己的私钥对信息进行加密。RSA 算法及数字签名机制是Chinapnr平台与开发者网关安全通信的基础,若开发者不熟悉 RSA 及数字签名,请先查阅相关资料。
RSA 私钥及公钥生成
1. 生成 RSA 私钥及公钥,请详见“附录一:私钥公钥生成及范例”。 生成的文件格式如:客户私钥private-rsa.pfx,客户公钥public-rsa.cer。
商户上传公钥
注意:
-
上传商户公钥前需先联系前端获取商户后台账号和密码,并将客户公钥public-rsa.cer文件前缀名称修改为商户号。 如开通的商户号为10012159865,则证书修改为10012159865.cer上传。
商户平台登录地址 测试环境 / 生产环境进入Platform Management菜单下Certificate Management菜单,转入如下界面:

图5.1 上传公钥
在证书管理,输入邮箱,点击Do Upload上传证书。页面提示上传成功,证书列表中可以查看新增证书,状态为1有效。
下载Chinapnr公钥
点击Download下载系统公钥用于接收跨境系统返回时验签。

图5.2 下载Chinapnr公钥
注意:
不同环境Chinapnr公钥证书需在不对环境的商户后台下载。
接口参数说明请参见《海关申报接口》
API请求
Chinapnr开放平台的OpenAPI调用采取POST方式(application/x-www-form-urlencoded),内容通过键值对(Key-Value)的形式作为参数传入。
请求示例:
ecpDomainName=www.xxx.com
signType=4
merCustomCode=1111
version=1.0
payerIdType=1
terminalId=hgtest02
bgUrl=http://127.0.0.1:8081/QAMOCK-Test/receiveCustomBg.do
taxAmt=0
merCustomName=测试商户
customCode=NBHG
orderId=20170825152657559
orderAmt=600
ecpShortName=1111
submiturl=http://192.168.1.139:8089/custom/applyImptDec.do
offsetAmt=0
customVersion=
merchantAcctId=1001215986501
goodsAmt=600
competCustom=11111
orderCurrency=CNY
dealId=
iaqInstCode=11111
freightAmt=0
ext1=
ext2=
signMsg=PLEdRqKZC8hxlWd2+U1tH/5blPrWVZZWIBqQiB9kiXfrT1UCqBInOhirfm391Ql3HjGKRSCVNnuogG2PoyvhPyehupaCSL3P8IwwzFuCfZJsGKTYdAT9sJ3ovckbAzcnomV/JZVVRqi6hhQqV/eU69ygb0G9WuDvVWUJrqu97Ac=
bizType=
payerIdNumber=320125198805232313
payerName=张三
在提交参数中需要对传入的数据进行签名组成signMsg字段,签名方法如下:
1.将所有非空参数(sign除外)按照signMsg签名串:
version={version}&bgUrl={bgUrl}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&dealId={dealId}&customCode={customCode}&customVersion={customVersion}&merCustomCode={merCustomCode}&merCustomName={merCustomName}&payerIdType={payerIdType}&payerName={payerName}&payerIdNumber={payerIdNumber}&orderId={orderId}&orderCurrency={orderCurrency}&orderAmt={orderAmt}&freightAmt={freightAmt}&goodsAmt={goodsAmt}&taxAmt={taxAmt}&offsetAmt={offsetAmt}
按顺序用&连接起来组成字符串,格式是:p1=v1&p2=v2。如:
version=1.0&bgUrl=http://127.0.0.1:8081/QAMOCK-Test/receiveCustomBg.do&signType=4&merchantAcctId=1001215986501&terminalId=hgtest02&customCode=NBHG&merCustomCode=1111&merCustomName=测试商户&payerIdType=1&payerName=张三&payerIdNumber=320125198805232313&orderId=20170825152657559&orderCurrency=CNY&orderAmt=600&freightAmt=0&goodsAmt=600&taxAmt=0&offsetAmt=0
2.进行RSA签名后获得sign,再经过Base64编码,具体加签代码请详见Demo其最终的请求报文样式参考如下:
REQUEST URL: https://global.chinapnr.com/custom/applyImptDec.do
REQUEST METHOD: POST
CONTENT:
ecpDomainName=www.xxx.com
signType=4
merCustomCode=1111
version=1.0
payerIdType=1
terminalId=hgtest02
bgUrl=http://127.0.0.1:8081/QAMOCK-Test/receiveCustomBg.do
taxAmt=0
merCustomName=测试商户
customCode=NBHG
orderId=20170825152657559
orderAmt=600
ecpShortName=1111
submiturl=http://192.168.1.139:8089/custom/applyImptDec.do
offsetAmt=0
customVersion=
merchantAcctId=1001215986501
goodsAmt=600
competCustom=11111
orderCurrency=CNY
dealId=
iaqInstCode=11111
freightAmt=0
ext1=
ext2=
signMsg=PLEdRqKZC8hxlWd2+U1tH/5blPrWVZZWIBqQiB9kiXfrT1UCqBInOhirfm391Ql3HjGKRSCVNnuogG2PoyvhPyehupaCSL3P8IwwzFuCfZJsGKTYdAT9sJ3ovckbAzcnomV/JZVVRqi6hhQqV/eU69ygb0G9WuDvVWUJrqu97Ac=
bizType=
payerIdNumber=320125198805232313
payerName=张三
注意:
没有值的参数无需传递,也无需包含到待签名数据中。
签名时将字符转化成字节流时指定的字符集UTF8。
根据HTTP协议要求,传递参数的值中如果存在特殊字符(如:&、@等),那么该值需要做URL Encoding,这样请求接收方才能接收到正确的参数。此时,待签名数据应该是原始值而不是encoding之后的值。 例如:调用某接口需要对请求参数 email 进行数字签名,那么待签名数据应该是:email=test@abc.com,而不是 email=test%40abc.com。
返回结果
返回示例:
ecpDomainName=www.xxx.com
signType=4
merCustomCode=1111
payerIdType=1
version=1.0
terminalId=hgtest02
taxAmt=0
bgUrl=http://127.0.0.1:8081/QAMOCK-Test/receiveCustomBg.do
merCustomName=测试商户
customCode=NBHG
orderAmt=600
orderId=20170825152657559
ecpShortName=1111
submiturl=http://192.168.1.139:8089/custom/applyImptDec.do
offsetAmt=0
customVersion=
merchantAcctId=1001215986501
goodsAmt=600
competCustom=11111
orderCurrency=CNY
dealId=
iaqInstCode=11111
freightAmt=0
ext1=
ext2=
signMsg=QqGXKGlkh7SVD5Jef7A52FTAz85XR2Zf8zBnRJ6WLeTGFX0d5Q2nJChr0k8EMPBFLRT70xyrgE8OSfUj0liwoGFFid%2FxOZeJQ33HltHpyqPMJW%2FdF3C%2BOzldwfvvdbIqtDD55bjuuDG%2B1lqr%2BH3FBIx1bKJMqsa1AdPwUzez0vY%3D
bizType=
payerIdNumber=320125198805232313
payerName=张三
declareId=15849
decResult=10
errorCode=000000
errorMsg=SUCCESS
调用Chinapnr开放平台接口后,Chinapnr会向开发者提交的pageUrl地址同步返回支付结果。为保证信息安全,会经Chinapnr私钥进行RSA加密,开发者收到消息后可通过ChinapnrRSA公钥进行解密。
1.将所有返回参数(signMsg除外)按照signMsg验签串按顺序拼接:
competCustom={competCustom}&customCode={customCode}&customVersion={customVersion}&dealId={dealId}&decResult={decResult}&declareId={declareId}&ecpDomainName={ecpDomainName}&ecpShortName={ecpShortName}&errorCode={errorCode}&errorMsg={errorMsg}&freightAmt={freightAmt}&goodsAmt={goodsAmt}&iaqInstCode={iaqInstCode}&merCustomCode={merCustomCode}&merCustomName={merCustomName}&merchantAcctId={merchantAcctId}&offsetAmt={offsetAmt}&orderAmt={orderAmt}&orderCurrency={orderCurrency}&orderId={orderId}&payerIdNumber={payerIdNumber}&payerIdType={payerIdType}&payerName={payerName}&taxAmt={taxAmt}&terminalId={terminalId}&bizType={bizType}&version={version}
组成待验签字符串,如:
competCustom=11111&customCode=NBHG&decResult=10&declareId=15849&ecpDomainName=www.xxx.com&ecpShortName=1111&errorCode=000000&errorMsg=SUCCESS&freightAmt=0&goodsAmt=600&iaqInstCode=11111&merCustomCode=1111&merCustomName=测试商户&merchantAcctId=1001215986501&offsetAmt=0&orderAmt=600&orderCurrency=CNY&orderId=20170825152657559&payerIdNumber=320125198805232313&payerIdType=1&payerName=张三&taxAmt=0&terminalId=hgtest02&version=1.0
2.将签名参数(signMsg)使用base64解码为字节码串
3.使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及Chinapnr公钥验证签名。具体验签方法 请详见Demo
海关申报完成后,Chinapnr会向开发者提交的bgUrl地址后台异步返回海关申报结果。
接口返回参数说明请参见《海关申报接口》
申报结果通知
申报结果通知示例:
ecpDomainName=www.xxx.com
signType=4
merCustomCode=1111
version=1.0
payerIdType=1
terminalId=hgtest02
decResult=20
bgUrl=http://127.0.0.1:8081/QAMOCK-Test/receiveCustomBg.do
taxAmt=0
merCustomName=测试商户
customCode=NBHG
orderId=20170825152657559
orderAmt=600
ecpShortName=1111
customVersion=
offsetAmt=0
declareId=15849
merchantAcctId=1001215986501
competCustom=11111
goodsAmt=600
orderCurrency=CNY
dealId=c108270
iaqInstCode=11111
freightAmt=0
ext1=
ext2=
signMsg=D2iVN%2FA3x95CDJPMm5rp4vH7z6rKViiEUSLbrl6ffOhL2fWMA4oNrLxtYJjm2G4Bqja%2Fc%2FgJz7tpfb%2Bpn4CeIgmbukDFoZmSoXN6Hxe36lYa8Th96HnrXsMM70OWt6DwHEmmCWKhCFpjY2hD6ERnONUK7XFrfR1TnYtg%2BtZlNWM%3D
bizType=
payerIdNumber=320125198805232313
payerName=张三
申报结果通知的验签
1.将所有返回参数(signMsg除外)按照signMsg验签串按顺序拼接:
competCustom={competCustom}&customCode={customCode}&customVersion={customVersion}&dealId={dealId}&decResult={decResult}&declareId={declareId}&ecpDomainName={ecpDomainName}&ecpShortName={ecpShortName}&errorCode={errorCode}&errorMsg={errorMsg}&freightAmt={freightAmt}&goodsAmt={goodsAmt}&iaqInstCode={iaqInstCode}&merCustomCode={merCustomCode}&merCustomName={merCustomName}&merchantAcctId={merchantAcctId}&offsetAmt={offsetAmt}&orderAmt={orderAmt}&orderCurrency={orderCurrency}&orderId={orderId}&payerIdNumber={payerIdNumber}&payerIdType={payerIdType}&payerName={payerName}&taxAmt={taxAmt}&terminalId={terminalId}&bizType={bizType}&version={version}
组成待验签字符串,如:
competCustom=11111&customCode=NBHG&dealId=c108270&decResult=20&declareId=15849&ecpDomainName=www.xxx.com&ecpShortName=1111&freightAmt=0&goodsAmt=600&iaqInstCode=11111&merCustomCode=1111&merCustomName=测试商户&merchantAcctId=1001215986501&offsetAmt=0&orderAmt=600&orderCurrency=CNY&orderId=20170825152657559&payerIdNumber=320125198805232313&payerIdType=1&payerName=张三&taxAmt=0&terminalId=hgtest02&version=1.0
2.将签名参数signMsg和拼接的验签字符串进行URLDecoder。
如C#代码,signMsg为通知中的signMsg字段,signMsgVal为拼接的验签串: String signMsgDecode = HttpUtility.UrlDecode(signMsg); String signMsgValDecode = HttpUtility.UrlDecode(signMsgVal);
3.将URLDecoder后的签名参数(signMsg)使用base64解码为字节码串。
4.使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及Chinapnr公钥验证签名。具体验签方法 请详见Demo
商户业务处理注意事项
1.商户必须根据Chinapnr不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
2.Chinapnr异步通知以通知地址返回HTTPSTATUS为200认为成功,否则会一直通知,通知策略是一共通知16次,前面每隔10s通知一次 一共通知6次每次,后10次通知时间间隔增加(N*60s+30s,N为第几次通知,如第7次通知间隔第一次7min30s)。商户在接受到Chinapnr异步通知后,应返回成功接受内容,如"SUCESS"。
3.在Chinapnr的业务通知中,只有申报通知decResult=20时,Chinapnr才会认定为申报成功。如果商户未正确处理业务通知,存在潜在的风险,商户自行承担因此而产生的所有损失。
货币符号 | 币别 |
---|---|
CNY | 人民币 |
USD | 美元 |
HKD | 港元 |
GBP | 英镑 |
JPY | 日元 |
EUR | 欧元 |
AUD | 澳元 |
CAD | 加元 |
code(海关错误代码) | msg(海关错误描述) |
---|---|
999999 | 系统异常 |
100001 | 必输项[xxx]未提交 |
100002 | 请求的数据项[xxx]长度最大允许[y],实际[z] |
100003 | 请求的数据项[xxx]格式错误,合法格式请参照接入文档 |
100004 | 请求的数据项[xxx]不合法 |
100092 | 支付人身份信息有误 |
110001 | 商户不存在 |
110002 | 海关不存在 |
110003 | 商户报关功能未开通 |
110004 | 申报交易重复 |
110005 | 金额数值错误 |
110006 | 交易流水不存在 |
110007 | 申报金额大于支付金额 |
110008 | 本交易原交易流水号未全部提交 |
110009 | 申报的流水号提交有误,多于应提交数目 |
110010 | 身份信息校验失败 |
110011 | 商户报关手续费未配置 |
200001 | 订单信息的签名内容不正确 |
100001 | 必输项[xxx]未提交 |
100002 | 请求的数据项[xxx]长度最大允许[y],实际[z] |
100003 | 请求的数据项[xxx]格式错误,合法格式请参照接入文档 |
100004 | 请求的数据项[xxx]不合法 |
100092 | 支付人身份信息有误 |
110001 | 商户不存在 |
110002 | 海关不存在 |
110003 | 商户报关功能未开通 |
110004 | 申报交易重复 |
110005 | 金额数值错误 |
110006 | 交易流水不存在 |
110007 | 申报金额大于支付金额 |
110008 | 本交易原交易流水号未全部提交 |
110009 | 必输项[xxx]未提交 |
100001 | 申报的流水号提交有误,多于应提交数目 |
中文类名 | 海关编码 | 说明 |
---|---|---|
杭州海关 | HZHG | |
宁波海关 | NBHG | 我司在宁波的支付企业代码为“45”; 推送宁波海关,需电商平台信息已在宁波跨境购备案成功,否则会申报失败提示“支付节点的电商平台代码填写有误!” |
广州海关 | GZHG | 推送广州海关,需电商平台信息已在广州单一窗口 (https://gz.gdsinglewindow.cn)备案成功,否则广州口岸内部校验未通过会一直收不到回执 |
上海海关 | SHHG | 我司在上海备案的“payMethod”为“CHINAPNR” |
郑州海关 | ZHENGZHOU | 接入的是河南电子口岸单一窗口,支持新郑综保、机场等。 |
福建海关 | FUJIAN | |
山东海关 | SDHG |
备注:
1、不在上述列表中的海关,可使用“ZHENGZHOU”或“FUJIAN”或“SDHG”推送,建议优先使用“SDHG”
2、我司海关注册名称为“上海汇付支付有限公司”,十位注册编号为“310496099C”。
DEMO下载
注意:Demo下载后可直接运行,也可将项目里商户号,终端号,私钥证书(**.pfx)更换成已开通测试商户的。
海关申报API | 说明 | 平台 | 操作 |
---|---|---|---|
海关申报API | 海关申报API对应的DEMO | JAVA | 下载 |
PHP | 下载 | ||
.NET | 下载 |
文档下载
支付模式 | 说明 | 操作 |
---|---|---|
海关申报API | 海关申报API对应的文档 | 下载 |
1.订单信息的签名不正确
确保私钥证书正确。
确保加签字段和加签顺序正确,可对照Demo对比
2.订单返回信息验签失败
确保公钥证书正确,与所提交环境匹配,可在对应环境商户后台下载。
确保验签字段和验签顺序正确,可对照Demo对比
3.网关发起交易,报商户号不存在或未开通
网关发起交易时,提交的并非是商户号,而是会员号,会员号=商户号+“01”。
4.申请失败的订单会不会调用回调地址,发异步通知。
不会。申请失败的订单会实时返回失败,不会继续发送到海关申报。汇付只会异步通知对在海关申报成功或失败的订单。
5.主管海关代码跟海关代码是不是一样?
不一样。主管海关代码用于广州海关和南沙海关申报时填写,填写规范请参考《海关关区代码》。其余海关申报填写任意值即可。
海关代码即汇付系统定义的海关标识,区分商户在哪个海关进行申报。所有海关申报必须填写,填写参照附录《海关代码》。
6.当我接收到你们的异步通知需要回馈什么吗?
汇付系统以收到商户系统返回的http状态码200表示成功,推荐回馈 SUCCESS。
7.支付单号怎么返回?
海关申报成功后,汇付系统会以异步通知将申报结果通知到商户,支付单号为异步通知中dealId字段对应的值。
8.TLS1.0 SSL3.0等协议无法正常进行网关交易
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
9.海关处理流程 ,异步通知时间
海关申报主要有:海关订单财务生批、财务处理、报关生批、上送海关、更新海关申报状态等步骤,每个步骤都需要5分钟的执行时间,所以20分钟左右是正常的处理时间。
注意点: 一般来说贵司应该是在接受到我司海关申报成功异步通知后,才能继续3单对碰,否则会经常出现支付信息不存在
10.海关支付单过期
建议贵司需要准备要清关时推送支付单,过早推送支付单成功后,在等半个月或者更长时间进行对碰会出现支付信息不存在的情况,是由于总署那边之前推送的支付单过期了
11.海关申报返回“交易状态不符合申报条件”原因
我司这边收到通道的支付成功通知,会先立即通知贵司支付成功,但是后续我司对交易还有一些流程需处理,导致如果贵司收到支付成功通知会存在提示“交易状态不符合申报条件”,过几秒后推送即可;最好,烦请贵司能收到支付成功通知后延迟6S~8s在进行海关推送
12.海关平台有记录清关未有支付单原因
海关之前反馈:总署平台已有记录但是对碰有问题,重推订单或者清单
13.海关申报返回"商户报关功能未开通"?
麻烦先检查海关编码字段是否上传正确,无误则联系我司运营同事开通下相关海关配置
OpenSSL工具安装
1.Linux用户(以Ubuntu为例)
sudo apt-get install openssl
2.Windows用户开发者可以在OpenSSL官方网站下载Windows的OpenSSL安装包进行安装。或直接下载
3.若不习惯查看文档中心,此为证书生成word文档,可自行下载证书生成文档下载RSA私钥及公钥生成
1.Linux用户(以Ubuntu为例)
$ openssl 进入OpenSSL程序
OpenSSL> genrsa -out private-rsa.key 1024 生成私钥
OpenSSL> req -new -x509 -key private-rsa.key -days 750 -out public-rsa.cer 生成公钥
OpenSSL> pkcs12 -export -name test-alias -in public-rsa.cer -inkey private-rsa.key -out private-rsa.pfx 生成证书,密码和别名需记住
OpenSSL> exit # 退出OpenSSL程序
2.Windows用户在cmd窗口中进行以下操作:
C:\Users\Hammer>cd C:\OpenSSL\bin 进入OpenSSL安装目录
C:\OpenSSL\bin>openssl.exe 进入OpenSSL程序
OpenSSL> genrsa -out private-rsa.key 1024 生成私钥
OpenSSL> req -new -x509 -key private-rsa.key -days 750 -out public-rsa.cer 生成公钥
OpenSSL> pkcs12 -export -name test-alias -in public-rsa.cer -inkey private-rsa.key -out private-rsa.pfx 生成证书,密码和别名需记住
OpenSSL> exit # 退出OpenSSL程序
注意:
1.对于使用Php的开发者,需要将“private-rsa.pfx”证书转换为“private-rsa.pem”,输入转换命令pkcs12 -in dc-rsa.pfx -passin pass:“此处输入商户第3步设置的密码” -nodes -out private-rsa.pem。
跨境公钥转pem(cer转pem):x509 -in C:\OpenSSL\bin\ChinaPnR.rsa.cer -out C:\OpenSSL\bin\ChinaPnR.rsa.pem
2.如第二步报错,则根据工具所在路径指定下配置文件,如命令改为:req -new -x509 -key private-rsa.key -config "C:\OpenSSL\bin\openssl.cnf" -days 750 -out public-rsa.cer
私钥及公钥文件示例
经过以上步骤,开发者可以在当前文件夹中(Windows用户在C:\OpenSSL\bin)看到private-rsa.pfx和public-rsa.cer两个文件,前者为私钥,后者为公钥。开发者将私钥保留,将公钥提交给Chinapnr网关,用于信息加密及解密。公钥需修改前缀为商户号,并上传至跨境系统商户后台。以下为使用OpenSSL生成的私钥文件和公钥文件示例:
1.私钥文件示例(Java使用)
-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN0yqPkLXlnhM+2H
/57aHsYHaHXazr9pFQun907TMvmbR04wHChVsKVgGUF1hC0FN9hfeYT5v2SXg1WJ
Sg2tSgk7F29SpsF0I36oSLCIszxdu7ClO7c22mxEVuCjmYpJdqb6XweAZzv4Is66
1jXP4PdrCTHRdVTU5zR9xUByiLSVAgMBAAECgYEAhznORRonHylm9oKaygEsqQGk
YdBXbnsOS6busLi6xA+iovEUdbAVIrTCG9t854z2HAgaISoRUKyztJoOtJfI1wJa
QU+XL+U3JIh4jmNx/k5UzJijfvfpT7Cv3ueMtqyAGBJrkLvXjiS7O5ylaCGuB0Qz
711bWGkRrVoosPM3N6ECQQD8hVQUgnHEVHZYtvFqfcoq2g/onPbSqyjdrRu35a7P
vgDAZx69Mr/XggGNTgT3jJn7+2XmiGkHM1fd1Ob/3uAdAkEA4D7aE3ZgXG/PQqlm
3VbE/+4MvNl8xhjqOkByBOY2ZFfWKhlRziLEPSSAh16xEJ79WgY9iti+guLRAMra
vGrs2QJBAOmKWYeaWKNNxiIoF7/4VDgrcpkcSf3uRB44UjFSn8kLnWBUPo6WV+x1
FQBdjqRviZ4NFGIP+KqrJnFHzNgJhVUCQFzCAukMDV4PLfeQJSmna8PFz2UKva8f
vTutTryyEYu+PauaX5laDjyQbc4RIEMU0Q29CRX3BA8WDYg7YPGRdTkCQQCG+pjU
2FB17ZLuKRlKEdtXNV6zQFTmFc1TKhlsDTtCkWs/xwkoCfZKstuV3Uc5J4BNJDkQ
OGm38pDRPcUDUh2/
-----END PRIVATE KEY-----
3.公钥文件示例
-----BEGIN CERTIFICATE-----
MIIDNzCCAqCgAwIBAgIJAJaZj8YlPQcIMA0GCSqGSIb3DQEBBQUAMHExCzAJBgNV
BAYTAkhLMQswCQYDVQQIEwJISzELMAkGA1UEBxMCSEsxDTALBgNVBAoTBE1QQVkx
DTALBgNVBAsTBE1QQVkxDTALBgNVBAMTBE1QQVkxGzAZBgkqhkiG9w0BCQEWDE1Q
QVlAMTIzLkNPTTAeFw0xNjA3MDUxMDM5NDJaFw0xODA3MjUxMDM5NDJaMHExCzAJ
BgNVBAYTAkhLMQswCQYDVQQIEwJISzELMAkGA1UEBxMCSEsxDTALBgNVBAoTBE1Q
QVkxDTALBgNVBAsTBE1QQVkxDTALBgNVBAMTBE1QQVkxGzAZBgkqhkiG9w0BCQEW
DE1QQVlAMTIzLkNPTTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyiVbdBOF
Qtb03wKw+7oR7bA32vi5/XkJ33CbzdiID+ZK6lkeeRlJVIQvf2UsfScIeTLE/Nyn
lapF12Gsw9dVoiCzrScagn3kknFcE7fM2x4kyLLNQdJgJvb7jCRl/oMOziVT+z5R
cZ8SS11vO5Dk5kx8W4n66ldoyDeUVXArlCcCAwEAAaOB1jCB0zAdBgNVHQ4EFgQU
epQ9Qvg/VE5nb69L+D08eqn6/E8wgaMGA1UdIwSBmzCBmIAUepQ9Qvg/VE5nb69L
+D08eqn6/E+hdaRzMHExCzAJBgNVBAYTAkhLMQswCQYDVQQIEwJISzELMAkGA1UE
BxMCSEsxDTALBgNVBAoTBE1QQVkxDTALBgNVBAsTBE1QQVkxDTALBgNVBAMTBE1Q
QVkxGzAZBgkqhkiG9w0BCQEWDE1QQVlAMTIzLkNPTYIJAJaZj8YlPQcIMAwGA1Ud
EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAOHgqqxMLoaUW/i43KtTHFGciwr9m
OkusX4B4kx5sKN8Ed110iyRPixMKCslV2EHP4uIVAMWhEw+AxULbJte86r8ryr/m
Jc0PR4U9vrpQxdWLsBh8lhKgC4GVJb8jkwcVkjF/XvvVUp/VqHto+LBnjdNAXqZa
GbuKXbLTnmIwGes=
-----END CERTIFICATE-----
海关申报接口
正式环境发送异步通知只支持443或80端口 其他端口暂时不支持。
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
由于海关对于支付单的留存存在有效期(一般不超过15天),故建议不要过早推送支付单以免后续三单对碰时支付单在海关已失效;如遇此类情况,可联系我司进行支付单重推操作。
提交参数
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/custom/applyImptDec.do |
正式环境 | https://global.chinapnr.com/custom/applyImptDec.do |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
version | String | 是 | 10 | 网关版本,固定值:1.0 1.0-海关申报 |
1.0 |
bgUrl | String | 是 | 256 | 服务器接受海关申报结果的后台地址 | http://127.0.0.1:8081/QAMOCK-Test/receiveCustomBg.do |
signType | String | 是 | 2 | 签名类型,固定值:4 4-RSA加签 |
4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
dealId | String | 必选 | 32 | 对应原支付交易成功时我司返回的dealId的值 | P99999 |
customCode | String | 必选 | 32 | 海关编码,参照海关编码附录 | NBHG |
customVersion | String | 可选 | 8 | 海关版本。预留,为空即可 | |
merCustomCode | String | 必选 | 32 | 商户海关备案号,商户在海关的备案号 (注:非汇付备案号) |
TES******20000 |
merCustomName | String | 必选 | 64 | 电商平台的海关注册登记名称 | XXXXX有限公司 |
payerIdType | string | 必选 | 2 | 证件类型,证件类型默认为身份证:1-身份证 | 1 |
payerName | string | 必选 | 96 | 购买人中文姓名 | 张三 |
payerIdNumber | string | 必选 | 32 | 购买人身份证号,字符串,18位身份证号。如果身份证号包含X,请保持字母为大写 | 320125198800001111 |
orderId | String | 必选 | 32 | 商户订单号,字符串,只允许使用字母、数字、_、-,并以_,字母或数字开头,每商户提交的订单号,必须在自身账户交易中唯一;合并支付时,填写商户子订单号 | 20170821125324 |
orderCurrency | String | 必选 | 3 | 默认CNY | CNY |
orderAmt | Number | 必选 | 15 | 订单金额,整型数字,单位为分。日韩元支持的最小单位为元。 需满足orderAmt=freightAmt+goodsAmt+taxAmt-offsetAmt |
如100元,则填写10000 |
freightAmt | Number | 必选 | 15 | 物流费,没值传0,整型数字,以分为单位。比方10元,提交时金额应为1000,商户页面显示金额可以转换成以元为单位显示 | 如100元,则填写10000 |
goodsAmt | Number | 必选 | 15 | 货款,没值传0,整型数字,以分为单位。比方10元,提交时金额应为1000,商户页面显示金额可以转换成以元为单位显示 | 如100元,则填写10000 |
taxAmt | Number | 必选 | 15 | 税款,没值传0,整型数字,以分为单位。比方10元,提交时金额应为1000,商户页面显示金额可以转换成以元为单位显示 | 如100元,则填写10000 |
offsetAmt | Number | 必选 | 15 | 抵扣金额,没值传0,整型数字,以分为单位。比方10元,提交时金额应为1000,商户页面显示金额可以转换成以元为单位显示 | 如100元,则填写10000 |
ecpShortName | String | 必选 | 16 | 填写电商平台在检验检疫的备案号,推送南沙时请准确填写,其他海关填写一固定值即可 | SHHF |
ecpDomainName | String | 必选 | 64 | 电商平台域名 | |
competCustom | String | 必选 | 32 | 主管海关代码 | 固定在 1 |
iaqInstCode | String | 必选 | 32 | 检验检疫机构代码 | 固定值 1 |
bizType | String | 可空 | 16 | 拆单标识 Split表示拆单,其他值不拆单 | Split |
ext1 | String | 可选 | 512 | 扩展字段1,若传值为payerCheck,则以原始交易留存的身份信息报关,详细逻辑为: 检查商户报关接口上送的姓名和身份证号是否与dealId对应的原始交易中留存的姓名和证件号码一致 a、若原支付交易中未留存姓名和身份证号,则以商户报关接口上送的支付人信息报送海关; b、若原支付交易中留存了身份信息但和商户报送的不一致,则以我司系统中留存的身份信息报送海关 c、若原支付交易中留存的身份信息和商户报送的一致,则以我司系统中留存的身份信息报关 |
扩展字段1 |
ext2 | String | 可选 | 512 | 扩展字段2,英文或中文字符串支付完成后,按照原样返回给商户 | 扩展字段2 |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&bgUrl={bgUrl}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&dealId={dealId}&customCode={customCode}&customVersion={customVersion}&merCustomCode={merCustomCode}&merCustomName={merCustomName}&payerIdType={payerIdType}&payerName={payerName}&payerIdNumber={payerIdNumber}&orderId={orderId}&orderCurrency={orderCurrency}&orderAmt={orderAmt}&freightAmt={freightAmt}&goodsAmt={goodsAmt}&taxAmt={taxAmt}&offsetAmt={offsetAmt}
只对非空值的字段进行加签。
返回结果
申报结果更新申报成功或申报失败会通知提交时bgUrl对应的地址。
商户在接受到Chinapnr异步通知后,应返回成功接受内容,如"SUCCESS"。
返回参数(同步通知,异步通知返回皆为以下参数)
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
version | String | 必选 | 10 | 版本号;固定值:1.0 | 1.0 |
bgUrl | String | 必选 | 256 | 后台通知地址 | http://192.168.1.111:8081/QAMOCK-Test/receiveCustomBg.do |
signType | String | 必选 | 2 | 签名方式;固定值:4-RSA | 4-RSA |
merchantAcctId | String | 必选 | 32 | 商户号 | 1001215986001 |
terminalId | String | 必选 | 32 | 终端号 | 99999 |
dealId | String | 可选 | 32 | 支付流水号,在bizType传值为Split即标识拆单情况下,该值为新生成的支付单号, 即海关平台查单的支付单号为该值而非请求中上送的支付单号;若bizType不为Split,则该值同请求。 |
P99999 |
customCode | String | 必选 | 32 | 海关代码 | NBHG |
customVersion | String | 可选 | 8 | 海关版本 | |
merCustomCode | String | 必选 | 32 | 商户海关备案号 | 310496099C |
merCustomName | String | 必选 | 32 | 商户海关备案名称 | 上海汇付支付有限公司 |
ecpShortName | String | 必选 | 16 | 电商平台企业简写(四位) | SHHF |
ecpDomainName | String | 必选 | 64 | 电商平台互联网域名 | |
competCustom | String | 必选 | 32 | 主管海关代码 | 10002000 |
iaqInstCode | String | 必选 | 32 | 检验检疫机构代码 | 60007000 |
payerIdType | Number | 必选 | 2 | 证件类型 | 1 |
payerName | String | 必选 | 64 | 姓名 | |
payerIdNumber | String | 必选 | 32 | 身份证号 | |
orderId | String | 必选 | 32 | 商户订单号 | 20170821091312 |
orderCurrency | String | 必选 | 3 | 订单币种 | USD |
orderAmt | Number | 必选 | 15 | 订单金额 | 如100元,则填写10000 |
freightAmt | Number | 必选 | 15 | 物流费 | 如100元,则填写10000 |
goodsAmt | Number | 必选 | 15 | 货款 | 如100元,则填写10000 |
taxAmt | Number | 必选 | 15 | 关税 | 如100元,则填写10000 |
offsetAmt | Number | 必选 | 15 | 抵扣金额; 杭州海关当前不支持抵扣金额,请传值0 |
如100元,则填写10000 |
bizType | String | 可选 | 16 | 业务类型 | |
ext1 | String | 可选 | 512 | 扩展字段1,当商户请求的ext1值为payerCheck时,异步返回的ext1值有如下逻辑: NA-原交易未提交支付人信息,以商户申报提交为准报送海关 SAME-一致 INCONSISTENT-不一致,系统留存信息未通过二要素验证,以商户提交信息推送海关 DIFFERENT-不一致,以系统留存信息推送海关 注意申报结果仍以“decResult”为准 若请求不为payerCheck则原样返回。 |
|
ext2 | String | 可选 | 128 | 扩展字段2,与提交订单时一致 | |
declareId | String | 必选 | 32 | 申报ID | |
decResult | String | 必选 | 2 | 结果:10-接收成功、11-接收失败、21-申报失败、20-申报成功 | 20 |
errorCode | String | 必选 | 8 | 错误代码,详细请参考错误代码附录 | 000000 |
errorMsg | String | 必选 | 256 | 错误描述。失败时返回的错误信息,可以为空。 | 03:保存成功02:支付单报文处理失败,接收报文为旧报文数据,不做处理 |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。对于所有值不为空的参数及对应值,按照字母顺序组成字符串 DSA:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 注:若通过sdk接入,则无需自己处理,代码已封装 |
competCustom={competCustom}&customCode={customCode}&customVersion={customVersion}&dealId={dealId}&decResult={decResult}&declareId={declareId}&ecpDomainName={ecpDomainName}&ecpShortName={ecpShortName}&errorCode={errorCode}&errorMsg={errorMsg}&freightAmt={freightAmt}&goodsAmt={goodsAmt}&iaqInstCode={iaqInstCode}&merCustomCode={merCustomCode}&merCustomName={merCustomName}&merchantAcctId={merchantAcctId}&offsetAmt={offsetAmt}&orderAmt={orderAmt}&orderCurrency={orderCurrency}&orderId={orderId}&payerIdNumber={payerIdNumber}&payerIdType={payerIdType}&payerName={payerName}&taxAmt={taxAmt}&terminalId={terminalId}&version={version}
根据字母排序(如a**字段放在b**字段前面)验签。
请求示例
请参考具体Demo。 下载地址
BG返回示例
BG以http Key-Value方式返回,如:
ecpDomainName=www.xxx.com
signType=4
merCustomCode=TEST1000020000
version=1.0
payerIdType=1
terminalId=hgpass
decResult=20
bgUrl=http://localhost:63611/receiveBg.aspx
taxAmt=0
merCustomName=TEST
customCode=NBHG
orderId=20170815171329
orderAmt=500
ecpShortName=Test
customVersion=
offsetAmt=0
declareId=467
merchantAcctId=1001215986001
competCustom=10002000
goodsAmt=0
orderCurrency=CNY
dealId=c94858
iaqInstCode=60007000
freightAmt=500
ext1=
ext2=
signMsg=JnsPMjJVveVbzQoRi16qk0Z5ITCNbl09qNSTRuljY1UJc3wmKTfJIqEWcfWn48S6DDhWds06L2qTmMoFWnhCKMgcA6TvfmLpXIJppdF7Qme1c9wOYbAWs2rgH3TvcF9Zd7vokc9ruw%2FE3LAVJKaRJazpIVyQLVfFH%2F0xHYx6f8k%3D
bizType=
payerIdNumber=321281000000003913
payerName=张三
海关接口参数填写说明
请参考具体文件。 下载地址
海关推送,我司支付企业代码
企业名称:上海汇付支付有限公司;支付企业代码:310496099C
at直连海关申报接口
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
1 接口定义
1.1 报关申请接口
1.1.1 请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/atcustom/declareApply.htm |
正式环境 | https://global.chinapnr.com/atcustom/declareApply.htm |
1.1.2 协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | Number | 是 | 1 | 字符集,固定值:11-UTF-8 | 1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4 4-RSA加签 |
4 |
1.1.3 业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
requestId | String | 必选 | 32 | 请求流水号,只允许使用字母、数字、_,每个商户提交的流水号,必须在自身账户交易中唯一 该参数用于商户与汇付交易记录的唯一性保证 |
20170728120001001 |
requestTime | String | 必选 | 14 | 请求时间, 数字串,一共14位。格式:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位]即: yyyyMMddHHmmss | 20170728120001 |
dealId | String | 必选 | 32 | 汇付支付单号 | 20000100 |
outTradeNo | String | 必选 | 32 | 报关流水号, 微信时为支付时返回的商家订单号 | 20150806125346 |
tradeNo | String | 必选 | 64 | 微信/支付宝支付单号,交易接口的bankDealId的值 | 2013111511001004390000105126 |
customs | String | 必选 | 32 | 海关,参考微信/支付宝的海关列表 | SHANGHAI |
mchCustomsNo | String | 必选 | 32 | 商户海关备案号 | 310496099C |
mchCustomsName | String | 可选 | 128 | 商户海关备案名称 | 上海汇付支付有限公司 |
amount | Number | 可选 | 15 | 报关金额, 整型数字以分为单位。比方10元,提交时金额应为1000 拆单时amount=transportFee+productfee | 1000 |
actionType | String | 可选 | 6 | 报关操作类型 Add-新增 Modify-修改 Repush-重推 默认Add |
Add |
isSplit | String | 必选 | 1 | 是否拆单 Y-拆单,N-不拆单 | Y |
subOutTradeNo | String | 条件必选 | 32 | 子订单号, isSplit=Y时必填 | 20150806125346 |
transportFee | Number | 条件必选 | 15 | 物流费整型数字以分为单位。比方10元,提交时金额应为1000isSplit=Y时必填 | 100 |
productFee | Number | 条件必填 | 15 | 商品价格整型数字以分为单位。比方10元,提交时金额应为1000isSplit=Y时必填 | 100 |
duty | Number | 可选 | 15 | 关税整型数字以分为单位。比方10元,提交时金额应为1000 | 60 |
buyerName | String | 可选 | 64 | 订购人姓名 | 张三 |
buyerIdNo | String | 可选 | 32 | 订购人身份证号,如果身份证号包含X,请保持字母为大写 | 330821198809081234 |
ext1 | String | 可选 | 128 | 扩展字段1预留 | ext1 |
ext2 | String | 可选 | 512 | 扩展字段2,预留户 | ext2 |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&requestId={requestId}&requestTime={requestTime}&dealId={dealId}&outTradeNo={outTradeNo}&tradeNo={tradeNo}&customs={customs}&mchCustomsNo={mchCustomsNo}
1.1.4 返回参数
报关申请请求处理完成后,会同步返回如下数据。
参数名称 | 参数含义 | 最大长度 | 参数说明 |
---|---|---|---|
requestId | 商户请求流水号 | 32 | 商户请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
pnrResultCode | 汇付处理结果 | 1 | S-成功, F-失败 |
pnrErrorCode | 汇付异常码 | 6 | pnrResultCode=F时有值, 详见Error Code定义 |
pnrErrorMsg | 汇付异常描述 | 255 | pnrResultCode=F时有值, 详见Error Code定义 |
signMsg | 签名字段 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 对于所有值不为空的参数及对应值,按照指定顺序组成字符串:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 注:若通过sdk接入,则无需自己处理,代码已封装 |
instProcessResult | 通道返回结果 | 通道响应报文先GZIP压缩, 再Base64转码, 商户取得之后先Base64解码再Gzip解压即可 商户应依据该字段判断实际微信/支付宝的报关结果: 1、若报关失败,应依据微信/支付宝的返回信息更新数据重新推送或依据商户自身逻辑处理; 2、若报关未得到最终结果,可调用报关查询查询报关记录在微信/支付宝的报关结果 |
- 下述述字段顺序进行验签
- 仅对非空字段进行验签
ext1={ext1}&ext2={ext2}&pnrErrorCode={pnrErrorCode}&pnrErrorMsg={pnrErrorMsg}&pnrResultCode={pnrResultCode}&requestId={requestId}&requestTime={requestTime}
1.2 报关查询接口
1.2.1 请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/atcustom/declareQuery.htm |
正式环境 | https://global.chinapnr.com/atcustom/declareQuery.htm |
1.2.2 协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | Number | 是 | 1 | 字符集,固定值:11-UTF-8 | 1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4 4-RSA加签 |
4 |
1.1.3 业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
requestId | String | 条件必选 | 32 | 请求流水号,只允许使用字母、数字、_,每个商户提交的流水号,必须在自身账户交易中唯一 该参数用于商户与汇付交易记录的唯一性保证 |
20170728120001001 |
requestTime | String | 条件必选 | 14 | 请求时间, 数字串,一共14位。格式:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位]即: yyyyMMddHHmmss | 20170728120001 |
dealId | String | 条件必选 | 32 | 汇付支付单号 | 20000100 |
outTradeNo | String | 必选 | 32 | 报关流水号, 微信时为支付时返回的商家订单号 | 20150806125346 |
tradeNo | String | 必选 | 64 | 微信/支付宝支付单号,交易接口的bankDealId的值 | 2013111511001004390000105126 |
customs | String | 必选 | 32 | 海关,参考微信/支付宝的海关列表 | SHANGHAI |
isSplit | String | 必选 | 1 | 是否拆单 Y-拆单,N-不拆单 | Y |
subOutTradeNo | String | 必选 | 32 | 子订单号, isSplit=Y时必填 | 20150806125346 |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
- 按以下固定字段顺序进行加签
- 仅对非空字段进行加签
- 加密字段明文加签
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&requestId={requestId}&requestTime={requestTime}&dealId={dealId}&outTradeNo={outTradeNo}&tradeNo={tradeNo}&customs={customs}
1.2.4 返回参数
报关申请请求处理完成后,会同步返回如下数据。
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
requestId | 商户请求流水号 | 32 | 商户请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
pnrResultCode | 汇付处理结果 | 1 | S-成功, F-失败 |
pnrErrorCode | 汇付异常码 | 6 | pnrResultCode=F时有值, 详见Error Code定义 |
pnrErrorMsg | 汇付异常描述 | 255 | pnrResultCode=F时有值, 详见Error Code定义 |
signMsg | 签名字段 | 2048 | 签名字符串,商户需对该字段进行验签。详情请参考验签方法。对于所有值不为空的参数及对应值,按照指定顺序组成字符串:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 注:若通过sdk接入,则无需自己处理,代码已封装 |
instProcessResult | 通道返回结果 | 通道响应报文先GZIP压缩, 再Base64转码, 商户取得之后先Base64解码再Gzip解压即可 |
- 下述字段顺序进行验签
- 仅对非空字段进行验签
pnrErrorCode={pnrErrorCode}&pnrErrorMsg={pnrErrorMsg}&pnrResultCode={pnrResultCode}&requestId={requestId}&requestTime={requestTime}
2 错误码
错误代码 | 错误提示信息 | 错误处理逻辑 |
---|---|---|
000000 | 成功 | |
110001 | 必须提交的请求参数未提交 | |
110002 | 请求的数据项长度不符 | |
110003 | 请求的数据项格式错误 | |
110005 | 请求的数据项不合法 | |
120010 | 请求的商户不存在 | |
120011 | 请求的商户状态异常 | |
120101 | 该商户账户已被冻结,禁止交易 | |
120103 | 该商户账户已被删除,禁止交易 | |
120110 | 该商户账户已被止入,禁止交易 | |
120011 | 请求的商户号状态异常,不允许交易 | |
120014 | 产品功能未开通,不允许交易 | |
120023 | 交易请求Ip未知,不允许交易 | |
200001 | 订单信息的签名内容不正确 | |
400001 | 原交易不存在 | |
400007 | 原交易状态错误 | |
999999 | 系统异常,请稍后重试 |