分账退款接口

1.修订记录

修订 日期 说明 作者
V0.1 2018/10/30 新接口参数定义 罗华仪
V0.2 2020/11/11 修改ACQ_QUERY_NO_RECORD的说明 汤吉齐
V0.3 2021/01/21 修改ACQ_QUERY_NO_RECORD的描述 王晶
V0.4 2021/05/27 补充接口文档,使其和svn上面的word版本保持一致 汤吉齐
V0.5 2021/12/27 支持国密 王晶

2.接口说明

(1)场景说明

1、分账完成后,可以调用此接口中进行分账退款

(2)接口说明

1、分账退款接口

3.请求地址

环境 HTTPS请求地址
正式环境 https://openapi.ysepay.com/gateway.do

4.请求参数说明

4.1 公共请求参数

参数 类型(字节长度) 必填 参数说明
method String(128) Y 接口名称 固定值 ysepay.online.trade.refund.split
partner_id String(20) Y 在银盛支付开设的服务商商户号,请联系客户经理提供
timestamp String(19) Y 发送请求的时间,格式"yyyy-MM-dd HH:mm:ss" 示例值:2014-07-24 03:07:50
charset String(10) Y 商户网站使用的编码格式,如UTF-8、GBK、GB2312等,默认值 GBK
sign_type String(10) Y 报文签名算法,RSA/SM
sign String(256) Y 签名字符串,再用Base64编码
version String(3) Y 接口版本3.0 当前版本:3.0
notify_url String(190) Y 交易成功异步通知到商户的后台地址,http路径支持多个url进行异步通知,多个url用分隔符“,”分开,格式如:url1,url2,url3,支持TLS1.0、TLS1.1、TLS1.2
tran_type String(1) N 交易类型,说明:1或者空:非担保交易,2:担保交易,无特殊需求 不用填此字段
biz_content String Y 业务请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递

4.2 业务请求参数

参数名biz_content,值为一个json格式对象,下面列表描述json对象的值

参数 类型(字节长度) 必填 参数说明
out_trade_no String(1,32) Y 商户原交易订单号, 示例值:201805256843192280647118
shopdate String(8,8) Y 商户系统的交易发生日期格式yyyyMMdd 示例值:20180525
trade_no String(1,30) C 银盛原交易流水号 示例值:311160414497667096
refund_amount Number(10,2) Y 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数,Number(10,2)指10位长度,2位精度
refund_reason String(1,50) Y 退款的原因说明,该参数最长为50个汉字。
out_request_no String(1,32) Y 标商户系统生成的退款订单号,标识一次退款请求,同一笔交易多次退款需要保证唯一。该参数支持汉字,最大长度为16个。用同一订单号同一退款流水号继续退款时,则会返回第一次退款的结果不会继续退款 示例值:RD2012061713107
is_division String(2) N 原交易是否参与分账(01或空代表是,02代表否)
refund_split_info Json数组 N 退款分账明细,分账退款金额总和等于退款金额,当原交易参与分账时,该参数必传,原交易不参与分账,该参数无值
ori_division_mode String(2) N 原交易分账模式(01:比例,02:金额)
order_div_list Json数组 N 原订单交易分帐信息,当原交易参与分账时,该参数必传,原交易不参与分账,该参数无值

4.2.1 分账退款 refund_split_info

参数 类型(字节长度) 必填 参数说明
refund_mer_id String(20) N 分账退款商户号
refund_amount Number(10,2) N 分账退款金额
ori_division_mode String(2) N 原交易分账模式(01:比例,02:金额)

4.2.2 原分账信息 order_div_list

参数 类型(字节长度) 必填 参数说明
division_mer_id String(20) Y 原订单分账收款方商户号
division_amount Number(10,2) N 原订单分账金额,ori_division_mode=02时必填,保留2位小数
division_ratio Number(1,4) N 原订单分账比例,ori_division_mode=01时必填,小数格式,最大4位小数位
is_charge_fee String(2) Y 是否收取手续费(01:是,02否)

5.响应参数说明

银盛支付对商户的请求数据处理完成后,会将处理的结果数据同步回执给商户。

请注意:银盛后期会对返回参数保留扩展的权力,扩展方式为新增参数但不会删除参数,请商户在解析银盛返回参数时要支持银盛可能扩展参数这种情况。

5.1 公共响应参数

