发起支付退款
商户业务系统通过统一退款接口发起退款请求,店来宝支付网关会根据商户发起的支付订单号,找到对应到支付通道发起退款。
接口说明
适用对象:普通商户 特约商户
请求URL:https://pay.yintongzaixian.com/api/refund/refundOrder
请求方式:POST
请求类型:application/json 或 application/x-www-form-urlencoded
请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 商户号 | mchNo | 是 | String(64) | M1621873433953 | 商户号 |
| 应用ID | appId | 是 | String(64) | 60cc09bce4b0f1c0b83761c9 | 应用ID |
| 支付订单号 | payOrderId | 是 | String(30) | P20160427210604000490 | 支付中心生成的订单号,与mchOrderNo二者传一即可 |
| 商户订单号 | mchOrderNo | 是 | String(64) | 20160427210604000490 | 商户生成的支付订单号,与payOrderId二者传一即可 |
| 商户退款单号 | mchRefundNo | 是 | String(64) | M27210632100491 | 商户生成的退款单号 |
| 退款金额 | refundAmount | 是 | int | 100 | 退款金额,单位分 |
| 货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny |
| 退款原因 | refundReason | 是 | String(256) | 用户退货 | 退款原因 |
| 客户端IP | clientIp | 否 | String(128) | 210.73.10.148 | 客户端IPV4地址 |
| 异步通知地址 | notifyUrl | 否 | String(128) | https://www.yintongzaixianpay.cn/notify.htm | 退款完成后回调该URL,只有传了该值才会发起回调 |
| 渠道参数 | channelExtra | 否 | String(512) | {“auth_code”, “13920933111042”} | 特定渠道发起的额外参数,json格式字符串.详见渠道参数说明 |
| 扩展参数 | extraParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 |
| 请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 |
| 接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 |
| 签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
| 签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5或RSA2方式 |
请求示例数据JSON
{
"payOrderId": "P202106181104177050002",
"extParam": "",
"mchOrderNo": "",
"refundReason": "退款测试",
"sign": "2762CDB48D5179281DB6C0995E4EEDE0",
"reqTime": "1624007315",
"version": "1.0",
"channelExtra": "",
"appId": "60cc09bce4b0f1c0b83761c9",
"mchRefundNo": "mho1624007315478",
"clientIp": "192.166.1.132",
"notifyUrl": "https://www.jeequan.com",
"signType": "MD5",
"currency": "cny",
"mchNo": "M1623984572",
"refundAmount": 4
}
返回参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 |
| 返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 |
| 签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 |
| 返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 |
data数据格式
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 退款订单号 | refundOrderId | 是 | String(30) | R202106181708358940000 | 返回退款订单号 |
| 商户退款单号 | mchRefundNo | 是 | String(30) | mho1624007315478 | 返回商户传入的退款单号 |
| 退款状态 | state | 是 | int | 2 | 退款状态 0-订单生成 1-退款中 2-退款成功 3-退款失败 4-退款关闭 |
| 渠道退款单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的退款单号 |
| 渠道错误码 | errCode | 否 | String | ACQ.PAYMENT_AUTH_CODE_INVALID | 上游渠道返回的错误码 |
| 渠道错误描述 | errMsg | 否 | String | Business Failed 失败 | 上游渠道返回的错误描述 |
返回示例数据JSON
{
"code": 0,
"data": {
"channelOrderNo": "2021061822001423031419593035",
"mchRefundNo": "mho1624007315478",
"payAmount": 58,
"refundAmount": 4,
"refundOrderId": "R202106181708358940000",
"state": 2
},
"msg": "SUCCESS",
"sign": "2843B811B7A75D56B7D1950362820875"
}
SDK调用示例(Java)
JeepayClient jeepayClient = JeepayClient.getInstance(Jeepay.appId, Jeepay.apiKey, Jeepay.getApiBase());
RefundOrderCreateRequest request = new RefundOrderCreateRequest();
RefundOrderCreateReqModel model = new RefundOrderCreateReqModel();
model.setMchNo(Jeepay.mchNo); // 商户号
model.setAppId(jeepayClient.getAppId()); // 应用ID
model.setPayOrderId("P1526477317539262465"); // 支付订单号
model.setMchRefundNo("R" + new Date().getTime()); // 商户退款单号
model.setRefundAmount(1L); // 退款金额,单位分
model.setRefundReason("用户申请退款"); // 退款原因
request.setBizModel(model);
try {
RefundOrderCreateResponse response = jeepayClient.execute(request);
_log.info("验签结果:{}", response.checkSign(Jeepay.apiKey));
if (response.isSuccess(Jeepay.apiKey)) {
_log.info("data:{}", response.getData());
} else {
_log.info("请求失败:mchNo={}, msg={}", Jeepay.mchNo, response.getMsg());
}
} catch (JeepayException e) {
_log.error(e.getMessage());
}