本开发文档的阅读对象为:具有一定开发能力,了解PHP、JAVA、.NET等开发语言的开发、维护或管理人员。
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
版本号 | 更新说明 | 更新日期 |
---|---|---|
V1.0 | 创建 | 2018.02.06 |
-
商户会员号
Chinapnr网关支付时提交的为商户会员号,并非商户号,会员号=商户号+"01"(如商户号为abc时,会员号为abc01)
商户接入Chinapnr网关支付时,调用API须遵循以下规则:
传输方式 | 为保证交易安全性,采用 HTTPS 传输 |
提交方式 | 采用 POST 方法提交 |
数据格式 | HTTP KEY=VALUE 格式 |
字符编码 | 支持 UTF-8 字符编码 |
签名算法 | 商户生成签名字符串,现支持的签名算法类型为 RSA-SHA1 |
签名要求 | 请求和接收数据均需要校验签名 |
场景介绍
聚合支付宝、微信扫码支付、快捷支付、网银支付适用于PC端。
微信公众号支付,微信小程序支付,微信APP支付,H5形式的快捷支付。 适用于移动端。
第一步:用户击进入商户网页购物进行支付
图3.0 商户移动端下单
第二步:商户调用聚合支付,返回付款二维码给用户。用户使用微信/支付扫码支付完成。
第三步:支付成功,商户后台得到支付成功的通知。并且Chinapnr返回商户页面,显示购买成功。该页面由商户自定义。
图3.3 返回商户页面
概述
本文档展示了如何从零开始,与Chinapnr跨境聚合支付对接的流程。
第一步:获取账号信息
-
商户需与前端销售沟通开通测试账号或生产账号,并提供接受邮箱地址。
-
1-2个工作日内由开通组负责将开通的账号信息发送至商户邮箱。
第二步:配置密钥
-
开发者调用接口前需要先生成RSA密钥,RSA密钥包含私钥、公钥。生成密钥后在商户后台进行密钥配置,配置完成后可发起交易。详细步骤请参考配置秘钥。
第三步:搭建和配置开发环境
-
下载示例代码Demo
为了帮助开发者调用开放接口,我们提供了示例代码下载,包含JAVA、PHP和.NET三语言版本,封装了签名&验签、HTTP接口请求等基础功能。请先下载对应语言版本的Demo并引入您的开发工程下载地址。 -
将Demo运行成功,并将代码集成到您的项目中,记得修改商户号,终端号,和私钥证书。如生产环境,还需更换Chinapnr生产公钥证书。
调用流程
接口调用时序图:
图4.1 聚合支付调用时序图
-
用户(交易过程中的买家或实际支付人,以下简称用户)在商户(交易过程中的卖家或者电商平台,以下简称商户)网站下单完毕后确认进行在线支付。
-
用户点击确认按钮后,商户系统收集订单信息并通过《跨境聚合支付接口》下单接口向汇付天下(以下简称汇付)发起支付请求。
-
汇付对商户的支付请求进行处理并返回支付二维码.
-
用户扫描二维码完成支付。
-
支付结果页面跳转到汇付后,汇付会进行相关处理,并继续将页面跳转到由商户提供的支付结果页面,汇付在跳转时所携带的参数请参照《跨境聚合支付接口》中的返回参数章节。
-
商户系统根据收到的支付结果进行相应的展示,告知用户该笔订单的支付结果。
-
同时汇付系统会在后台通过支付结果通知接口通知商户系统该笔订单的支付结果,该地址不能与第6步中提供的支付结果页面地址相同。 后台通知以收到商户系统返回的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)的形式作为参数传入。
请求示例:
pageUrl=http://127.0.0.1:8081/QAMOCK-Test/notifyReceiverPg.do
signType=4
refererUrl=http://www.baidu.com
settlementCurrency=CNY
version=4.0
inputCharset=1
customerId=1001
bgUrl=http://127.0.0.1:8081/QAMOCK-Test/notifyReceiverBg.do
inquireTrxNo=
orderAmount=600
productNum=1
payerContactType=2
orderId=20170821175929871
payerIdentityCard=320125198805232313
merchantAcctId=1001215986501
terminalId=0020001
orderCurrency=CNY
divDetails=
payerContact=15800000000
orderTime=20170821175928
customerIp=127.0.0.1
productId=100003
productDesc=IPHONE6港版
ext1=ext1
ext2=ext2
signMsg=TgPPi15HAgjVvjeRl8WH7tFL8DCWfaIQFUhxYjPenuaYz6JwVv9ExpCEckBcp9oMfkipTSOTMtaP2UYf3UUfe+kXiBr5OSML3chY5ZRHYTDKQ+NZKYY+yK7tZHQ6bNEvC3nG3cD+emeJj9oIoG6+AAlxxPtEuuzy+I+CzwWEI5E=
payType=30
language=1
mobileNumber=15811111111
orderTimeout=60
productName=IPHONE6
payerName=张三
cardNumber=6228480402564890018
redoFlag=1
在提交参数中需要对传入的数据进行签名组成signMsg字段,签名方法如下:
1.将所有非空参数(sign除外)按照signMsg签名串:
inputCharset={inputCharset}&pageUrl={pageUrl}&bgUrl={bgUrl}&version={version}&language={language}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&payerName={payerName}&payerContactType={payerContactType}&payerContact={payerContact}&payerIdentityCard={payerIdentityCard}&mobileNumber={mobileNumber}&cardNumber={cardNumber}&customerId={customerId}&orderId={orderId}&inquireTrxNo={inquireTrxNo}&orderCurrency={orderCurrency}&settlementCurrency={settlementCurrency}&orderAmount={orderAmount}&orderTime={orderTime}&productName={productName}&productNum={productNum}&productId={productId}&productDesc={productDesc}&ext1={ext1}&ext2={ext2}&payType={payType}&refererUrl={refererUrl}&customerIp={customerIp}&orderTimeout={orderTimeout}&divDetails={divDetails}&redoFlag={redoFlag}
按顺序用&连接起来组成字符串,格式是:p1=v1&p2=v2。如:
inputCharset=1&pageUrl=http://127.0.0.1:8081/QAMOCK-Test/notifyReceiverPg.do&bgUrl=http://127.0.0.1:8081/QAMOCK-Test/notifyReceiverBg.do&version=4.0&language=1&signType=4&merchantAcctId=1001215986501&terminalId=0020001&payerName=张三&payerContactType=2&payerContact=15800000000&payerIdentityCard=320125198805232313&mobileNumber=15811111111&cardNumber=6228480402564890018&customerId=1001&orderId=20170821174125189&orderCurrency=CNY&settlementCurrency=CNY&orderAmount=600&orderTime=20170821174110&productName=IPHONE6&productNum=1&productId=100003&productDesc=IPHONE6港版&ext1=ext1&ext2=ext2&payType=30&refererUrl=http://www.baidu.com&customerIp=127.0.0.1&orderTimeout=60&redoFlag=1
2.进行RSA签名后获得sign,再经过Base64编码,具体加签代码 demo,最终的请求报文样式参考如下:
REQUEST URL: https://global.chinapnr.com/pay/recvquickpay.htm
REQUEST METHOD: POST
CONTENT:
pageUrl=http://127.0.0.1:8081/QAMOCK-Test/notifyReceiverPg.do
signType=4
refererUrl=http://www.baidu.com
settlementCurrency=CNY
version=4.0
inputCharset=1
customerId=1001
bgUrl=http://127.0.0.1:8081/QAMOCK-Test/notifyReceiverBg.do
inquireTrxNo=
orderAmount=600
productNum=1
payerContactType=2
orderId=20170821175929871
payerIdentityCard=320125198805232313
merchantAcctId=1001215986501
terminalId=0020001
orderCurrency=CNY
divDetails=
payerContact=15800000000
orderTime=20170821175928
customerIp=127.0.0.1
productId=100003
productDesc=IPHONE6港版
ext1=ext1
ext2=ext2
signMsg=TgPPi15HAgjVvjeRl8WH7tFL8DCWfaIQFUhxYjPenuaYz6JwVv9ExpCEckBcp9oMfkipTSOTMtaP2UYf3UUfe+kXiBr5OSML3chY5ZRHYTDKQ+NZKYY+yK7tZHQ6bNEvC3nG3cD+emeJj9oIoG6+AAlxxPtEuuzy+I+CzwWEI5E=
payType=30
language=1
mobileNumber=15811111111
orderTimeout=60
productName=IPHONE6
payerName=张三
cardNumber=6228480402564890018
redoFlag=1
注意:
没有值的参数无需传递,也无需包含到待签名数据中。
签名时将字符转化成字节流时指定的字符集UTF8。
根据HTTP协议要求,传递参数的值中如果存在特殊字符(如:&、@等),那么该值需要做URL Encoding,这样请求接收方才能接收到正确的参数。此时,待签名数据应该是原始值而不是encoding之后的值。 例如:调用某接口需要对请求参数 email 进行数字签名,那么待签名数据应该是:email=test@abc.com,而不是 email=test%40abc.com。
返回结果
返回示例:
dealTime=20170821180822
errCode=000000
merchantAcctId=1001215986501
orderTime=20170821180751
orderCurrency=CNY
dealId=1000015038
version=4.0
bankId=ccb
terminalId=0020001
payResult=10
ext1=ext1
orderAmount=600
ext2=ext2
signMsg=K+TAl+GOx89Pu27KqLfgLvfTZc2T491Mn8f6hO5xFxsJL/sgtsgM7/cwpJCxZJMEJE/wg5M30PKB6XKc/7BSrPlYtKUbbb0xm5Pi1btbKCprl/y/xYjg1JWaKpmQKv/kYobNd2LZFssA6TOTUQn3x9+wEK0N9Z/dUo+ISLNRbW0=
payType=30
orderId=20170821180758470
调用Chinapnr开放平台接口后,Chinapnr会向开发者提交的pageUrl地址同步返回支付结果。为保证信息安全,会经Chinapnr私钥进行RSA加密,开发者收到消息后可通过ChinapnrRSA公钥进行解密。
1.将所有返回参数(signMsg除外)按照signMsg验签串按顺序拼接:
bankDealId={bankDealId}&bankId={bankId}&dealId={dealId}&dealTime={dealTime}&errCode={errCode}&ext1={ext1}&ext2={ext2}&merchantAcctId={merchantAcctId}&orderAmount={orderAmount}&orderCurrency={orderCurrency}&orderId={orderId}&orderTime={orderTime}&payResult={payResult}&payType={payType}&terminalId={terminalId}&version={version}
组成待验签字符串,如:
bankId=ccb&dealId=1000015038&dealTime=20170821180822&errCode=000000&ext1=ext1&ext2=ext2&merchantAcctId=1001215986501&orderAmount=600&orderCurrency=CNY&orderId=20170821180758470&orderTime=20170821180751&payResult=10&payType=30&terminalId=0020001&version=4.0
2.将签名参数(signMsg)使用base64解码为字节码串
3.使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及Chinapnr公钥验证签名。具体验签方法 请详见Demo
支付完成后,Chinapnr会向开发者提交的bgUrl地址后台异步返回支付结果。商户处理支付结果以支付结果通知结果为准。
接口返回参数说明请参见《跨境聚合支付接口》
支付结果通知
支付结果通知示例:
dealTime=20170821180822
errCode=000000
merchantAcctId=1001215986501
orderTime=20170821180751
orderCurrency=CNY
dealId=1000015038
version=4.0
bankId=ccb
terminalId=0020001
payResult=10
ext1=ext1
orderAmount=600
ext2=ext2
signMsg=MnUsvrgsAS0ywOsp0w%2Fr1ihlfBLY3fHjBrhevejUosPC2hC7CFsmflv3LdWxKmYXDUUSJpYw7XxMwNUiwwZGO3hLLaVvUJKJeGWOrQ4E3LnKWqxgmiGeDyttKq2UJhvT7O067Rll%2BQDfaE254GLxzztgdjFNJMESoxLw2ckOLE8%3D
payType=30
orderId=20170821180758470
支付结果通知的验签
1.将所有返回参数(signMsg除外)按照signMsg验签串按顺序拼接:
bankDealId={bankDealId}&dealId={dealId}&dealTime={dealTime}&errCode={errCode}&ext1={ext1}&ext2={ext2}&merchantAcctId={merchantAcctId}&orderAmount={orderAmount}&orderCurrency={orderCurrency}&orderId={orderId}&orderTime={orderTime}&payResult={payResult}&payType={payType}&terminalId={terminalId}&version={version}
组成待验签字符串,如:
dealId=1000015038&dealTime=20170821180822&errCode=000000&ext1=ext1&ext2=ext2&merchantAcctId=1001215986501&orderAmount=600&orderCurrency=CNY&orderId=20170821180758470&orderTime=20170821180751&payResult=10&payType=30&terminalId=0020001&version=4.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认为成功,否则会一直通知,通知策略是一共通知15次,前面每隔10s通知一次 一共通知6次每次,后9次通知时间间隔增加(N*60s+30s,N为第几次通知,如第7次通知间隔第一次7min30s)。
3.在Chinapnr的业务通知中,只有交易通知payResult状态为10时,Chinapnr才会认定为买家付款成功。如果商户未正确处理业务通知,存在潜在的风险,商户自行承担因此而产生的所有损失。
货币符号 | 币别 |
---|---|
CNY | 人民币 |
USD | 美元 |
HKD | 港元 |
GBP | 英镑 |
JPY | 日元 |
EUR | 欧元 |
AUD | 澳元 |
CAD | 加元 |
银行代码 | 银行名称 |
---|---|
CMB | 招商银行 |
ICBC | 中国工商银行 |
ABC | 中国农业银行 |
CCB | 中国建设银行 |
BOC | 中国银行 |
SPDB | 浦发银行 |
BCOM | 中国交通银行 |
CMBC | 中国民生银行 |
GDB | 广东发展银行 |
CITIC | 中信银行 |
HXB | 华夏银行 |
SRCB | 上海农村商业银行 |
SRCB | 上海农村商业银行 |
PSBC | 中国邮政储蓄银行 |
BOB | 北京银行 |
CBHB | 渤海银行 |
BJRCB | 北京农商银行 |
NJCB | 南京银行 |
CEB | 中国光大银行 |
CZB | 浙商银行 |
CIB | 兴业银行 |
HZB | 杭州银行 |
PAB | 平安银行 |
SHB | 上海银行 |
code(支付错误代码) | msg(支付错误描述) |
---|---|
999999 | 系统异常 |
000000 | 交易处理成功 |
000009 | 交易处理失败 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项长度不符 |
110003 | 请求的数据项格式错误,合法格式请参照接入文档 |
110004 | 错误请求 |
130005 | 风控拦截 |
110005 | 请求的数据项不合法 |
110006 | 请求的交易币别暂不支持 |
200001 | 订单信息的签名内容不正确 |
120010 | 请求的商户号不存在,请检查后重试 |
120011 | 请求的商户号状态异常,不允许交易 |
120012 | 请求的终端号不存在,请检查后重试 |
120013 | 请求的终端号状态异常,不允许交易 |
120014 | 产品功能未开通,不允许交易 |
120023 | 交易请求Ip未知,不允许交易 |
120024 | 支付人Ip在黑名单中,不允许交易 |
120025 | 支付人Ip有变化,存在风险不允许交易 |
120026 | 支付人链接来源有变化,存在风险不允许交易 |
120028 | 未开通任何受理银行,不允许交易 |
120029 | 不可受理的银行代码,不允许交易 |
120030 | 请求的商户号[{0}]/终端号[{1}]对应的结算信息未开通,不允许交易 |
120031 | 请求的商户号/终端号对应的结算币别与交易申请的币别不一致,请更换对应终端后重试 |
120032 | 请求的商户号/终端号对应的报价币别与交易申请的币别不一致,请更换对应终端后重试 |
120034 | 请求的商户号[{0}]/产品代码[{1}]/币别[{2}]对应的手续费信息未配置,不允许交易 |
120040 | 商户订单号重复,请先确认订单状态或重新下单后支付 |
120050 | 请求的交易币别[{0}]与结算币别[{1}]不一致 |
120061 | 交易金额大于商户最高交易限额 |
120062 | 交易金额低于商户最低交易限额 |
120063 | 当日交易金额已大于日最高交易限额 |
120064 | 无可用的收单通道 |
120065 | 目标币别的汇率不存在 |
120066 | 交易金额精度超出交易币别的最小单位 |
120069 | 支付超时,请重新支付 |
120070 | 订单超时,请重新下单 |
120100 | 该商户账户异常,已被禁止交易 |
120101 | 该商户账户已被冻结,禁止交易 |
120102 | 该商户账户功能已被限制,禁止交易 |
120103 | 该商户账户已被删除,禁止交易 |
120110 | 该商户账户已被止入,禁止交易 |
120111 | 该商户账户已被止出,禁止交易 |
120112 | 该商户账户已被限制充值,禁止交易 |
120113 | 该商户账户已被限制提现,禁止交易 |
120114 | 该商户账户已被限制透支,禁止交易 |
120115 | 该商户账户已被限制支付,禁止交易 |
120116 | 该商户账户已被限制转入,禁止交易 |
120117 | 该商户账户已被限制转出,禁止交易 |
120300 | 授权商户未开通 |
120301 | 授权参数未设值 |
130001 | 交易失败,风控拒绝 |
130002 | 交易失败,疑似重复交易被拦截 |
130003 | 交易失败,产品不在经营范围内 |
100001 | 不支持的字符编码格式,系统支持的字符编码格式为1.UTF-8,2.GBK,3.GB2312 |
100003 | 页面返回地址和后台返回地址不能同时为空,请使用符合URL规则的http或者https地址 |
100005 | 不支持的网关接口版本号 |
100008 | 不支持的付款方联系方式,系统支持的联系方式为1.电子邮件,2.电话.当联系内容不为空时联系方式不能为空 |
100009 | 付款方的联系内容不正确,请输入合法的联系地址 |
100091 | 支付人手机号输入错误 |
100092 | 支付人身份信息有误 |
100010 | 订单号不正确,系统只支持以字母,数字组合的订单号,最大长度不能超过30 |
100011 | 订单金额不正确,请输入以分为单位的金额 |
100012 | 订单提交时间不正确,请输入以yyyyMMddhhmmss格式的时间字符串 |
100013 | 商品名称不正确 |
100014 | 商品数量不正确 |
100015 | 商品ID不正确 |
100016 | 商品的描述不正确 |
100017 | 扩展参数一不正确 |
100018 | 扩展参数二不正确 |
100019 | 指定的支付方式不正确 |
100021 | 指定的银行ID不正确 |
100022 | 不支持的语言类型,系统支持的语言为1.中文,2.英文 |
100023 | 不支持的签名类型,系统支持的签名类型为1.MD5 |
100024 | 客户号格式错误 |
100025 | 卡号格式错误 |
100037 | 对不起,该订单不允许重复提交,请重新下订单提交! |
100054 | 商户签名数据不能为空 |
100065 | 未提供付款人IP地址,请联系商用户网站支持人员 |
100086 | 错误的币别代码 |
200001 | 订单信息的签名内容不正确 |
200004 | 交易金额格式错误 |
400001 | 原交易没有找到 |
400003 | 原交易可退余额不足 |
400002 | 退款币别与原交易不一致 |
400004 | 商户结算状态异常,无法退货 |
400008 | 商户账户余额不足 |
400006 | 超期退货 |
400007 | 原交易状态错误 |
500001 | 银行系统异常 |
结果码 | 含义 | 说明 |
---|---|---|
10000 | 业务处理成功 |
商品编码列表
跨境系统商品类别列表下载商品编码 | 中文类名 |
---|---|
100200 | 服饰箱包 |
100201 | 食品药品 |
100202 | 化妆品 |
100203 | 电子产品 |
100204 | 日用家居 |
100205 | 其他 |
400200 | 航空机票 |
400201 | 酒店住宿 |
400202 | 留学教育 |
400203 | 旅游票务 |
400204 | 国际物流 |
400205 | 国际租车 |
400206 | 国际会议 |
400207 | 软件服务 |
400208 | 医疗服务 |
400209 | 通讯 |
400210 | 休闲娱乐 |
228024 | 广告服务 |
227020 | 计算机服务 |
1.1留学
{
studentInfo:
{
“payAddr”:””; ”payType”:””; ”courseType”:””; ”studentCertId”:””; “studentCertType”:””; ”studentCertEndDate”:“”; “studentNo”:””; “subProductCode”:””}
}
字段枚举
字段 | 枚举值 |
---|---|
payType | 10:一般学费缴费; 11:学费分期付款; 12:定金/占位费; 13:学费预存; 14:校园生活费; 15:校园住宿费; 16:其他学杂费; |
courseType | 1、Graduate Programs 研究生课程 2、Undergraduate Programs 本科课程 9、其他课程 |
studentCertType | 00:身份证 01:护照 02:驾照 09:其他证件类型 |
studentCertEndDate | 格式为YYYYMMDD |
subProductCode: | SA:留学 |
1.2物流
{
logisticsInfo:
{
"subProductCode":""}
}
字段枚举
字段 | 枚举值 |
---|---|
subProductCode | LOG:物流 |
银行受理能力
银行受理能力列表下载网银
网银支持的银行列表以及对借记卡,信用卡限额的说明。详细可下载银行受理文件
图7.1 网银受理能力表
快捷支付
快捷支付支持的银行列表以及对限额说明。详情的借记卡,信用卡受理能力请下载受理文件查看
注意:有些银行卡需要开通银联在线支付业务:
1、建设银行、中国银行、农业银行、光大、兴业、中信、渤海银行,上述银行卡有卡就能用,功能已默认开通。
2、交通银行、平安、浦发、邮储、上海银行,上述银行卡需通过https://online.unionpay.com/portal/open/init.do?entry=open开通银联在线支付业务。
图7.3 快捷支付受理能力表
银联app
银联app银行与限额:
图7.4 银联app受理能力表
转账支付
转账支付受理能力:
图7.5 转账支付受理能力表
产品集成
商户需上传唯一的商户订单号(orderId),同时建议商户订单号中包含年月日等时间信息。
商品ID(productId)需根据商品代码传递,商品名称(productName)需传递。
Chinapnr默认银行支付超时时间12小时,即晚于该订单的最晚付款时间后,将关闭交易。
交易查询
商户可在商户后台进行交易查询,也可通过查询接口查询。
-
进入商户后台“交易管理”=>“交易查询”菜单,输入订单号,Chinapnr交易流水号发起查询。
图6.1 商户后台交易查询
-
网关交易在未收到支付结果通知时通过查询接口查询支付结果,查询接口未返回支付成功,则继续轮询。
详情请参见交易查询接口。
退款
商户因业务原因需要退款时,可通过成功交易的商户订单号或Chinapnr交易号进行退款。Chinapnr退款支持单笔交易分多次退款,多次退款需要提交Chinapnr交易号并设置不同的退款单号;总退款金额不能超过用户实际支付金额。
-
对接退款接口。
详情请参见退款接口。
对账
商户可通过接口下载指定日期(当天除外)的业务明细账单文件,并结合自身业务系统实现自动对账。
-
商户可在商户后台发起日终查询,进入“交易管理”=>“日终交易查询”菜单,选择要查询的交易所对应的终端号,选择日期,点击查询。
对查询出的日终列表,选择点击下载按钮下载日终对账文件。
图6.4 商户后台日终文件查询
-
对接日终文件查询接口
详情请参见日终交易查询。
DEMO下载
注意:Demo下载后可直接运行,也可将项目里商户号,终端号,私钥证书(**.pfx)更换成已开通测试商户的。
支付模式 | 说明 | 平台 | 操作 |
---|---|---|---|
聚合支付API | 聚合支付API对应的DEMO | JAVA | 下载 |
PHP | 下载 | ||
.NET | 下载 | ||
GO | 下载 | ||
单笔交易查询API | 单笔交易查询API对应的DEMO | JAVA | 下载 |
PHP | 下载 | ||
.NET | 下载 | ||
退款API | 退款API对应的DEMO | JAVA | 下载 |
PHP | 下载 | ||
.NET | 下载 | ||
日终交易查询API | 日终交易查询API对应的DEMO | JAVA | 下载 |
PHP | 下载 | ||
.NET | 下载 |
1.订单信息的签名不正确
确保私钥证书正确。
确保加签字段和加签顺序正确,可对照Demo对比
2.订单返回信息验签失败
确保公钥证书正确,与所提交环境匹配,可在对应环境商户后台下载。
确保验签字段和验签顺序正确,可对照Demo对比
3.网关发起交易,报商户号不存在或未开通
网关发起交易时,提交的并非是商户号,而是会员号,会员号=商户号+“01”。
4.TLS1.0 SSL3.0等协议无法正常进行网关交易
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
5.商户site后台证书上传失败
跟商户确认,证书生成“req -new -x509 -key private-rsa.key -days 750 -out public-rsa.cer,按enter”,这里的天数是不是不符合规范,可以查看site应用日志
测试环境证书过期,麻烦测试环境去掉证书到期的验证,就可以了,不影响验签
6.支付宝,微信支付返回支付失败、银行授权失败?
测试环境按照交易规则进行支付,
收单:交易金额transAmt(0,10000) 交易成功,transAmt[10000,50000) 交易失败
退款:退款金额transAmt(0,50)退款成功; transAmt[50,100)退款失败
微信直连退款:transAmt(2,50),退款成功; transAmt[50,100)退款失败
7.提交支付申请,返回产品功能未开通,指定支付方式不存在
麻烦检查终端号是否提交正确,终端号与提交支付方式是否相符,如果都相符,再联系联调同事处理。
8.商户提交申请,返回系统错误,签名错误
1.优先确认商户号是否+01;2.确认请求接口地址是否正确。3.确认商户证书是否上传。4.确认用的私钥证书和上传到我司后台的公钥证书是否一致。5.确认加签的参数和加签顺序是否符合我们文档上的要求。6.确认商户是否做过转码操作urldecode
9.我司公私钥证书作用
商户自行生成一公私钥证书
私钥-->向我司请求时加签
公钥-->上传到我司后台,我司用来对贵司的请求进行验签
商户后台下载公钥证书 ChinaPnR.ras.cer-->贵司用来验我司同步返回或异步通知的签名.由我司提供,在商户后台可自行下载.
10.退款多久可以收到异步通知
我司一般在退款订单提交后,即时执行任务上送通道发起退款,商户会在1-2分终左右收到退款异步通知
11.支付宝扫码支付,发起关单,银行授权失败
请使用支付宝app扫码1分钟后,再发起关单
12.支付成功,未接收到回调异步
烦请确认接口上传bgUrl异步通知地址是否可以正常使用,若可以,烦请联系我司运维同事
13.接收到我司异步通知后,返回我司什么数据
Chinapnr异步通知以通知地址返回HTTPSTATUS为200认为成功,否则会一直通知,通知策略是一共通知15次,前面每隔10s通知一次 一共通知6次每次,后9次通知时间间隔增加(N*60s+30s,N为第几次通知,如第7次通知间隔第一次7min30s)。商户在接受到Chinapnr异步通知后,应返回成功接受内容,如"SUCCESS"
OpenSSL工具安装
1.Linux用户(以Ubuntu为例)
sudo apt-get install openssl
2.Windows用户开发者可以在OpenSSL官方网站下载Windows的OpenSSL安装包进行安装。或直接下载
3.若不习惯查看文档中心,此为证书生成word文档,可自行下载证书生成文档下载RSA私钥及公钥生成
生成证书days在730-780之间
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
提交参数
1.1预下单
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/unifiedorder.htm |
正式环境 | https://global.chinapnr.com/pay/unifiedorder.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
pageUrl | String | 是 | 256 | 接受支付结果的页面地址 | https://www.merchant.com/pay/notifyReceiverPg.do |
bgUrl | String | 是 | 256 | 服务器接受支付结果的后台地址 | https://www.merchant.com/pay/notifyReceiverBg.do |
version | String | 是 | 10 | 网关版本,固定值:3.0 | 3.0 |
language | String | 是 | 3 | 网关页面显示语言种类,固定值:1 1-中文显示 |
1 |
signType | String | 是 | 256 | 签名类型,固定值:4 4-RSA加签 |
4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 是 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 是 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
payerName | String | 条件必选 | 96 | 支付人姓名,中文名,网银直连时必填 | 张三 |
payerContactType | String | 否 | 1 | 支付人联系方式类型,固定值:1或者2 1-代表电子邮件方式 2-其他联系方式 |
1 |
payerContact | String | 否 | 64 | 支付人联系方式,根据payerContactType的方式填写对应字符,邮箱或者其他联系方式 | 13400000000 |
payerIdentityCard | String | 条件必选 | 32 | 支付人身份证号码,字符串,18位身份证号,如果身份证号包含X,请保持字母为大写;跨境结算且为直连模式时必填 | 320125198800001000 |
mobileNumber | String | 否 | 32 | 支付人手机号 | 15800001111 |
cardNumber | string | 否 | 32 | 支付人所持卡号。 | 6225881257400000 |
customerId | string | 条件必填 | 32 | 支付人在商户系统的客户编号。快捷支付时必填,方便用户二次支付; 移动端聚合网关支付必填:(payType=5/5-2/5-4/5-123) |
jd1001 |
customerIp | string | 条件必填 | 32 | 直连微信APP支付必填; 服务商公众号支付必填; 微信直连H5支付必填; 支付宝支付方式建议填写; |
客户ip;示例:127.0.0.1 |
orderId | string | 是 | 32 | 商户订单号,只允许使用字母、数字、_,每商户提交的订单号,必须在自身账户交易中唯一 | 20170728120001299 |
inquireTrxNo | string | 否 | 32 | 查询流水号 商户从CHINAPNR外汇询价时需填入PNR返回的工单号,用于锁定汇率,不填则根据交易时间实时询价 |
交易前已在CHINAPNR询价返回工单号:2089,则填入2089 |
orderCurrency | String | 是 | 3 | 订单币种,3位币别码,详情请参照币别代码附录。当该字段不为CNY时,必须与settlementCurrency一致。 默认请填写CNY,如需其他币别,请联系我司确认 |
如人民币:CNY |
settlementCurrency | String | 是 | 3 | 结算币种,3位币别码,详情请参照币别代码附录。 默认请填写CNY,如需其他币别,请联系我司确认 |
如人民币:CNY |
orderAmount | Number | 是 | 12 | 商户订单金额,整型数字,单位为分。日韩元支持的最小单位为元。 | 如100元,则填写10000 |
orderTime | String | 是 | 14 | 商户订单提交时间,一共14位格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20071117020101 |
productName | String | 是 | 256 | 商品名称 | 订单对应的商品信息,该内容可能会显示给支付人,请尽可能简短完整。 |
productNum | Number | 是 | 8 | 商品数量,整型数字 | 例: 单个商品数量:1 多个商品数量:商品总数量 |
productId | String | 是 | 32 | 商品代码,请根据我司提供的商品代码附录进行填写。 | 如服饰箱包,填写:100200(如多个商品填写最主要的商品代码) |
productDesc | String | 否 | 256 |
填写规则: 商品编号|商品名称|商品数量|商品单价(单位元)|商品链接;商品编号|商品名称|商品数量|商品单价(单位元)|商品链接 填写说明: 1、同一商品用半角竖线分隔,不同商品间用半角分号分隔 2、商品编号,商家该款商品的唯一编码 3、其中,商品编号、商品名称、商品数量、商品单价必填,商品链接非必填(参数非必填,栏位|必要填写) |
填写示例: 200R32P|爱他美1段|2|250|http://baidu.com;200R32M|爱他美2段|1|130| |
ext1 | String | 否 | 128 | 扩展字段1,英文或中文字符串支付完成后,按照原样返回给商户 | 服务商公众号支付时可为空 |
ext2 | String | 否 | 128 | 扩展字段2,英文或中文字符串支付完成后,按照原样返回给商户 | 扩展字段2 |
openId | String | 条件必填 | 128 | deviceType=2,payType=7或8时必填,关注微信公众号的用户分配的id,可参考微信官方文档指引 | 如: op5EP1G8XtyYH1VvmAbleB3AYgc8 |
deviceType | String | 是 | 1 | 1:pc端支付2:移动端支付 | 1 |
payType | String | 是 | 4 | 当deviceType=1时 1:微信扫码 2:支付宝扫码 4:网银直连 6:聚合网关,包含多种支付方式(返回跳转地址)      1:微信扫码      2:支付宝扫码      4:网银支付      5:快捷支付 当deviceType=2时 4: 快捷支付(汇数网关) 5:移动端聚合,包含多种支付方式(返回跳转地址)       2:支付宝H5支付       4:快捷支付 7:微信公众号支付(返回payInfo,注意微信公众号支付已不支持付款完成后回跳来源页面,只能通过微信的点金计划间接实现,如需了解请联系我司沟通) 8:微信小程序支付(返回payInfo);下载文档:微信小程序支付链路指引 D:服务商公众号支付(返回跳转链接) H:银联收银台APP支付 |
当deviceType=1时: 聚合网关可指定一个或多个支付方式,形如: 6展示全部开通支付方式 6-4只显示网银支付 6-5只显示快捷支付 41网银直连只开通B2C 42网银直连只开通B2B 当deviceType=2时: 移动端聚合网关可指定一个或多个支付方式,形如: 5展示所有支付方式 5-2只有支付宝H5支付 5-4只有快捷支付 |
bankId | String | 否 | 8 | 银行代码,请参考银行代码表附录:银行代码。网银直连时必填;即deviceType=1且payType为4时 | 如中国农业银行,ABC |
redoFlag | String | 否 | 1 | 1表示同一订单禁止重复提交标志,预留字段 2表示 同一订单,可重复提交(订单状态为未支付成功) |
当前只有如下支付方式支持:
deviceType=1,payType=2 支付宝扫码; deviceType=2,payType=5-2 支付宝H5; deviceType=2,payType=7 微信公众号; deviceType=2,payType=8 微信小程序; deviceType=2,payType=B 微信直连APP; deviceType=2,payType=C 支付宝直连APP; deviceType=2,payType=H 微信直连H5; |
divFlag | String | 否 | 1 | 指定交易需要分账时上送 | 1表示分账,不上送或上送0表示不分账;分账需要联系我司运营进行开通配置 |
bizContent | JSON | 否 | 128 | 1.指定付款人时上送,格式为:{"desPayer":{"isDestPayer":"Y"}},仅支付宝相关支付方式支持,微信公众号/小程序支付请联系我司沟通
2.指定订单有效期上送,格式为:{"orderExpireTime":"20220210183030"} 3.指定appid上送,格式为:{"appId":"wxf11111a1c4c0a721"} 4.指定上送期望付款人,格式为: { "companyName": "企业名称", "companyLicenseNo": "DZ1000-11", "legalPersonName": "张三", "legalPersonIdNo": "342623198812171432" } 5.指定微信H5:h5_info,格式为: {"h5_info": {"type":"场景类型", "app_name":"应用名", "bundle_id":"iOS平台BundleID", "app_url":"网站URL", "package_name":"Android平台PackageName", } } 6.小程序插件支付,格式为:{"miniProgramPlugin":"1"} |
指定付款人:即微信支付宝会按照上送的付款人姓名+身份证号进行控制,只有以该信息实名的微信账号/支付宝账号才能支付 指定付款人时,payerName和payerIdentityCard必填 针对orderExpireTime值,如下要求: 1、如果传值,则订单的最长可支付时间以传值作为截止时间,格式:YYYYMMDDhhmmss 2、该时间最小不能小于时间-1分钟,最长不能超过当前时间+2小时,以北京时间为准 指定appid上送,只限于微信公众号/微信小程序支付方式(deviceType=2,payType=7/8),其他支付方式不可上送;用于解决同一个商户主体有多个appid且都报备关联时具体一笔交易发生在哪个appId下。 针对上送期望付款人(企业网银B2B), (1)付款企业名称:companyName (2)付款企业营业执照编码:companyLicenseNo (3)付款企业法人姓名:legalPersonName (4)付款企业法人身份证号:legalPersonIdNo 针对微信直连H5上送, (1)type场景类型示例值:iOS,Android,Wap,必填 (2)app_name应用名:按照实际填写,可空 (3)bundle_id iOS平台BundleID:按照实际填写,可空 (4)app_url网站URL:按照实际填写,可空 (5)package_name Android平台PackageName:按照实际填写,可空 针对小程序插件支付:请参考链接 |
signMsg | String | 是 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
备注:ext1传值注意事项
当deviceType=1且payType=6-2或6或6-1245或2;
deviceType=2且payType=5或5-2(支付宝支付)时,
或当deviceType=2且payType=D(服务商公众号支付)时,
ext1字段为JSON格式,内容参考如下:
{
"userProv":"1","userCity":"xxxxxxx", "userGpsAddr":{"latitude":"xxx.xxxxxx","longitude":"xxxx.xxxxx"}
}
userProv-用户所属省份;
userCity-用户所属城市;
上述两个字段请参考我司提供的省份城市码表;
userGpsAddr-用户GPS地址,格式如上文参考,纬度和经度,各自最长不超过20位。
- 按以下固定字段顺序进行加签
- 仅对非空字段进行加签
pageUrl={pageUrl}&bgUrl={bgUrl}&merchantAcctId={merchantAcctId}&terminalId={terminalId}& customerId={customerId}&orderId={orderId}&orderAmount={orderAmount}&orderTime={orderTime}&productDesc={productDesc}&ext1={ext1}&ext2={ext2}& deviceType={deviceType}&payType={payType}&shortCardno={shortCardno}
返回结果
交易结果会同时通知提交时pageUrl和bgUrl对应的地址。
1.1.1预下单返回
预下单请求处理完成后,会返回如下数据,:
参数名称 | 参数含义 | 最大长度 | 参数说明 |
---|---|---|---|
url | 返回地址 | 1024 | 需转义 type=1:商户需将url转换成二维码展示 type=2:商户需将用户的浏览器跳转至该url type=3:此字段为空 |
queryUrl | 扫码结果轮训地址 | 1024 | 备用字段 |
type | 返回类型 | 1 | 1:url是二维码 2:url跳转地址: (1)聚合网关(deviceType=1,payType=6或6-123等;deviceType=2,payType=5或5-123等)及微信服务商公众号支付返回url; (2)转账支付-PC/移动网关模式返回url,商户需跳转至该url以进行后续操作;此场景下,商户需先关注2.3的结果,若2.3返回成功,则可通过2.4接收交易结果(也可通过交易查询来查询交易结果);若2.3返回失败,则交易失败,不再有2.4的异步结果 3:其他(payInfo): (1)微信支付(公众号、小程序)、微信直连APP/支付宝直连APP支付为payInfo; (2)转账支付-API模式为payInfo 4:小程序插件支付 |
respCode | 错误代码 | 6 | 000000 成功,其它为异常 |
respMsg | 错误描述 | 512 | 失败错误描述 |
payInfo | 支付信息 | 64 | 当type为3、4时返回回。 type=3时: 如果是支付宝APP直连支付、微信APP直连支付、微信APP支付、微信公众号支付、微信小程序支付,则为微信生成的预支付回话标识,用于后续接口调用中使用 1.微信小程序、公众号返回payinfo示例: payInfo={"timeStamp":"1575347367","package":"prepay_id=wx03122927942374103a20ec9e1536844900","paySign":"adRRLnffPDdQppE1VmgiZ3EcjnYg7W8r61h+FoSDzWIeUOwic0VNslp3QYvCHXp+x2kr/HzgHTWEgwvAuxqlhecWvPzRdkxSYgNqyKRf36aKJpIvqnyeRGOmouU0AiSOUjM8tMNlLf2m29/MU0iMmdHoGKeo5iMzXAhSremm2wNEPF7/7UjFtikyj2wBN7g0NRBVgMPgjNYghzRV00byZwdoAWcsOTKk63woKMSMmyThAepiYtxtysgXJFbHUsFYFP1F6yThP8AGbw6ZMdkRuVm7jMZ5mMlCEwic9yW24RSpO0yG1cX4/9zP70j1kchr9xkJ41ShQUirGBhcqMoTQg==","appId":"wx561a6afdd366710b","signType":"RSA","nonceStr":"pfv8TcZuJuLTkaYBLLicNBS0pjr4V86a"} 2.银联收银台APP支付(deviceType=2,payType=H)返回示例: type=3&payInfo={"tnOrderNo":"694664222131649327456"}&respCode=000000 3.支付宝/微信直连app返回示例:(唤醒支付宝/微信app支付取红色部分:用正则表达式 /(?<=&payInfo=).*?(?=&respCode)/ 取) type=3&payInfo=alipay_sdk=alipay-sdk-java-3.3.49.ALL&app_auth_token=202001BBa8e8a22d595343adae20e25850e0aX39&app_id=2021001105620951&biz_content=%7B%22out_trade_no%22%3A%2215012008036642332200174%22%2C%22total_amount%22%3A%220.04%22%2C%22subject%22%3A%22app%E6%94%AF%E4%BB%98%E9%AA%8C%E8%AF%81%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay& notify_url=https%3A%2F%2Ftdbpsit.cloudpnr.com%2Fapi%2Ftdbp-biptd-union%2Fat%2Fali%2Ftrans%2Fvk&sign=Cyjydef%2FC6fU6%2F3z4oCkTxVD7TPXfrnE4jo1eyFUW6lJbiMow2qc31%2FkFgVv6gBnR6YuWtQ7DUioQr2zllgXIt600l%2Bpf%2BxsP%2B2NtehX5c6ZObODCJ0V%2BDtCKiVx6ZkfjEeqYMbxsRNG6SaiqJgeVm52pTRzq5ddURuT1M4Hpbs2YdwBZiUKkdGYBlvEGCKiQA43Cnvwr5xwX04zK037NaOanVLVSn6CbG0jVkSRyc4C6JI%2FPEPUJZgq%2BZzC8t6iqYaJFmBzqIB3WfdNmabs%2BtInaIUFpYx4hUsrJotr9XzoYTvutWhHngiBk%2FKHJYw7DR%2FTK6Eg0RXlo%2BiXg346og%3D%3D&sign_type=RSA2×tamp=2020-08-03+18%3A27%3A03&version=1.0&respCode=000000 4.小程序插件支付返回示例: type=3&payInfo={"sequenceId":"2038472330","mac":"8B998DFC8A329D2AA929358969F67CAF"}&respCode=000000 |
1.1.2返回商户支付结果
商户在接受到Chinapnr异步通知后,应返回成功接受内容,如"SUCCESS"。
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 是 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
terminalId | String | 是 | 8 | 终端号,与提交订单时的保持一致 | 999999 |
version | String | 是 | 10 | 网关版本,与提交订单时一致 | 3.0 |
payType | String | 是 | 4 | 支付方式,与提交订单时一致 | 00 |
bankId | String | 是 | 8 | 银行代码,与提交订单一致 | BOC |
orderId | String | 是 | 32 | 商户订单号,与提交订单时一致 | 20170728120001299 |
orderTime | String | 是 | 14 | 商户订单提交时间,与提交订单时一致 | 20171117020101 |
orderCurrency | String | 是 | 3 | 订单币种,与提交订单时一致 | USD |
orderAmount | Number | 是 | 12 | 商户订单金额,与提交订单时一致 | 10000 |
dealId | String | 是 | 32 | 收单系统交易号,该交易在收单系统对应的交易号 | 20000100 |
dealTime | String | 是 | 14 | 交易时间,交易失败时可能为空。收单系统对交易进行处理的时间,格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20170728120001 |
ext1 | String | 否 | 128 | 扩展字段1,与提交订单时一致 | 扩展字段1 |
ext2 | String | 否 | 128 | 扩展字段2,与提交订单时一致 | 扩展字段2 |
extInfo | Json | 可选 | 不定长 | 需单独申请配置,配置后返回该字段,目前包括:authTransId(微信支付宝端支付单号),authMerOrderId(微信支付宝端商家订单号),actualPayType(实际支付方式),deviceType(实际支付的设备类型);前两个字段当微信/支付宝支付时返回,后两个字段值可联合得到消费者最后选择的支付方式。(参考请求中payType和deviceType的定义)由于银联特殊规则,当支付方式为支付宝时,银联会在支付宝的原始支付单号前加两位数字,若接入方需要该字段进行逻辑处理,请依据银联规则裁剪长度。(若银联规则有变更,我司会在得到通知后告知新规则) | 2020-11-16 V4.5新增]样例为:{"deviceType":"1","authMerOrderId":"07012011163829365007287","actualPayType":"2","authTransId":"932020111622001466645715328950"}该字段以key:value形式返回,每个key之间,分隔;接入时需要支持该字段的扩展,以备后续该字段增加/减少key值。 注意:商户接收到的字段值为urlEncode之后的值(如:extInfo=%7B%22deviceType%22%3A%222%22%2C%22authMerOrderId%22%3A%2207212011253343123302602%22%2C%22actualPayType%22%3A%227%22%2C%22authTransId%22%3A%224200000744202011259445484075%22%7D),需要对=号后面的内容进行urlDecode,上文解码之后的内容为:{"deviceType":"2","authMerOrderId":"07212011253343123302602","actualPayType":"7","authTransId":"4200000744202011259445484075"} |
bankDealId | String | 否 | 128 | 银行交易号,后端通道系统的交易流水号。 需要按照海关179 号文报送的商户可以解析该字段存储,格式为1 位字母(标识银联/网联/其他)+流水号。其中U-银联,N-网联,D-直连,O-其他目前后端渠道在断直连背景下 A-支付宝直连,W-微信直连,基本均为U或者N |
如:U20181203215458215 表示交易渠道为银联,流水号为20181203215458215 |
partyOrderId | String | 可选 | 64 | 支付宝直连扫码、支付宝直连APP、微信直连扫码、微信直连APP四种场景下返回 | |
payResult | String | 是 | 2 | 处理结果: 10-支付成功 其他均为失败 |
10 |
errCode | String | 是 | 128 | 错误代码,详细请参考 | |
fundFreezeStat | String | 否 | 10 | 处理结果: FREEZE-资金冻结 UNFREEZE-资金解冻 |
|
signMsg | String | 是 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。对于所有值不为空的参数及对应值,按照字母顺序组成字符串 DSA:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 singMsg需要进行urldecode解码:veryfyResult = XMLSecurityProcess.veryfySignature(dataReceived, URLDecoder.decode(signMsg)); 注:若通过sdk接入,则无需自己处理,代码已封装 |
- 下述字段按首字母排列进行验签
- 仅对非空字段进行验签
bankDealId={bankDealId}&bankId={bankId}&dealId={dealId}&dealTime={dealTime}&errCode={errCode}&ext1={ext1}&ext2={ext2}&merchantAcctId={merchantAcctId}&orderAmount={orderAmount}&orderCurrency={orderCurrency}&orderId={orderId}&orderTime={orderTime}&payResult={payResult}&payType={payType}&terminalId={terminalId}&version={version}
PG返回示例
http://192.168.1.111:8081/QAMOCK-Test/notifyReceiverPg.do?dealTime=20170825155744&errCode=000000&merchantAcctId=1001215986501&orderTime=20170825155735&orderCurrency=CNY&dealId=2000003898&version=3.0&bankId=cmb&terminalId=0010003&payResult=10&ext1=ext1&ext2=ext2&orderAmount=600&signMsg=URgwbxHfL%2FE3YNiIBpP0vbL1UPtvbsqfAvGMpLFo5nIW2Bq786Mi0uLrvsIs8BHHw7B3f%2BRDEkdjE96nxfT4YcP4cYXkzk1SPAlAFwUy4JDgOQAOwYVgUG7%2FcHWx6Ef7uIMWZxyNxQ2SCC1WVBXsWPfnIRhzvGPDpgiqzK46cdA%3D&payType=10&orderId=20170825155741712
BG返回示例
BG以http Key-Value方式返回,如:
bankDealId=0181203215458215
dealTime=20170825155744
errCode=000000
merchantAcctId=1001215986501
orderTime=20170825155735
orderCurrency=CNY
dealId=2000003898
version=3.0
bankId=cmb
terminalId=0010003
payResult=10
ext1=ext1
ext2=ext2
orderAmount=600
signMsg=URgwbxHfL%2FE3YNiIBpP0vbL1UPtvbsqfAvGMpLFo5nIW2Bq786Mi0uLrvsIs8BHHw7B3f%2BRDEkdjE96nxfT4YcP4cYXkzk1SPAlAFwUy4JDgOQAOwYVgUG7%2FcHWx6Ef7uIMWZxyNxQ2SCC1WVBXsWPfnIRhzvGPDpgiqzK46cdA%3D
payType=10
orderId=20170825155741712
交易规则
1. 支付宝/微信支付
收单:交易金额transAmt(0,10000) 交易成功,transAmt[10000,50000) 交易失败
退款:退款金额transAmt(0,50)退款成功; transAmt[50,100)退款失败
微信直连退款:transAmt(2,50),退款成功; transAmt[50,100)退款失败
微信小程序:transAmt(0,100),交易成功; transAmt[100,)交易失败
支付宝扫码无需进行扫码,只需要获取我司支付结果即可2. 网银支付
网银测试时选择兴业银行(其余会跳转其他银行真实环境)3. 快捷支付
工商银行:卡号:6257080018600105 姓名:张三 (移动快捷可用)工商银行:卡号:6223150000123456789 姓名:张三
农业银行:卡号:6228220000123456789 姓名:张三
建设银行:卡号:5453242000123456789 姓名:张三
招商银行:卡号:6282900000123456789 姓名:张三
中国银行:卡号:5123160000123456789 姓名:张三
身份证号,手机号随意填写,格式正确即可
绑卡申请获取验证码:111111 支付申请获取验证码:111111
单笔交易查询接口
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
提交参数
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/singleTrxQuery.htm |
正式环境 | https://global.chinapnr.com/pay/singleTrxQuery.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 5 | 字符集,固定值:1 1-UTF-8 |
1 |
signType | String | 是 | 2 | 签名类型,固定值:4 4-RSA加签 |
4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
orderId | string | 必填 | 32 | 商户提交的原订单号 | 20170728120001299 |
dealId | String | 可选 | 32 | 收单系统交易号,该交易在收单系统对应的交易号 | 2000003882 |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
inputCharset={inputCharset}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&orderId={orderId}&dealId={dealId}
按照以上字段固定顺序加签-
只对非空值的字段进行加签-
返回结果
查询结果会接口同步返回。
返回参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,与提交订单时的保持一致 | 999999 |
version | String | 必选 | 10 | 网关版本,与提交订单时一致 | 3.0 |
payType | String | 必选 | 4 | 支付方式,与提交订单时一致 | 00 |
bankId | String | 必选 | 10 | 银行代码,与提交订单一致 | ABC |
orderId | String | 必选 | 32 | 商户订单号,与提交订单时一致 | 20170728120001299 |
orderTime | String | 必选 | 14 | 商户订单提交时间,与提交订单时一致 | 20171117020101 |
orderCurrency | String | 必选 | 3 | 订单币种,与提交订单时一致 | USD |
orderAmount | Number | 必选 | 12 | 商户订单金额,与提交订单时一致 | 10000 |
dealId | String | 必选 | 32 | 收单系统交易号,该交易在收单系统对应的交易号 | 20000100 |
dealTime | String | 必选 | 14 | 交易时间,交易失败时可能为空。收单系统对交易进行处理的时间,格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20170728120001 |
partyOrderId | String | 可选 | 64 | 支付宝直连扫码、支付宝直连APP、微信直连扫码、微信直连APP四种场景下返回 | 10 |
payResult | String | 必选 | 2 | 处理结果,10:支付成功 11:支付未成功 C0: 支付中 | 10 |
bankDealId | String | 可选 | 64 | 银行交易号,字符串,可为空 | |
errCode | String | 可选 | 8 | 错误代码,详细请参考错误代码附录 | 000000 |
ext1 | String | 可选 | 128 | 扩展字段1,与提交订单时一致 | 扩展字段1 |
ext2 | String | 可选 | 128 | 扩展字段2,与提交订单时一致 | 扩展字段2 |
extInfo | Json | 可选 | 不定长 | 与提交订单时一致,参考支付接口返回 | |
queryRespCode | String | 必选 | 2 | 查询结果,S查询成功、F查询失败 | S |
fundFreezeStat | String | 可选 | 2 | 处理结果 FREEZE-冻结 UNFREEZE-解冻 |
FREEZE |
queryRespMsg | String | 可选 | 512 | 查询返回描述:字符串,可为空 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 商户需对该字段进行验签。对于所有值不为空的参数及对应值,按照字母顺序组成字符串 DSA:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 注:若通过sdk接入,则无需自己处理,代码已封装 |
bankDealId={bankDealId}&bankId={bankId}&dealId={dealId}&dealTime={dealTime}&errCode={errCode}&ext1={ext1}&ext2={ext2}&extInfo={extInfo}&merchantAcctId={merchantAcctId}&orderAmount={orderAmount}&orderCurrency={orderCurrency}&orderId={orderId}&orderTime={orderTime}&partyOrderId={partyOrderId}&payResult={payResult}&payType={payType}&queryRespCode={queryRespCode}&queryRespMsg={queryRespMsg}&terminalId={terminalId}&version={version}
根据字母排序(如a**字段放在b**字段前面)验签。
请求示例
请参考具体Demo。下载地址
收单分账接口目录:
1.收单分账接口
注意:当前未分账交易,默认30天自动结算到商户主账户;自动分账结算时间可配置,如有需要,烦请联系销售同事更改
汇付国际商户分账产品介绍:文件下载
收单分账流程请参考支付流程中的序列图10:跳转支付流程
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
1.1收单分账申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/transDiv.htm |
正式环境 | https://global.chinapnr.com/ledger/transDiv.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
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 |
details | String | 必选 | 分账明细, 明细笔数最多99 | 见分账明细字段说明:例:10019671|10000|描述;10019671|10000| | |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
1.2 分账明细字段说明
各字段以|分隔,各行以;分隔
序号 | 字段名 | 格式 | 是否必输 | 说明 |
---|---|---|---|---|
1 | 用户号 | String(11) | 是 | 汇付唯一用户号 |
2 | 金额 | Number(15) | 是 | 格式为实际金额扩大100倍提交。如1000,表示10元 |
3 | 描述 | String(128) | 否 | 分账描述 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&requestId={requestId}&requestTime={requestTime}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
1.3同步返回参数
收单分账请求处理完成后,会同步返回如下数据,
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
requestId | 商户请求流水号 | 32 | 商户请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
dealId | 原交易收单系统交易号 | 32 | 原交易收单系统交易号, 与提交订单时一致 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
respCode | 错误代码 | 6 | 000000 成功,其它为异常 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
signMsg | 签名字段 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 商户需对该字段进行验签。详情请参考验签方法。对于所有值不为空的参数及对应值,按照指定顺序组成字符串:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 注:若通过sdk接入,则无需自己处理,代码已封装 |
details | 分账明细 | 存在错误明细时返回,格式见返回明细字段说明 |
dealId={dealId}&ext1={ext1}&ext2={ext2}&requestId={requestId}&requestTime={requestTime}&respCode={respCode}&respMsg={respMsg}
- 下述字段字母顺序进行验签
- 仅对非空字段进行验签
返回明细字段说明:各字段以|分隔,各行以半角“;”分隔
序号 | 字段名 | 格式 | 是否必输 | 说明 |
---|---|---|---|---|
1 | 用户号 | String(11) | 是 | 原样返回 |
2 | 金额 | number(15) | 是 | 原样返回 |
3 | 描述 | String(128) | 否 | 原样返回 |
4 | 失败原因 | String(128) | 否 | 当失败时返回失败原因描述 |
1.4应答码表
应答代码 | 错误描述 |
---|---|
000000 | 成功 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项长度不符 |
110003 | 请求的数据项格式错误 |
110005 | 请求的数据项不合法 |
120010 | 请求的商户不存在 |
120011 | 请求的商户状态异常 |
120014 | 该商户账户已被冻结,禁止交易 |
120103 | 该商户账户已被删除,禁止交易 |
120110 | 该商户账户已被止入,禁止交易 |
120111 | 请求的商户号状态异常,不允许交易 |
120014 | 产品功能未开通,不允许交易 |
120023 | 交易请求Ip未知,不允许交易 |
170001 | 请求流水号重复 |
170002 | 分账明细笔数超出限制 |
170003 | 原交易不允许分账 |
170004 | 原交易可分账余额不足 |
170006 | 原交易分账状态错误 |
170100 | 分账明细格式有误,详情见明细失败原因 |
200001 | 订单信息的签名内容不正确 |
400001 | 原交易不存在 |
400007 | 原交易状态错误 |
99999 | 系统错误 |
2.收单分账查询接口
- 请求与返回报文需要加签与验签
- 商户收到系统的数据后,需按照相同的规则生成签名字符串,并与系统返回的SIGNMSG字符串进行对比。
- 参数值为NULL或空,不拼接签名串
- 所有参与加密的参数KEY及其值的大小写敏感。
接口中标注密文传输字段需使用PNR公钥证书加密传输,防止敏感信息泄露。(加密字段明文参与加签,密文传输)
2.1收单分账查询申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/transDivQuery.htm |
正式环境 | https://global.chinapnr.com/ledger/transDivQuery.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | Number | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
requestId | String | 必选 | 32 | 请求流水号,只允许使用字母、数字、_,每个商户提交的流水号,必须在自身账户交易中唯一 | 20170728120001001 |
dealId | String | 非必选 | 32 | 原分账指令中的dealId | 原始被分账交易的支付流水号,若填写该字段值,则将以此字段作为唯一条件查询分账指令状态。 |
requestTime | String | 必选 | 14 | 请求时间, 数字串,一共14位。
格式:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位]
即: yyyyMMddHHmmss |
20170728120001 |
origRequestId | String | 必选 | 32 | 原分账指令的请求流水号 | 20170728120001001 |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&requestId={requestId}&requestTime={requestTime}&origRequestId={origRequestId}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
2.2同步返回参数
收单分账查询请求处理完成后,会同步返回如下数据:
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
requestId | 商户请求流水号 | 32 | 商户请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
origRequestId | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
respCode | 查询指令处理结果 | 6 | 000000 成功 999999 查询执行失败 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
divStatus | 分账状态 | 1 | respCode为000000时根据该字段判断原分账指令状态 N-原分账交易不存在 I-分账受理成功,表示分账指令已受理待执行 S-分账处理成功,表示分账指令已成功执行,交易已分账 F-分账处理失败,表示分账指令处理失败,正常情况下此错误码基本不会出现,若返回此错误码可联系我司进行确认 |
3.待分账查询接口
应用场景:
商户可以通过该接口查询对应订单的总可分账金额、已分账金额、剩余待分账金额。
名词解释:
总可分账金额:该笔交易的总计可分账金额,一般情况下为订单金额-手续费金额
已分账金额:该笔交易已经执行的分账指令累计的分账金额,包括分给用户和商户自身的金额。
剩余待分账金额:总可分账金额-已分账金额
3.1待分账查询申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/unsplitQuery.htm |
正式环境 | https://global.chinapnr.com/ledger/unsplitQuery.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | Number | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
requestId | String | 必选 | 32 | 请求流水号,只允许使用字母、数字、_,每个商户提交的流水号,必须在自身账户交易中唯一 | 20170728120001001 |
dealId | String | 必选 | 19 | 支付成功时返回的汇付支付交易唯一流水号 | 原始被分账交易的支付流水号,若填写该字段值,则将以此字段作为唯一条件查询分账指令状态。 |
requestTime | String | 必选 | 14 | 请求时间, 数字串,一共14位。
格式:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位]
即: yyyyMMddHHmmss |
20170728120001 |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&requestId={requestId}&requestTime={requestTime}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
3.2同步返回参数
收单分账查询请求处理完成后,会同步返回如下数据:
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
requestId | 商户请求流水号 | 32 | 商户请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
dealId | 支付成功时返回的汇付支付交易唯一流水号 | 32 | 原被分账交易的支付流水号,与提交订单时一致 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
respCode | 查询指令处理结果 | 6 | 000000 成功 999999 查询执行失败 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
currency | 币别 | 3 | 目前仅支持人民币,值为CNY |
totalDivAmount | 总可分账金额 | 32 | respCode为成功时返回,单位为分 |
dividedAmount | 已分账金额 | 32 | respCode为成功时返回,单位为分 |
unDivAmount | 剩余待分账金额 | 32 | respCode为成功时返回,单位为分 |
3.3应答码表
应答代码 | 错误描述 |
---|---|
000000 | 成功 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项[{0}]长度最大允许[{1}],实际[{2}] |
110003 | 请求的数据项[{0}]格式错误,合法格式请参照接入文档 |
110005 | 请求的数据项[{0}]不合法 |
111024 | 非法请求 |
120208 | 指定交易不存在或交易状态不正确 |
120209 | 指定交易非分账交易 |
200001 | 订单信息的签名内容不正确 |
999999 | 其他异常 |
4.收单分账回退接口
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
应用场景:
分账交易发生退款时,从用户账户扣除金额,返还给商户。分账回退时需指定原始分账请求流水号及分账接收方。允许对同一笔分账的同一个分账方进行多次回退,总金额不超过分账指令时分给该用户的金额。分账回退不影响原始交易的分账状态,即分账回退后,原交易仍为已分账,不能再次执行分账。
4.1分账回退申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/rollback.htm |
正式环境 | https://global.chinapnr.com/ledger/rollback.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
returnReqId | String | 必选 | 32 | 分账回退请求流水号,只允许使用字母、数字、_、-,每个商户提交的流水号,必须在自身商户号下唯一 | 20170728120001001 |
origReqId | String | 必选 | 32 | 原分账指令的请求流水号 | 原始分账指令的请求流水号 |
userId | String | 必选 | 11 | 需要回退的原分账接收方,即资金是从该用户返还 | 必须是原分账指令中存在的分账接收方用户号 |
amount | String | 必选 | 12 | CNY,单位为分 | 不能超过原始分给该用户的总金额。 |
requestTime | String | 必选 | 14 | 请求时间, 数字串,一共14位。
格式:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位]
即: yyyyMMddHHmmss |
20170728120001 |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&returnReqId={returnReqId}&origReqId={origReqId}&userId={userId}&requestTime={requestTime}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
4.2同步返回参数
收单分账回退请求处理完成后,会同步返回如下数据,
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
returnReqId | 商户分账回退请求流水号 | 32 | 商户分账回退请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
origReqId | 原分账指令的请求流水号 | 32 | 与提交订单时一致 |
userId | 需要回退的原分账接收方,即资金是从该用户返还 | 11 | 与提交订单时一致 |
amount | CNY,单位为分 | 11 | 与提交订单时一致 |
status | 回退结果 | 1 | P-处理中 S-成功 F-失败 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
respCode | 查询指令处理结果 | 6 | 000000-处理成功 999999-处理异常,处理中 其他请参阅应答码列表说明 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
4.3应答码表
应答代码 | 错误描述 |
---|---|
000000 | 成功 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项长度不符 |
110003 | 请求的数据项格式错误 |
110005 | 请求的数据项不合法 |
110010 | 频繁请求,请稍后重试 |
111024 | 非法请求 |
120014 | 产品功能未开通,不允许交易 |
170001 | 请求流水号重复 |
170008 | 指定交易不存在或交易状态不正确 |
170009 | 分账回退金额超出可回退金额 |
170010 | 用户号与原分账指令不一致 |
200001 | 订单信息的签名内容不正确 |
999999 | 系统错误 |
170300 | 风控拒绝 |
判断逻辑:
respCode=000000+status=S 回退成功
respCode=000000+status=F 回退失败
respCode=000000+status=P 回退处理中
respCode=170008 回退失败
respCode=170300 回退失败
respCode=999999 异常,再次查询
其它 检查后再次查询
5.分账回退申请查询
5.1分账回退查询申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/rollbackQuery.htm |
正式环境 | https://global.chinapnr.com/ledger/rollbackQuery.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | Number | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 0010001 |
queryReqId | String | 必选 | 32 | 查询请求流水号,只允许使用字母、数字、_、-,每个商户提交的流水号,必须在自身商户号下唯一 | 20211012155501032 |
returnReqId | String | 非必选 | 32 | 分账回退请求流水号 | 20170728120001001 |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&queryReqId={queryReqId}&returnReqId={returnReqId}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
5.2同步返回参数
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
queryReqId | 查询请求流水号 | 32 | 查询请求流水号,与请求一致 |
returnReqId | 分账回退请求流水号 | 32 | 分账回退请求流水号,与请求一致 |
origReqId | 原分账指令的请求流水号 | 32 | respCode为000000时返回,对应分账回退交易的信息 |
userId | 需要回退的原分账接收方,即资金是从该用户返还 | 11 | respCode为000000时返回,对应分账回退交易的信息 |
amount | CNY,单位为分 | 12 | respCode为000000时返回,对应分账回退交易的信息 |
status | 回退结果 | 1 | P-处理中 S-成功 F-失败 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
respCode | 查询指令处理结果 | 6 | 000000 成功 999999-处理异常 其他请参阅应答码列表说明 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
5.3应答码表
应答代码 | 错误描述 |
---|---|
000000 | 成功 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项长度不符 |
110003 | 请求的数据项格式错误 |
110005 | 请求的数据项不合法 |
110010 | 频繁请求,请稍后重试 |
111024 | 非法请求 |
120014 | 产品功能未开通,不允许交易 |
170001 | 请求流水号重复 |
170008 | 指定交易不存在或交易状态不正确 |
200001 | 订单信息的签名内容不正确 |
999999 | 系统错误 |
判断逻辑:
respCode=000000+status=S 回退成功
respCode=000000+status=F 回退失败
respCode=000000+status=P 回退处理中
respCode=170008 回退失败
respCode=999999 异常,再次查询
其它 检查后再次查询
6.收单分账完结接口
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
应用场景:
支付交易发生时标记需要分账,但由于商户自身需求,不再需要对该笔交易进行分账操作时,提供分账完结接口。商户调用分账完结接口对待分账交易进行完结分账,资金结算至商户账户。
6.1分账完结申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/close.htm |
正式环境 | https://global.chinapnr.com/ledger/close.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 0010001 |
requestId | String | 必选 | 32 | 分账完结请求流水号,只允许使用字母、数字、_、-,每个商户提交的流水号,必须在自身商户号下唯一 | 20170728120001001 |
dealId | String | 必选 | 32 | 目标交易号,对应需要执行分账完结的原支付交易的汇付交易号,可在支付流程的返回中获取。 | 2013772751 |
requestTime | String | 必选 | 14 | 请求时间, 数字串,一共14位。
格式:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位]
即: yyyyMMddHHmmss |
20170728120001 |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&requestId={requestId}&requestTime={requestTime}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
6.2同步返回参数
收单分账完结请求处理完成后,会同步返回如下数据,
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
requestId | 分账完结请求流水号 | 32 | 商户分账完结请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
dealId | 目标交易号,对应需要执行分账完结的原支付交易的汇付交易号,可在支付流程的返回中获取。 | 32 | 与提交订单时一致 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
status | 完结结果 | 1 | P-处理中 S-成功 F-失败 |
respCode | 查询指令处理结果 | 6 | 000000-处理成功 999999-处理异常,处理中 其他请参阅应答码列表说明 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
6.3应答码表
应答代码 | 错误描述 |
---|---|
000000 | 成功 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项长度不符 |
110003 | 请求的数据项格式错误 |
110005 | 请求的数据项不合法 |
110010 | 频繁请求,请稍后重试 |
111024 | 非法请求 |
120011 | 请求的商户号状态异常,不允许交易 |
120014 | 产品功能未开通,不允许交易 |
120030 | 请求的商户号[{0}]/终端号[{1}]对应的结算信息未开通,不允许交易 |
120073 | 商户结算账户类型有误 |
120074 | 商户结算账户未开通 |
170001 | 请求流水号重复 |
170008 | 指定交易不存在或交易状态不正确 |
170006 | 原交易分账状态错误 |
170011 | 交易暂不支持此操作 |
170030 | 风控拒绝 |
200001 | 订单信息的签名内容不正确 |
999999 | 系统错误 |
判断逻辑:
respCode=000000+status=S 完结成功
respCode=000000+status=F 完结失败
respCode=000000+status=P 完结处理中
respCode=170008 完结失败
respCode=170300 完结失败
respCode=999999 异常,需要查询
其它 检查后再次查询
7.分账完结查询
7.1分账完结查询申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/closeQuery.htm |
正式环境 | https://global.chinapnr.com/ledger/closeQuery.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | Number | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 0010001 |
queryReqId | String | 必选 | 32 | 查询请求流水号,只允许使用字母、数字、_、-,每个商户提交的流水号,必须在自身商户号下唯一 | 20211012155501032 |
origReqId | String | 非必选 | 32 | 分账完结指令的请求流水号 | 20170728120001001 |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&queryReqId={queryReqId}&origReqId={origReqId}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
7.2同步返回参数
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
queryReqId | 查询请求流水号 | 32 | 查询请求流水号,与请求一致 |
origReId | 分账完结请求流水号 | 32 | 分账完结请求流水号,与请求一致 |
status | 完结结果 | 1 | P-处理中 S-成功 F-失败 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
respCode | 查询指令处理结果 | 6 | 000000 成功 999999-处理异常 其他请参阅应答码列表说明 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
7.3应答码表
应答代码 | 错误描述 |
---|---|
000000 | 成功 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项长度不符 |
110003 | 请求的数据项格式错误 |
110005 | 请求的数据项不合法 |
111024 | 非法请求 |
120014 | 产品功能未开通,不允许交易 |
170008 | 指定交易不存在或交易状态不正确 |
200001 | 订单信息的签名内容不正确 |
999999 | 系统错误 |
判断逻辑:
respCode=000000+status=S 完结成功
respCode=000000+status=F 完结失败
respCode=000000+status=P 完结处理中
其它 检查后再次查询
8.1多次分账申请
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/ledger/transMultiDiv.htm |
正式环境 | https://global.chinapnr.com/ledger/transMultiDiv.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
version | String | 是 | 10 | 网关版本,固定值:1.0 | 1.0 |
signType | String | 是 | 1 | 签名类型,固定值:4-RSA加签 | 4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
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 |
details | String | 必选 | 分账明细, 明细笔数最多99 | 见分账明细字段说明:例:10019671|10000|描述;10019671|10000| | |
ext1 | String | 可选 | 128 | 扩展字段1, 预留 | |
ext2 | String | 可选 | 128 | 扩展字段2, 预留 | |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
1.2 分账明细字段说明
各字段以|分隔,各行以;分隔
序号 | 字段名 | 格式 | 是否必输 | 说明 |
---|---|---|---|---|
1 | 用户号 | String(11) | 是 | 汇付唯一用户号,如需分账到商户主账户,请填入固定值99,分账给商户主账户的明细不支持回退,分给用户的可以回退。 |
2 | 金额 | Number(15) | 是 | 格式为实际金额扩大100倍提交。如1000,表示10元 |
3 | 描述 | String(128) | 否 | 分账描述 |
version={version}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&requestId={requestId}&requestTime={requestTime}
- 按以上固定字段顺序进行加签。
- 仅对非空字段进行加签。
- 加密字段明文加签。
1.3同步返回参数
收单分账请求处理完成后,会同步返回如下数据,
参数名称 | 参数含义 | 长度 | 参数说明 |
---|---|---|---|
requestId | 商户请求流水号 | 32 | 商户请求流水号,与提交订单时一致 |
requestTime | 请求时间 | 14 | 商户提交的请求时间, 与提交订单时一致 |
dealId | 原交易收单系统交易号 | 32 | 原交易收单系统交易号, 与提交订单时一致 |
ext1 | 扩展字段1 | 128 | 扩展字段1, 与提交订单时一致 |
ext2 | 扩展字段2 | 128 | 扩展字段2, 与提交订单时一致 |
respCode | 错误代码 | 6 | 000000 成功,其它为异常 |
respMsg | 错误描述 | 512 | 错误代码不为000000时提供 |
signMsg | 签名字段 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 商户需对该字段进行验签。详情请参考验签方法。对于所有值不为空的参数及对应值,按照指定顺序组成字符串:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 注:若通过sdk接入,则无需自己处理,代码已封装 |
details | 分账明细 | 存在错误明细时返回,格式见返回明细字段说明 |
dealId={dealId}&ext1={ext1}&ext2={ext2}&requestId={requestId}&requestTime={requestTime}&respCode={respCode}&respMsg={respMsg}
- 下述字段字母顺序进行验签
- 仅对非空字段进行验签
返回明细字段说明:各字段以|分隔,各行以半角“;”分隔
序号 | 字段名 | 格式 | 是否必输 | 说明 |
---|---|---|---|---|
1 | 用户号 | String(11) | 是 | 原样返回 |
2 | 金额 | number(15) | 是 | 原样返回 |
3 | 描述 | String(128) | 否 | 原样返回 |
4 | 失败原因 | String(128) | 否 | 当失败时返回失败原因描述 |
1.4应答码表
应答代码 | 错误描述 |
---|---|
000000 | 成功 |
110001 | 必须提交的请求参数未提交 |
110002 | 请求的数据项长度不符 |
110003 | 请求的数据项格式错误 |
110005 | 请求的数据项不合法 |
120010 | 请求的商户不存在 |
120011 | 请求的商户状态异常 |
120014 | 该商户账户已被冻结,禁止交易 |
120103 | 该商户账户已被删除,禁止交易 |
120110 | 该商户账户已被止入,禁止交易 |
120111 | 请求的商户号状态异常,不允许交易 |
120014 | 产品功能未开通,不允许交易 |
120023 | 交易请求Ip未知,不允许交易 |
170001 | 请求流水号重复 |
170002 | 分账明细笔数超出限制 |
170003 | 原交易不允许分账 |
170004 | 原交易可分账余额不足 |
170006 | 原交易分账状态错误 |
170100 | 分账明细格式有误,详情见明细失败原因 |
200001 | 订单信息的签名内容不正确 |
400001 | 原交易不存在 |
400007 | 原交易状态错误 |
99999 | 系统错误 |
交易退款接口
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
提交参数
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/refundreceive.htm |
正式环境 | https://global.chinapnr.com/pay/refundreceive.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
bgUrl | String | 是 | 256 | 服务器接受支付结果的后台地址 | https://www.merchant.com/pay/notifyReceiverBg.do |
version | String | 是 | 10 | 网关版本,固定值:3.0 3.0-交易退款 |
3.0 |
language | String | 是 | 2 | 网关页面显示语言种类,固定值:1 1-中文显示 |
1 |
signType | String | 是 | 2 | 签名类型,固定值:4 4-RSA加签 |
4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
refundOrderId | string | 必选 | 32 | 商户退款交易订单号,只允许使用字母、数字、_,并以_,字母或数字开头每商户提交的订单号,必须在自身账户交易中唯一 | 20170728120001299 |
originalOrderId | String | 必选 | 32 | 原交易订单号,只允许使用字母、数字、_,并以_,字母或数字开头每商户提交的订单号,必须在自身账户交易中唯一 同笔订单30秒内无法发起多次退款,会触发频繁请求报错 | 20170728120001299 |
refundCurrency | String | 必选 | 3 | 退货币种,字符串,3位币别码,详情请参照币别代码附录进行参考 | CNY |
refundAmount | Number | 必选 | 12 | 退货金额,整型数字,单位为分。日韩元支持的最小单位为元。 | 如100元,则填写10000 |
refundDesc | String | 可选 | 256 | 退货说明,字符串,不签名 | 无理由退款 |
refundMode | String | 可选 | 1 | 退货模式 | 1.传1表示特殊退款,仅针对待分账交易时支持,此时退款从待分账余额进行轧差,并影响该待分账交易的分账、完结、到期自动结算 2.不传或传0表示普通退款,此时退款从商户余额轧差退款 |
ext1 | String | 可选 | 128 | 扩展字段1,英文或中文字符串支付完成后,按照原样返回给商户 | 扩展字段1 |
ext2 | String | 可选 | 128 | 扩展字段2,英文或中文字符串支付完成后,按照原样返回给商户 | 扩展字段2 |
signMsg | String | 必选 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
inputCharset={inputCharset}&bgUrl={bgUrl}&version={version}&language={language}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&refundOrderId={refundOrderId}&originalOrderId={originalOrderId}&refundCurrency={refundCurrency}&refundAmount={refundAmount}&ext1={ext1}&ext2={ext2}
只对非空值的字段进行加签。
返回结果
退款结果会通知提交时bgUrl对应的地址。
返回参数(同步通知,异步通知返回皆为以下参数)
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,与提交订单时的保持一致 | 999999 |
refundOrderId | String | 必选 | 32 | 商户订单号,与提交订单时一致 | 20170728120001299 |
originalOrderId | String | 必选 | 32 | 原交易订单号 | 20170728120001299 |
dealId | String | 可选 | 32 | 收单系统交易号,该交易在收单系统对应的交易号 | 20000100 |
dealTime | String | 可选 | 14 | 交易时间,交易失败时可能为空。收单系统对交易进行处理的时间,格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位]。bg返回,pg无返回 | 20170728120001 |
refundCurrency | String | 必选 | 3 | 退货币种,详细请参考币别代码附录 | CNY |
refundAmount | Number | 必选 | 12 | 退货金额,整型数字,以分为单位。比方10元,提交时金额应为1000,商户页面显示金额可以转换成以元为单位显示 | 10000 |
refundBalance | Number | 可选 | 12 | 可退金额,整型数字,以分为单位。比方10元,提交时金额应为1000,商户页面显示金额可以转换成以元为单位显示 | 1000 |
ext1 | String | 可选 | 128 | 扩展字段1,与提交订单时一致 | 扩展字段1 |
ext2 | String | 可选 | 128 | 扩展字段2,与提交订单时一致 | 扩展字段2 |
refundResult | String | 必选 | 2 | 同步返回:C0-退款申请成功,退款结果以异步 通知为准。10-退款成功,其余均为失败 异步返回:10-退款成功,其余均为失败 |
10 |
errCode | String | 必选 | 8 | 错误代码,详细请参考错误代码附录 | 000000 |
errMsg | String | 可选 | 256 | 错误描述,失败时返回的错误信息,可以为空。 | 原交易可退金额不足 |
signMsg | String | 必选 | 2048 | 签名字符串,商户需对该字段进行验签,对于所有值不为空的参数及对应值,按照字母顺序组成字符串
DSA:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。
注:若通过sdk接入,则无需自己处理,代码已封装 |
dealId={dealId}&dealTime={dealTime}&errCode={errCode}&ext1={ext1}&ext2={ext2}&merchantAcctId={merchantAcctId}&originalOrderId={originalOrderId }&refundAmount={refundAmount}&refundBalance={refundBalance}&refundCurrency={refundCurrency}&refundOrderId={refundOrderId}&refundResult={refundResult}&terminalId={terminalId}
根据字母排序(如a**字段放在b**字段前面)验签。
BG返回示例
BG以http Key-Value方式返回,如:
dealTime=20170822034757
terminalId=0010003
refundAmount=1000
ext1=ext1
refundResult=10
ext2=ext2
signMsg=nUjiQh3vWHIRjFYjBTspc4NADb1QLo0jHhDghw2N4wNhab91DHwIZDkhs%2BW8n3%2FMFLEqJd1chgRXL7pVF%2FlqtDVIgxnqGvtH3bqxZe%2BlaBvvWaJDkUZcvJO14lEpzJQmdlFnaGMbtbFalfZFea9SKucgRQm8XJvz%2FtlDitcTXLM%3D
originalOrderId=2017082115280239
merchantAcctId=1001215986501
refundBalance=0
dealId=2000003884
refundOrderId=20170822114749925
refundCurrency=CNY
日终交易查询接口
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
提交参数
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/dailyTxnConfirm.htm |
正式环境 | https://global.chinapnr.com/pay/dailyTxnConfirm.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
signType | String | 是 | 256 | 签名类型,固定值:4 4-RSA加签 |
4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
trxDate | String | 必选 | 32 | 交易日,数字串,一共8位格式为:年[4位]月[2位]日[2位] | 20071117 |
signMsg | String | 必选 | 2048 | 签名字符串,可参考签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
inputCharset={inputCharset}&signType={signType}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&trxDate ={trxDate}
只对非空值的字段进行加签。
返回结果
查询结果接口会同步返回。
返回参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,与提交订单时的保持一致 | 999999 |
trxDate | String | 必选 | 32 | 交易日,数字串,一共8位格式为:年[4位]月[2位]日[2位] | 20071117 |
token | String | 可选 | 32 | 唯一关联号,由我司提供 | |
expTime | Number | 可选 | 14 | 下载请求的过期时间,数字串,一共14位格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20071117020101 |
errCode | String | 可选 | 8 | 错误代码,详细请参考错误代码附录 | 查询成功,无错误码返回 |
errorMsg | String | 可选 | 128 | 错误描述,错误描述,不参与签名 | 结算文件未找到 |
signMsg | String | 必选 | 2048 | 签名字符串,商户需对该字段进行验签,对于所有值不为空的参数及对应值,按照字母顺序组成字符串
DSA:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。
注:若通过sdk接入,则无需自己处理,代码已封装 |
errCode={errCode}&expTime={expTime}&merchantAcctId={merchantAcctId}&terminalId={terminalId}&token={token}&trxDate={trxDate}
根据字母排序(如a**字段放在b**字段前面)验签。
日终交易文件下载请求
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/dailyFileDownload.htm |
正式环境 | https://global.chinapnr.com/pay/dailyFileDownload.htm |
请求参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
terminalId | String | 必选 | 8 | 终端号,与提交订单时的保持一致 | 999999 |
token | String | 必选 | 32 | 唯一关联号,由我司提供 |
日终交易文件下载返回
对账文件首行为汇总行,其他行为明细行,各行数据以“|”分隔。
首行
商户号|终端|结算币别|对账日期|总消费笔数|总消费金额|总消费手续费金额|总退款笔数|总退款金额|总退款手续费|预留字段
明细行
交易类型|交易号|商户订单号|商户订单时间|交易确认时间|订单币别|订单金额|结算币别|结算金额|手续费金额|支付方式|银行代码
首行参数
参数 | 是否必填 | 描述 | 示例值 |
---|---|---|---|
商户号 | 必选 | 由我司提供 | 1001234001101 |
终端 | 必选 | 由我司提供 | 999999 |
结算币别 | 必选 | 币别代码,详细请参考币别代码附录 | CNY |
对账日期 | 必选 | 年月日,例如:20160101 | 20160101 |
总消费笔数 | 必选 | 明细中的交易笔数 | 100 |
总消费金额 | 必选 | 目标金额汇总,单位为元,精确到小数点后两位 | 10.00 |
总消费手续费金额 | 必选 | 交易的手续费汇总,单位为元,精确到小数点后两位 | 10.00 |
总退款笔数 | 必选 | 明细中的退款笔数 | 2 |
总退款金额 | 必选 | 退款金额,单位为元,精确到小数点后两位 | 10.00 |
总退款手续费 | 必选 | 退款返回的手续费,单位为元,精确到小数点后两位 | 10.00 |
预留字段 | 可选 | 总退款扣费,如后续退款收手续费则汇总到这个字段 |
明细行参数
参数 | 是否必填 | 描述 | 示例值 |
---|---|---|---|
交易类型 | 必选 | sales/refund | |
交易号 | 必选 | 我方消费交易号或退款交易号 | 2000003884 |
商户订单号 | 必选 | 商户消费交易订单号或退款交易申请号 | 20170822114749925 |
商户订单时间 | 必选 | 商户提交时间 | 2017082210220712 |
交易确认时间 | 必选 | 系统交易状态确认成功的时间 | 2017082210220712 |
订单币别 | 必选 | 订单币别,详细请参考币别代码附录 | CNY |
订单金额 | 必选 | 订单金额,单位为元,精确到小数点后两位 | 10.00 |
结算币别 | 必选 | 结算币别,详细请参考币别代码附录 | CNY |
结算金额 | 必选 | 结算金额,单位为元,精确到小数点后两位 | 10.00 |
手续费 | 必选 | 消费手续费金额,币别同结算币别。单位为元,精确到小数点后两位 | 10.00 |
关单接口
当前关单接口,支付宝扫码需注意:支付宝扫码支付必须通过支付宝app扫码后方可发起关单申请。
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
提交参数
请求地址
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/unifiedclose.htm |
正式环境 | https://global.chinapnr.com/pay/unifiedclose.htm |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 必选 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
bgUrl | String | 否 | 256 | 服务器接受关单结果的后台地址商户不传不会通知 | https://www.merchant.com/pay/notifyReceiverBg.do |
orderId | string | 必选 | 32 | 原交易订单号 | 20170728120001299 |
signMsg | String | 必选 | 2048 | 签名字符串,签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
- 按以下固定字段顺序进行加签
- 只对非空值的字段进行加签。
bgUrl={bgUrl}&merchantAcctId={merchantAcctId}&orderId={orderId}
同步返回结果
关单请求处理完成后,会返回如下数据
返回参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
respCode | String | 是 | 6 | 错误代码 | 000000 关单成功 120088 关单失败:订单已关闭 000002 受理成功,当且仅当通道30秒内未给明确结果时返回,商户可以尝试再次关单或接受异步通知进行处理。 其它则为处理失败 |
respMsg | String | 否 | 512 | 错误描述 | 失败错误描述 |
异步返回结果
当且仅当通道30秒内同步未返回明确结果,汇付在收到通道关单处理完成之后,会给商户返回如下数据:
返回参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 是 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
orderId | String | 是 | 32 | 商户订单号,与提交订单时一致 | 20170728120001299 |
closeResult | String | 是 | 2 | 处理结果:10-关单成功其他均为失败 | 10 |
errCode | String | 是 | 8 | 120088:订单已关闭 | 120088 |
signMsg | String | 是 | 2048 | 签名字符串,商户需对该字段进行验签。详情请参考验签方法。对于所有值不为空的参数及对应值,按照字母顺序组成字符串:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 注:若通过sdk接入,则无需自己处理,代码已封装 |
- 按以下字段字母顺序进行验签
- 只对非空值的字段进行验签。
closeResult={closeResult}&errCode={errCode}&merchantAcctId={merchantAcctId}&orderId={orderId}
转账支付接口目录:
1.转账支付-网关
转账支付-网关流程请参考支付流程中的序列图:时序图8
正式环境发送异步通知只支持443或80端口 其他端口暂时不支持
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
提交参数
1.1预下单
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/unifiedorder.htm |
正式环境 | https://global.chinapnr.com/pay/unifiedorder.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
pageUrl | String | 是 | 256 | 接收入账标识结果的页面地址网关模式转账支付时, 会带结果跳转商户页面,需商户根据交易结果展示对应页面(获取入账标识后展示打款银行账号、打款银行名称等信息) | https://www.merchant.com/pay/notifyReceiverPg.do |
bgUrl | String | 是 | 256 | 服务器接受支付结果的后台地址 | https://www.merchant.com/pay/notifyReceiverBg.do |
version | String | 是 | 10 | 网关版本,固定值:3.0 | 3.0 |
language | String | 是 | 3 | 网关页面显示语言种类,固定值:1 1-中文显示 |
1 |
signType | String | 是 | 256 | 签名类型,固定值:4 4-RSA加签 |
4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 是 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 是 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
payerName | String | 条件必选 | 96 | 支付人姓名,中文名,网银直连时必填 | 张三 |
payerContactType | String | 否 | 1 | 支付人联系方式类型,固定值:1或者2 1-代表电子邮件方式 2-其他联系方式 |
1 |
payerContact | String | 条件必选 | 64 | 支付人联系方式,根据payerContactType的方式填写对应字符,邮箱或者其他联系方式,转账支付必填,填写支付人邮箱地址 | 13400000000 |
payerIdentityCard | String | 条件必选 | 32 | 支付人身份证号码,字符串,18位身份证号,如果身份证号包含X,请保持字母为大写;跨境结算且为直连模式时必填 | 320125198800001000 |
mobileNumber | String | 否 | 32 | 支付人手机号 | 15800001111 |
cardNumber | string | 条件必选 | 32 | 支付人所持卡号。 | 6225881257400000 |
customerId | string | 条件必填 | 32 | 支付人在商户系统的客户编号。快捷支付时必填,方便用户二次支付; | jd1001 |
customerIp | string | 条件必填 | 32 | 直连微信APP支付必填; 服务商公众号支付必填; 支付宝支付方式建议填写; 不支持v6ip; |
客户ip;示例:127.0.0.1 |
orderId | string | 是 | 32 | 商户订单号,只允许使用字母、数字、_,每商户提交的订单号,必须在自身账户交易中唯一 | 20170728120001299 |
inquireTrxNo | string | 否 | 32 | 查询流水号 商户从CHINAPNR外汇询价时需填入PNR返回的工单号,用于锁定汇率,不填则根据交易时间实时询价 |
交易前已在CHINAPNR询价返回工单号:2089,则填入2089 |
orderCurrency | String | 是 | 3 | 订单币种,3位币别码,详情请参照币别代码附录。当该字段不为CNY时,必须与settlementCurrency一致。 默认请填写CNY,如需其他币别,请联系我司确认 |
如人民币:CNY |
settlementCurrency | String | 是 | 3 | 结算币种,3位币别码,详情请参照币别代码附录。 默认请填写CNY,如需其他币别,请联系我司确认 |
如人民币:CNY |
orderAmount | Number | 是 | 12 | 商户订单金额,整型数字,单位为分。日韩元支持的最小单位为元。 | 如100元,则填写10000 |
orderTime | String | 是 | 14 | 商户订单提交时间,一共14位格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20071117020101 |
productName | String | 是 | 256 | 商品名称 | 订单对应的商品信息,该内容可能会显示给支付人,请尽可能简短完整。 |
productNum | Number | 是 | 8 | 商品数量,整型数字 | 例: 单个商品数量:1 多个商品数量:商品总数量 |
productId | String | 是 | 32 | 商品代码,请根据我司提供的商品代码附录进行填写。 | 如服饰箱包,填写:100200(如多个商品填写最主要的商品代码) |
productDesc | String | 否 | 256 |
填写规则: 商品编号|商品名称|商品数量|商品单价(单位元)|商品链接;商品编号|商品名称|商品数量|商品单价(单位元)|商品链接 填写说明: 1、同一商品用半角竖线分隔,不同商品间用半角分号分隔 2、商品编号,商家该款商品的唯一编码 3、其中,商品编号、商品名称、商品数量、商品单价必填,商品链接非必填(参数非必填,栏位|必要填写) |
填写示例: 200R32P|爱他美1段|2|250|http://baidu.com;200R32M|爱他美2段|1|130| |
ext1 | String | 否 | 128 | 扩展字段1,英文或中文字符串支付完成后,按照原样返回给商户 | 当deviceType=2且payType=1(微信H5)时,该字段值为JSON格式,内容参考如下:
{ "deviceInfo":"1", "appInfoId":"xxxxxxx", "appName":"xxxxxxx" } 字段解释: deviceInfo: 1:苹果APP 2:安卓APP 3:IOS手机网站 4:ANDROID手机网站 appInfoId: 苹果APP:IOS应用唯一标识 安卓APP:APP包名 WAP:网站首页URL,须保证公网能正常访问到 appName: APP:app的名字 WAP:网站名字 |
ext2 | String | 否 | 128 | 扩展字段2,英文或中文字符串支付完成后,按照原样返回给商户 | 扩展字段2 |
openId | String | 条件必填 | 128 | deviceType=2,payType=7或8时必填,关注微信公众号的用户分配的id,可参考微信官方文档指引 | 如: op5EP1G8XtyYH1VvmAbleB3AYgc8 |
deviceType | String | 是 | 1 | 1:pc端支付2:移动端支付 | 1 |
payType | String | 是 | 4 | 当deviceType=1时 G:转账支付(PC网关) 当deviceType=2时 G:转账支付(移动端网关) |
|
bankId | String | 否 | 8 | 银行代码,请参考银行代码表附录。网银直连时必填;即deviceType=1且payType为4时 | 如中国农业银行,ABC |
redoFlag | String | 否 | 1 | 1表示同一订单禁止重复提交标志,预留字段;订单失败后才可以重新提交 | |
divFlag | String | 否 | 1 | 指定交易需要分账时上送 | 1表示分账,不上送或上送0表示不分账;分账需要联系我司运营进行开通配置 |
riskInfo | JSON | 条件必填 | 1024 | 详细描述参见附录riskInfo,留学、航空、酒店类需按要求上送。 | |
asyncUrl | String | 条件必填 | 256 | 转账支付-网关模式(PC/移动端)必填,用以接受1.3中的网关中转异步下单结果 | |
signMsg | String | 是 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
- 按以下固定字段顺序进行加签
- 仅对非空字段进行加签
pageUrl={pageUrl}&bgUrl={bgUrl}&merchantAcctId={merchantAcctId}&terminalId={terminalId}& customerId={customerId}&orderId={orderId}&orderAmount={orderAmount}&orderTime={orderTime}&productDesc={productDesc}&ext1={ext1}&ext2={ext2}& deviceType={deviceType}&payType={payType}&shortCardno={shortCardno}
返回结果
交易结果会同时通知提交时pageUrl和bgUrl对应的地址。
1.2预下单返回
预下单请求处理完成后,会返回如下数据,:
参数名称 | 参数含义 | 最大长度 | 参数说明 |
---|---|---|---|
url | 返回地址 | 1024 | 需转义 type=1:商户需将url转换成二维码展示 type=2:商户需将用户的浏览器跳转至该url type=3:此字段为空 type=4:此字段为空 |
queryUrl | 扫码结果轮训地址 | 1024 | 备用字段 |
type | 返回类型 | 1 | 1:url是二维码 2:url跳转地址: (1)聚合网关(deviceType=1,payType=6或6-123等;deviceType=2,payType=5或5-123等)及微信服务商公众号支付返回url; (2)转账支付-PC/移动网关模式返回url,商户需跳转至该url以进行后续操作;此场景下,商户需先关注2.3的结果,若2.3返回成功,则可通过2.4接收交易结果(也可通过交易查询来查询交易结果);若2.3返回失败,则交易失败,不再有2.4的异步结果 3:其他(payInfo): (1)微信支付(公众号、小程序)、微信直连APP/支付宝直连APP支付为payInfo; (2)转账支付-API模式为payInfo 4:APP转小程序的特殊返回 |
respCode | 错误代码 | 6 | 000000 成功,其它为异常 |
respMsg | 错误描述 | 512 | 失败错误描述 |
payInfo | 支付信息 | 64 | 当type为3、4时返回回。 type=3时: 如果是支付宝APP直连支付、微信APP直连支付、微信APP支付、微信公众号支付、微信小程序支付,则为微信生成的预支付回话标识,用于后续接口调用中使用 如果是转账支付API形式,则为支付人转账所需的收款银行账户信息,格式如下: { “referenceId”:”付款参考号,支付人转账时填写”; “”benificiaryName:”汇付收款银行账户户名”; “benificiaryBank”:”汇付的收款账户所属银行”; “bankAddr”:”汇付收款银行地址”; “benificiaryAcct”:”汇付收款账号”; “cinapsNo”:”联行号”; } Type=4时: PP转小程序调用返回值, {“username”:”小程序原始ID”,”path”:”/app2minip/payment?seqId=xxxxxx”} |
1.3网关中转下单结果返回
当支付方式为转账支付-网关(PC/移动端),即deviceType=1且payType=F,deviceType=2且payType=F两种支付方式时返回,接入时请按照实际需要进行获取(字段可能后续会有增加),不要限制必须是如下字段。
参数 | 类型 | 最大长度 | 参数含义 | 参数说明 |
---|---|---|---|---|
merchantAcctId | String | 32 | 会员账号,与提交订单时的保持一致 | 同请求,原样返回 |
terminalId | String | 8 | 终端号,与提交订单时的保持一致 | 同请求,原样返回 |
version | String | 10 | 网关版本,与提交订单时一致 | 同请求,原样返回 |
orderId | String | 32 | 商户订单号,与提交订单时一致 | 同请求,原样返回 |
orderTime | String | 14 | 订单时间yyyyMMddHHmmss | 同请求,原样返回 |
orderCurrency | String | 3 | 订单币种,与提交订单时一致 | 同请求,原样返回 |
orderAmount | Number | 12 | 订单金额扩大100倍 | 同请求,原样返回 |
dealId | String | 32 | 处理交易编号 | PNR的交易唯一标识 |
dealTime | String | 14 | 处理交易时间yyyyMMddHHmmss | PNR收到交易请求的时间 |
ext1 | String | 128 | 扩展字段1 | 同请求,原样返回 |
ext2 | String | 128 | 扩展字段2 | 同请求,原样返回 |
respCode | String | 6 | 错误代码 | 000000 成功,成功时可根据type进行下一步处理,目前仅为payInfo类型;其它返回码为异常 |
respMsg | String | 512 | 错误描述 | 失败错误描述 |
type | String | 1 | 返回类型 | 3:其他(payInfo) |
payInfo | String | 64 | 支付信息 | 目前支持转账支付-网关模式,格式如下: { “referenceId”:”付款参考号,支付人转账时填写”; “”benificiaryName:”汇付收款银行账户户名”; “benificiaryBank”:”汇付的收款账户所属银行”; “bankAddr”:”汇付收款银行地址”; “benificiaryAcct”:”汇付收款账号”; “cinapsNo”:”联行号”; } |
signMsg | String | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成merchantAcctId,terminalId,version,orderId,orderTime,orderCurrency,orderAmount,dealId,dealTime,respCode,payInfo,按字母顺序先排序后加签 注:若通过sdk接入,则无需自己处理,代码已封装 |
1.4返回商户支付结果
在用户支付完成之后,会给商户返回如下数据:
商户在接受到Chinapnr异步通知后,应返回成功接受内容,如"SUCCESS"。
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 是 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
terminalId | String | 是 | 8 | 终端号,与提交订单时的保持一致 | 999999 |
version | String | 是 | 10 | 网关版本,与提交订单时一致 | 3.0 |
payType | String | 是 | 4 | 支付方式,与提交订单时一致 | 00 |
bankId | String | 是 | 8 | 银行代码,与提交订单一致 | BOC |
orderId | String | 是 | 32 | 商户订单号,与提交订单时一致 | 20170728120001299 |
orderTime | String | 是 | 14 | 商户订单提交时间,与提交订单时一致 | 20171117020101 |
orderCurrency | String | 是 | 3 | 订单币种,与提交订单时一致 | USD |
orderAmount | Number | 是 | 12 | 商户订单金额,与提交订单时一致 | 10000 |
dealId | String | 是 | 32 | 收单系统交易号,该交易在收单系统对应的交易号 | 20000100 |
dealTime | String | 是 | 14 | 交易时间,交易失败时可能为空。收单系统对交易进行处理的时间,格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20170728120001 |
ext1 | String | 否 | 128 | 扩展字段1,与提交订单时一致 | 扩展字段1 |
ext2 | String | 否 | 128 | 扩展字段2,与提交订单时一致 | 扩展字段2 |
extInfo | Json | 可选 | 不定长 | 需单独申请配置,配置后返回该字段,目前包括:authTransId(微信支付宝端支付单号),authMerOrderId(微信支付宝端商家订单号),actualPayType(实际支付方式),deviceType(实际支付的设备类型);前两个字段当微信/支付宝支付时返回,后两个字段值可联合得到消费者最后选择的支付方式。(参考请求中payType和deviceType的定义)由于银联特殊规则,当支付方式为支付宝时,银联会在支付宝的原始支付单号前加两位数字,若接入方需要该字段进行逻辑处理,请依据银联规则裁剪长度。(若银联规则有变更,我司会在得到通知后告知新规则) | 2020-11-16 V4.5新增]样例为:{"deviceType":"1","authMerOrderId":"07012011163829365007287","actualPayType":"2","authTransId":"932020111622001466645715328950"}该字段以key:value形式返回,每个key之间,分隔;接入时需要支持该字段的扩展,以备后续该字段增加/减少key值。 注意:商户接收到的字段值为urlEncode之后的值(如:extInfo=%7B%22deviceType%22%3A%222%22%2C%22authMerOrderId%22%3A%2207212011253343123302602%22%2C%22actualPayType%22%3A%227%22%2C%22authTransId%22%3A%224200000744202011259445484075%22%7D),需要对=号后面的内容进行urlDecode,上文解码之后的内容为:{"deviceType":"2","authMerOrderId":"07212011253343123302602","actualPayType":"7","authTransId":"4200000744202011259445484075"} |
bankDealId | String | 否 | 128 | 银行交易号,后端通道系统的交易流水号。 需要按照海关179 号文报送的商户可以解析该字段存储,格式为1 位字母(标识银联/网联/其他)+流水号。其中U-银联,N-网联,D-直连,O-其他目前后端渠道在断直连背景下 A-支付宝直连,b-微信直连,基本均为U或者N |
如:U20181203215458215 表示交易渠道为银联,流水号为20181203215458215 |
partyOrderId | String | 可选 | 64 | 支付宝直连APP、微信直连APP四种场景下返回 | |
payResult | String | 是 | 2 | 处理结果: 10-支付成功 其他均为失败 |
10 |
errCode | String | 是 | 128 | 错误代码,详细请参考 | |
signMsg | String | 是 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。对于所有值不为空的参数及对应值,按照字母顺序组成字符串 DSA:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 singMsg需要进行urldecode解码:veryfyResult = XMLSecurityProcess.veryfySignature(dataReceived, URLDecoder.decode(signMsg)); 注:若通过sdk接入,则无需自己处理,代码已封装 |
- 下述字段按首字母排列进行验签
- 仅对非空字段进行验签
bankDealId={bankDealId}&bankId={bankId}&dealId={dealId}&dealTime={dealTime}&errCode={errCode}&ext1={ext1}&ext2={ext2}&merchantAcctId={merchantAcctId}&orderAmount={orderAmount}&orderCurrency={orderCurrency}&orderId={orderId}&orderTime={orderTime}&payResult={payResult}&payType={payType}&terminalId={terminalId}&version={version}
2.转账支付-API
转账支付-API流程请参考支付流程中的序列图:时序图9
正式环境发送异步通知只支持443或80端口 其他端口暂时不支持
本文档定义CHINAPNR支付网关商户接入接口规范,提供接口报文参数说明、示例报文、信息安全解决方案,并给出相关问题说明等,以帮助商户技术人员接入,便于尽快投入使用。
根据PCI-DSS检查要求,正式环境禁止使用低版本的SSL3.0 TLS1.0 TLS1.1等协议,请使用高于TLSv1.2及以上发送请求,推荐使用TLSv1.2
提交参数
2.1预下单
环境 | HTTPS请求地址 |
---|---|
测试环境 | https://hfgj.testpnr.com/pay/banktransApi.htm |
正式环境 | https://global.chinapnr.com/pay/banktransApi.htm |
协议参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
inputCharset | String | 是 | 1 | 字符集,固定值:1 1-UTF-8 |
1 |
pageUrl | String | 否 | 256 | 接受支付结果的页面地址网关模式转账支付时,会带结果跳转商户页面,需商户根据交易结果展示对应页面 | https://www.merchant.com/pay/notifyReceiverPg.do |
bgUrl | String | 是 | 256 | 服务器接受支付结果的后台地址 | https://www.merchant.com/pay/notifyReceiverBg.do |
version | String | 是 | 10 | 网关版本,固定值:3.0 | 3.0 |
language | String | 是 | 3 | 网关页面显示语言种类,固定值:1 1-中文显示 |
1 |
signType | String | 是 | 256 | 签名类型,固定值:4 4-RSA加签 |
4 |
业务参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 是 | 32 | 会员账号,由我司提供的商户号+01,共13位数字 | 1001234001101 |
terminalId | String | 是 | 8 | 终端号,由我司提供的终端号,不同的接口/功能可能会分配不同的终端号,故请考虑多终端情况下的兼容。 | 999999 |
payerName | String | 是 | 96 | 支付人姓名,中文名 | 张三 |
payerContactType | String | 否 | 1 | 支付人联系方式类型,固定值:1或者2 1-代表电子邮件方式 2-其他联系方式 |
1 |
payerContact | String | 条件必选 | 64 | 支付人联系方式,根据payerContactType的方式填写对应字符,邮箱或者其他联系方式,转账支付必填,填写支付人邮箱地址 | 13400000000 |
payerIdentityCard | String | 是 | 32 | 支付人身份证号码,字符串,18位身份证号;如果身份证号包含X,请保持字母为大写 | 320125198800001000 |
mobileNumber | String | 否 | 32 | 支付人手机号 | 15800001111 |
cardNumber | string | 是 | 32 | 支付人所持卡号。 | 6225881257400000 |
customerId | string | 否 | 32 | 支付人在商户系统的客户编号。快捷支付时必填,方便用户二次支付 | jd1001 |
customerIp | string | 条件必填 | 32 | 直连微信APP支付必填; 服务商公众号支付必填; 支付宝支付方式建议填写; |
客户ip;示例:127.0.0.1 |
orderId | string | 是 | 32 | 商户订单号,只允许使用字母、数字、_,每商户提交的订单号,必须在自身账户交易中唯一 | 20170728120001299 |
inquireTrxNo | string | 否 | 32 | 查询流水号 商户从CHINAPNR外汇询价时需填入PNR返回的工单号,用于锁定汇率,不填则根据交易时间实时询价 |
交易前已在CHINAPNR询价返回工单号:2089,则填入2089 |
orderCurrency | String | 是 | 3 | 订单币种,3位币别码,详情请参照币别代码附录。当该字段不为CNY时,必须与settlementCurrency一致。 默认请填写CNY,如需其他币别,请联系我司确认 |
如人民币:CNY |
settlementCurrency | String | 是 | 3 | 结算币种,3位币别码,详情请参照币别代码附录。 默认请填写CNY,如需其他币别,请联系我司确认 |
如人民币:CNY |
orderAmount | Number | 是 | 12 | 商户订单金额,整型数字,单位为分。日韩元支持的最小单位为元。 | 如100元,则填写10000 |
orderTime | String | 是 | 14 | 商户订单提交时间,一共14位格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20071117020101 |
productName | String | 是 | 256 | 商品名称 | |
productNum | Number | 否 | 8 | 商品数量,整型数字 | 1 |
productId | String | 是 | 32 | 商品代码,请根据我司提供的商品代码附录进行填写。 | 如服饰箱包,填写:100200(如多个商品填写最主要的商品代码) |
productDesc | String | 否 | 256 |
填写规则: 商品编号|商品名称|商品数量|商品单价(单位元)|商品链接;商品编号|商品名称|商品数量|商品单价(单位元)|商品链接 填写说明: 1、同一商品用半角竖线分隔,不同商品间用半角分号分隔 2、商品编号,商家该款商品的唯一编码 3、其中,商品编号、商品名称、商品数量、商品单价必填,商品链接非必填(参数非必填,栏位|必要填写) |
填写示例: 200R32P|爱他美1段|2|250|http://baidu.com;200R32M|爱他美2段|1|130| |
ext1 | String | 否 | 128 | 扩展字段1,预留 | 扩展字段1 |
ext2 | String | 否 | 128 | 扩展字段2,预留 | 扩展字段2 |
openId | String | 否 | 128 | deviceType=2,payType=7或8时必填,关注微信公众号的用户分配的id,可参考微信官方文档指引 | 如: op5EP1G8XtyYH1VvmAbleB3AYgc8 |
deviceType | String | 是 | 1 | 1:pc端支付 | 1 |
payType | String | 是 | 4 | F:转账支付(API) |
|
bankId | String | 否 | 8 | 银行代码,请参考银行代码表附录。网银直连时必填;即deviceType=1且payType为4时 | 如中国农业银行,ABC |
redoFlag | String | 否 | 1 | 1表示同一订单禁止重复提交标志,预留字段,订单失败后才可以重新提交 | |
divFlag | String | 否 | 1 | 指定交易需要分账时上送 | 1表示分账,不上送或上送0表示不分账;分账需要联系我司运营进行开通配置 |
riskInfo | JSON | 是 | 1024 | 详细描述参见附录riskInfo,留学、航空、酒店类需按要求上送。 | |
asyncUrl | String | 否 | 256 | 转账支付-网关模式(PC/移动端)必填,用以接受网关中转异步下单结果 | |
signMsg | String | 是 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。 注:若通过sdk接入,则无需自己处理,代码已封装 |
参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行商户密钥进行加签 |
- 按以下固定字段顺序进行加签
- 仅对非空字段进行加签
pageUrl={pageUrl}&bgUrl={bgUrl}&merchantAcctId={merchantAcctId}&terminalId={terminalId}& customerId={customerId}&orderId={orderId}&orderAmount={orderAmount}&orderTime={orderTime}&productDesc={productDesc}&ext1={ext1}&ext2={ext2}&deviceType={deviceType}&payType={payType}
返回结果
交易结果会同时通知提交时pageUrl和bgUrl对应的地址。
2.2预下单返回
预下单请求处理完成后,会返回如下数据,:
参数名称 | 参数含义 | 最大长度 | 参数说明 |
---|---|---|---|
url | 返回地址 | 1024 | type=3:此字段为空 |
queryUrl | 扫码结果轮训地址 | 1024 | type=3:此字段为空 |
type | 返回类型 | 1 | 3:其他(payInfo): 转账支付-API模式为payInfo |
respCode | 错误代码 | 6 | 000000 成功,其它为异常 |
respMsg | 错误描述 | 512 | 失败错误描述 |
payInfo | 支付信息 | 64 |
转账支付API形式,则为支付人转账所需的收款银行账户信息,格式如下: { “referenceId”:”付款参考号,支付人转账时填写”; “”benificiaryName:”汇付收款银行账户户名”; “benificiaryBank”:”汇付的收款账户所属银行”; “bankAddr”:”汇付收款银行地址”; “benificiaryAcct”:”汇付收款账号”; “cinapsNo”:”联行号”; } |
2.3返回商户支付结果
在用户支付完成之后,会给商户返回如下数据:
商户在接受到Chinapnr异步通知后,应返回成功接受内容,如"SUCCESS"。
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
merchantAcctId | String | 是 | 32 | 会员账号,与提交订单时的保持一致 | 1001234001101 |
terminalId | String | 是 | 8 | 终端号,与提交订单时的保持一致 | 999999 |
version | String | 是 | 10 | 网关版本,与提交订单时一致 | 3.0 |
payType | String | 是 | 4 | 支付方式,与提交订单时一致 | 00 |
bankId | String | 是 | 8 | 银行代码,与提交订单一致 | BOC |
orderId | String | 是 | 32 | 商户订单号,与提交订单时一致 | 20170728120001299 |
orderTime | String | 是 | 14 | 商户订单提交时间,与提交订单时一致 | 20171117020101 |
orderCurrency | String | 是 | 3 | 订单币种,与提交订单时一致 | USD |
orderAmount | Number | 是 | 12 | 商户订单金额,与提交订单时一致 | 10000 |
dealId | String | 是 | 32 | 收单系统交易号,该交易在收单系统对应的交易号 | 20000100 |
dealTime | String | 是 | 14 | 交易时间,交易失败时可能为空。收单系统对交易进行处理的时间,格式为:年[4位]月[2位]日[2位]时[2位]分[2位]秒[2位] | 20170728120001 |
ext1 | String | 否 | 128 | 扩展字段1,与提交订单时一致 | 扩展字段1 |
ext2 | String | 否 | 128 | 扩展字段2,与提交订单时一致 | 扩展字段2 |
extInfo | Json | 可选 | 不定长 | 需单独申请配置,配置后返回该字段,目前包括:authTransId(微信支付宝端支付单号),authMerOrderId(微信支付宝端商家订单号),actualPayType(实际支付方式),deviceType(实际支付的设备类型);前两个字段当微信/支付宝支付时返回,后两个字段值可联合得到消费者最后选择的支付方式。(参考请求中payType和deviceType的定义)由于银联特殊规则,当支付方式为支付宝时,银联会在支付宝的原始支付单号前加两位数字,若接入方需要该字段进行逻辑处理,请依据银联规则裁剪长度。(若银联规则有变更,我司会在得到通知后告知新规则) | 2020-11-16 V4.5新增]样例为:{"deviceType":"1","authMerOrderId":"07012011163829365007287","actualPayType":"2","authTransId":"932020111622001466645715328950"}该字段以key:value形式返回,每个key之间,分隔;接入时需要支持该字段的扩展,以备后续该字段增加/减少key值。 注意:商户接收到的字段值为urlEncode之后的值(如:extInfo=%7B%22deviceType%22%3A%222%22%2C%22authMerOrderId%22%3A%2207212011253343123302602%22%2C%22actualPayType%22%3A%227%22%2C%22authTransId%22%3A%224200000744202011259445484075%22%7D),需要对=号后面的内容进行urlDecode,上文解码之后的内容为:{"deviceType":"2","authMerOrderId":"07212011253343123302602","actualPayType":"7","authTransId":"4200000744202011259445484075"} |
bankDealId | String | 否 | 128 | 银行交易号,后端通道系统的交易流水号。 需要按照海关179 号文报送的商户可以解析该字段存储,格式为1 位字母(标识银联/网联/其他)+流水号。其中U-银联,N-网联,D-直连,O-其他目前后端渠道在断直连背景下 A-支付宝直连,b-微信直连,基本均为U或者N |
如:U20181203215458215 表示交易渠道为银联,流水号为20181203215458215 |
partyOrderId | String | 可选 | 64 | 支付宝直连扫码、支付宝直连APP、微信直连扫码、微信直连APP四种场景下返回 | |
payResult | String | 是 | 2 | 处理结果: 10-支付成功 其他均为失败 |
10 |
errCode | String | 是 | 128 | 错误代码,详细请参考 | |
signMsg | String | 是 | 2048 | 签名字符串请参考签名方法 加签证书,请参照私钥公钥生成。对于所有值不为空的参数及对应值,按照字母顺序组成字符串 DSA:参数1={参数1}&参数2={参数2}&……&参数n={参数n}然后进行支付平台证书加密形成密文后进行2048位的Base64转码。 singMsg需要进行urldecode解码:veryfyResult = XMLSecurityProcess.veryfySignature(dataReceived, URLDecoder.decode(signMsg)); 注:若通过sdk接入,则无需自己处理,代码已封装 |
- 下述字段按首字母排列进行验签
- 仅对非空字段进行验签
bankDealId={bankDealId}&bankId={bankId}&dealId={dealId}&dealTime={dealTime}&errCode={errCode}&ext1={ext1}&ext2={ext2}&merchantAcctId={merchantAcctId}&orderAmount={orderAmount}&orderCurrency={orderCurrency}&orderId={orderId}&orderTime={orderTime}&payResult={payResult}&payType={payType}&terminalId={terminalId}&version={version}
微信/支付宝交易(生产环境)的默认前提:
1、客户需要提供用于微信/支付宝入驻的主体资质,通过汇付向微信/支付宝入驻获得微信/支付宝的特约商户号;2、对于微信支付,客户需要完成如下事宜方能完成完整的入驻/配置工作:
(1)微信入驻后,商户需要扫描我司提供的微信渠道商二维码确认关联;
(2)公众号支付(JSAPI支付):客户需要提供用于唤起微信收银台的支付授权目录,汇付需将该目录(支持不超过5个)配置到上述微信商户号下;
(3)公众号支付时,客户还需提供自身的公众号APPID,同样通过我司完成与前述微信商户号的关联;小程序同理,但小程序支付无需支付授权目录;
(4)客户发起公众号/小程序支付时,需要提前获取openId,在调用我司聚合支付接口时上送。
3、具体所需入驻材料、流程细节可在实际对接时沟通获取。
1.微信公众号支付(JSAPI)时序图
2.微信小程序支付时序图
3.微信APP支付(通过小程序支付间接实现)时序图
4-1.支付宝扫码-跳转汇付网关模式-PC(二维码两小时失效)
4-2.支付宝扫码-非跳转模式(下单后返回codeUrl)(二维码两小时失效)
返回的codeUrl样例为:https%3A%2F%2Fqr.alipay.com%2Fbax04967znkjcqjsbnxp0015,注意需要进行urlDecode
此url可以通过浏览器拉起支付宝app,也可以转换为二维码展示供消费者扫码支付。
5.移动端聚合支付
类似deviceType=1,payType=6这种PC聚合,移动聚合包含了支付宝H5和快捷支付,商家也可以通过下单时指定具体的支付方式来唯一展示一种支付方式。6.微信公众号包装为微信扫码支付
7.H5拉起小程序并使用小程序支付
8.转账支付-网关模式
9.转账支付-api
10.分账交易流程
alt用户开户:步骤1,2,3:调用个人开户或企业开户接口:个人用户开户接口 ;企业用户开户接口
alt交易及分账:步骤4,5:调用聚合支付接口和步骤6,7,8:分账接口:聚合支付接口 ;收单分账接口
alt交易退款:步骤9,10:调用交易退款接口:交易退款接口
alt分账回退:步骤11,12,13:调用分账回退接口分账回退(目录4)
alt分账完结:步骤14,15:调用分账完结接口分账完结(目录6)
11.银联APP支付
银联APP支付支持银行APP、云闪付APP等多种APP支付,商家APP通过整合银联SDK实现一次对接支持多种支付APP。
银联SDK下载地址:https://open.unionpay.com/tjweb/acproduct/list?apiSvcId=3021&index=4
12.广告业务B2B支付流程
该方案适用于广告代理服务平台的客户为企业、并且使用企业网银支付的场景,主要是广告服务平台基于自身资金来源与签约协议匹配性要求(合作客户为A,那么付款对象应该也为A;不为A时广告服务平台不接受,可能直接发起退款)。
1.支付申请时提交期望的企业付款人信息:
指定上送期望付款人,格式为:
{ "companyName": "企业名称", "companyLicenseNo": "DZ1000-11", "legalPersonName": "张三", "legalPersonIdNo": "342623198812171432" }
(1)付款企业名称:companyName
(2)付款企业营业执照编码:companyLicenseNo(统一社会信用代码)
(3)付款企业法人姓名:legalPersonName
(4)付款企业法人身份证号:legalPersonIdNo
2.支付成功(仅限B2B网银支付)后广告服务平台查询实际付款人
根据平台自身实际需要,如果不接受付款人和合作客户不同的情况,平台可主动退款;若一致则可继续服务。
3.根据需要获取B2B支付业务的电子回单
4.根据实际需要,以企业客户的法人身份证+姓名发起资金出境(购汇或人民币出境)