参数 类型(字节长度) 必填 参数说明
sign String Y 签名字符串,Base64编码
ysepay_online_trade_refund_split_response String Y 业务响应参数的集合,最大长度不限

5.2 业务响应参数

参数 类型(字节最大长度) 必填 参数说明 样例
code String Y 响应代码
msg String Y 响应代码描述
refund_amount Number Y 本次发生的退款金额 88.89
trade_no String(1,30) Y 银盛支付交易流水号 311160414497667096
out_trade_no String(1,32) Y 商户系统生成的订单号 68431922806471166
account_date String(10) Y 退款会计日期,格式"yyyy-MM-dd" 示例值:2014-07-24 2014-07-24

5.3 分账异步通知参数

银盛支付对商户的请求数据处理完成后,会将处理的结果数据通过服务器主动通知的方式通知给商户网站。这些处理结果数据就是服务器异步通知参数。

请注意:银盛后期会对返回参数保留扩展的权力,扩展方式为新增参数但不会删除参数,请商户在解析银盛返回参数时要支持银盛可能扩展参数这种情况。

参数 类型(字节长度) 必填 参数说明
out_trade_no String(1,32) Y 退款订单号
total_amount Number(15, 2) Y 退款金额,15长度位,保留2位小数
trade_no String(0,30) Y 退款交易流水(3位交易类型+6位日期+8位序列+2位随机+1位校验码)
trade_status String(0,2) Y 状态
account_date String(0,8) N 会计日期
coupon_info String(0,1000) N 优惠信息coupon_info优惠信息活动对象为多个时,coupon_info中就有多方优惠信息spnsrId出资方,值为1时银联出资,值为2时付款方出资,值为3时商户出资offstAmt优惠金额
settlement_amount Number(15, 2) N 结算金额
sign_type String Y 报文签名算法 默认值 RSA
wxpay_refund_coupon_info String(0,4000) N 微信退款营销信息,版本3.5及以上。才支持返回
alipay_refund_coupon_info String(0,4000) Y 支付宝退款营销信息,版本3.5及以上。才支持返回

6.样例

6.1 sdk调用示例

  • 银盛将与服务端交互的接口封装在开发工具包(SDK)中,开发者无需自行实现同服务端交互的复杂逻辑,直接将SDK导入自己的工程后,通过sdk示例代码实现同银盛服务端的交互
        OnlineReqDataVo req = new OnlineReqDataVo();
        //请求路径,建议配置在项目的配置文件里面
        String reqUrl = "https://openapi.ysepay.com/gateway.do";
        //私钥证书存放路径,建议配置在项目的配置文件里面
        String privateKeyFilePath = "D:\\opensdk\\hyfz_test2.pfx";
        //ys公钥证书存放地址 建议配置在项目的配置文件里面
        String publicKeyFilePath = "D:\\opensdk\\businessgate.cer";
        //私钥证书密钥,建议配置在项目的配置文件里面
        String privateKeyPassworde = "123456";

        //银盛支付服务器主动通知商户网站里指定的页面http路径
        String notifyUrl = "http://api.test.ysepay.net/atinterface/receive_return.htm";
        req.setNotifyUrl(notifyUrl);

        //商户在银盛支付平台开设的用户号[商户号],接入时需要替换成自己的
        req.setPartnerId("hyfz_test2");
        req.setReqUrl(reqUrl);
        req.setPrivateKeyFilePath(privateKeyFilePath);
        req.setPrivateKeyPassword(privateKeyPassworde);
        req.setYsPublicKeyFilePath(publicKeyFilePath);
        //分账退款交易请求业务参数
        Map<String, Object> bizContent = new HashMap<>();
        bizContent.put("out_trade_no", "20211012175144035102000788376200");//原订单号
        bizContent.put("shopdate", "20211012");//商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
        bizContent.put("trade_no", "01O211012233547058");//银盛交易号, 可空
        bizContent.put("refund_amount", "0.01");//需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数,Number(10,2)指10位长度,2位精度
        bizContent.put("refund_reason", "不想买了");//退款的原因说明,该参数最长为50��汉字。
        bizContent.put("out_request_no", "RD2012061713107");//标识一次退款请求,同一笔交易多次退款需要保证唯一。该参数支持汉字,最大长度为16个。用同一订单号同一退款流水号继续退款时,则会返回第一次退款的结果不会继续退款
        bizContent.put("is_division", "01");//可空, 原交易是否参与分账(01或空代表是,02代表否)
        //退款分账明细,分账退款金额总和等于退款金额,当原交易参与分账时,该参数必传,原交易不参与分账,该参数无值
        JSONArray refundSplitInfo = new JSONArray();
        JSONObject infoObject = new JSONObject();
        infoObject.put("refund_mer_id","y2110091506590197537");//分账退款商户号
        infoObject.put("refund_amount","0.01");//分账退款金额
        refundSplitInfo.add(infoObject);
        bizContent.put("refund_split_info", refundSplitInfo);//退款分账明细,可空
        bizContent.put("ori_division_mode", "01");//原交易分账模式(01:比例,02:金额),可空
        //原订单交易分帐信息,当原交易参与分账时,该参数必传,原交易不参与分账,该参数无值
        JSONArray orderDivList = new JSONArray();
        infoObject = new JSONObject();
        infoObject.put("division_mer_id","hyfz_test2");//分账商户号
//        infoObject.put("division_amount","0.09");//分账金额, 可空按分账模式可填
        infoObject.put("division_ratio","0.90");//分账比例,分账比例之和必须为1, 可空按分账模式可填
        infoObject.put("is_charge_fee","02");//是否收取手续费(01:是,02否)若配置手续费收支分离,该参数配置的手续费承担方不生效
        orderDivList.add(infoObject);
        infoObject = new JSONObject();
        infoObject.put("division_mer_id","y2110091506590197537");//分账商户号
//        infoObject.put("div_amount","0.09");//分账金额, 可空按分账模式可填
        infoObject.put("div_ratio","0.10");//分账比例,分账比例之和必须为1, 可空按分账模式可填
        infoObject.put("is_charge_fee","01");//是否收取手续费(01:是,02否)
        orderDivList.add(infoObject);
        bizContent.put("order_div_list", orderDivList);//原订单交易分帐信息,可空
        req.setParamData(bizContent);
        String result = null;
        try{
            logger.info("分账退款交易调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
            result = MercFundApi.tradeRefundSplit(req);
            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
        }catch (Exception e){
            logger.info("分账退款交易接口失败:"+ e.getMessage());
        }

6.2 API接口代码示例

  • 需要开发者自己封装调用逻辑,实现调用银盛api接口同银盛服务端交互,该示例没有加签验签及发送http请求代码,需自行下载demo查看。
public static void main(String[] args) {
        Map<String, String> mapData = new HashMap<>();
        mapData.put("partner_id", "hyfz_test2");
        mapData.put("method", "ysepay.online.trade.refund.split");
        mapData.put("timestamp", DateUtil.getDateNow());
        mapData.put("sign_type", "RSA");
        mapData.put("charset", "utf-8");
        mapData.put("version", "3.0");
        mapData.put("notify_url","http://127.0.0.1");

        JSONObject json = new JSONObject();
        json.put("out_trade_no", "20210722174831981103602311553304");
        json.put("shopdate","20210722");
        json.put("refund_amount","0.01");
        json.put("refund_reason","退款测试");
        json.put("is_division","02");
        json.put("out_request_no",SerialGenerator.getOrder());
        json.put("trade_no", "");
        mapData.put("biz_content",json.toString());
        //参数签名
        try{
            String sign = YsPaySignUtils.sign(mapData);
            mapData.put("sign",sign);
        } catch (Exception e){
            log.info("签名异常:"+e);
        }
        //调用查询接口
        log.info("请求报文:"+ CommonUtil.mapToString(mapData));
        String result = HttpRequest.sendPost("https://openapi.ysepay.com/gateway.do",CommonUtil.mapToString(mapData));
        log.info("接口回执:"+result);
        boolean resultVerify = false;
        //接口回执验签
        try{
            resultVerify = YsPaySignUtils.resultVerify(result,"ysepay_online_trade_refund_split_response");
        } catch (Exception e){
            log.info("验签异常:"+e);
        }
        if(!resultVerify){
            log.info("验签失败");
        }
    }

6.3 分账退款 refund_split_info

[{
    "refund_mer_id": "分账退款商户号",
    "refund_amount": "分账退款金额"
}]

7.附录

7.1 分账退款登记请求错误码

错误码 错误描述 解决方案
ACQ.SYSTEM_ERROR 系统内部错误 请使用相同的参数再次调用
ACQ.INVALID_PARAMETER 参数无效 请求参数有错,重新检查请求后,再调用退款

---{"code":200,"message":"成功","data":null,"list":null}

results matching ""

    No results matching ""