接上次 退款接口、现在开始做退款查询接口、该接口主要用于在查询单笔订单退款信息查询、商户月末清算等。废话不多说、、、
看文档:
退款查询API
提交退款申请后, 通过调用该接口查询退款状态。 退款有一定延时, 请在 3 个工作日后重新查询退款状态。
请求参数列表
请求url:https://pay.swiftpass.cn/pay/gateway
POST XML 内容体进行请求
字段名 | 变量名 | 必填 | 类型 | 说明 |
接口类型 | service | 是 | String(32) | 接口类型:unified.trade.refundquery |
版本号 | version | 否 | String(8) | 版本号,version默认值是1.0。 |
字符集 | charset | 否 | String(8) | 可选值 UTF-8 ,默认为 UTF-8。 |
签名方式 | sign_type | 否 | String(8) | 签名类型,取值:MD5默认:MD5 |
商户号 | mch_id | 是 | String(32) | 商户号,由平台分配 |
商户订单号 | out_trade_no | 否 | String(32) | 商户系统内部的订单号, out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先 |
平台订单号 | transaction_id | 否 | String(32) | 平台单号, out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先 |
商户退款单号 | out_refund_no | 否 | String(32) | 商户退款单号,32个字符内、可包含字母,确保在商户系统唯一。 |
平台退款单号 | refund_id | 否 | String(32) | 平台退款单号refund_id、out_refund_no、out_trade_no 、transaction_id 四个参数必填一个, 如果同事存在优先级为:refund_id>out_refund_no>transaction_id>out_trade_no |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串,不长于 32 位 |
签名 | sign | 是 | String(32) | MD5签名结果,详见“安全规范” |
返回结果
数据按XML的格式实时返回
字段名 | 变量名 | 必填 | 类型 | 说明 |
版本号 | version | 是 | String(8) | 版本号,version默认值是2.0。 |
字符集 | charset | 是 | String(8) | 可选值 UTF-8 ,默认为 UTF-8。 |
签名方式 | sign_type | 是 | String(8) | 签名类型,取值:MD5默认:MD5 |
返回状态码 | status | 是 | String(16) | 0表示成功,非0表示失败此字段是通信标识,非交易标识,交易是否成功需要查看 result_code 来判断 |
返回信息 | message | 否 | String(128) | 异常或错误时返回信息,具体描述请看文档最后返回信息列表 |
以下字段在 status 为 0的时候有返回 | ||||
业务结果 | result_code | 是 | String(16) | 0表示成功,非0表示失败 |
商户号 | mch_id | 是 | String(32) | 商户号,由平台分配 |
设备号 | device_info | 否 | String(32) | 平台分配的终端设备号 |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串,不长于 32 位 |
错误代码 | err_code | 否 | String(32) | 具体错误码请看文档最后错误码列表 |
签名 | sign | 是 | String(32) | MD5签名结果,详见“安全规范” |
以下字段在 status 和 result_code 都为 0的时候有返回 | ||||
平台订单号 | transaction_id | 是 | String(32) | 平台订单号。 |
商户订单号 | out_trade_no | 是 | String(32) | 商户系统内部的订单号 |
退款笔数 | refund_count | 是 | Int | 退款记录数 |
商户退款单号 | out_refund_no_$n | 是 | String(32) | 商户退款单号 |
平台退款单号 | refund_id_$n | 是 | String(32) | 平台退款单号 |
退款渠道 | refund_channel_$n | 是 | String(16) | ORIGINAL—原路退款,默认 |
退款金额 | refund_fee_$n | 是 | Int | 退款总金额,单位为分,可以做部分退款 |
现金券退款金额 | coupon_refund_fee_$n | 否 | Int | 现金券退款金额 <= 退款金额, 退款金额-现金券退款金额为现金 |
退款时间 | refund_time_$n | 否 | String(14) | yyyyMMddHHmmss |
退款状态 | refund_status_$n | 是 | String(16) | SUCCESS—退款成功 FAIL—退款失败 PROCESSING—退款处理中 NOTSURE—未确定, 需要商户原退款单号重新发起 CHANGE—转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者平台转账的方式进行退款。 |
$n 表示记录的序号,取值为 0~($ refund_count -1),例如 refund_count 指示返回的退款记录有 2 条。第一条序号为“0”,第二条序号为“1”。 |
根据文档我们看到该接口的请求参数和订单查询的请求参数基本相同、除了那个交易类型不同之外。所以(可以考虑公用订单查询接口、这样开发工作量就小了)、当然最好有个单独的接口。、、、、、、
下面看demo:
1 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2 req.setCharacterEncoding("utf-8"); 3 resp.setCharacterEncoding("utf-8"); 4 5 SortedMap<String,String> map = XmlUtils.getParameterMap(req); 6 System.out.println(XmlUtils.toXml(map)); 7 String key = SwiftpassConfig.key; 8 String res = null; 9 String reqUrl = SwiftpassConfig.req_url; 10 map.put("mch_id", SwiftpassConfig.mch_id); 11 map.put("nonce_str", String.valueOf(new Date().getTime())); 12 13 Map<String,String> params = SignUtils.paraFilter(map); 14 StringBuilder buf = new StringBuilder((params.size() +1) * 10); 15 SignUtils.buildPayParams(buf,params,false); 16 String preStr = buf.toString(); 17 String sign = MD5.sign(preStr, "&key=" + key, "utf-8"); 18 map.put("sign", sign); 19 20 System.out.println("reqUrl:" + reqUrl); 21 22 CloseableHttpResponse response = null; 23 CloseableHttpClient client = null; 24 try { 25 HttpPost httpPost = new HttpPost(reqUrl); 26 StringEntity entityParams = new StringEntity(XmlUtils.parseXML(map),"utf-8"); 27 httpPost.setEntity(entityParams); 28 httpPost.setHeader("Content-Type", "text/xml;charset=ISO-8859-1"); 29 client = HttpClients.createDefault(); 30 response = client.execute(httpPost); 31 if(response != null && response.getEntity() != null){ 32 Map<String,String> resultMap = XmlUtils.toMap(EntityUtils.toByteArray(response.getEntity()), "utf-8"); 33 res = XmlUtils.toXml(resultMap); 34 System.out.println("请求结果:" + res); 35 36 if(resultMap.containsKey("sign") && !SignUtils.checkParam(resultMap, key)){ 37 res = "验证签名不通过"; 38 } 39 }else{ 40 res = "操作失败!"; 41 } 42 } catch (Exception e) { 43 e.printStackTrace(); 44 res = "操作失败"; 45 } finally { 46 if(response != null){ 47 response.close(); 48 } 49 if(client != null){ 50 client.close(); 51 } 52 } 53 if(res.startsWith("<")){ 54 resp.setHeader("Content-type", "text/xml;charset=UTF-8"); 55 }else{ 56 resp.setHeader("Content-type", "text/html;charset=UTF-8"); 57 } 58 resp.getWriter().write(res); 59 }
根据demo、、、、、、 (注意事项和之前的一样、这也就是个查询操作)
我们把只需要把订单查询接口的传入参数中的service(交易类型)改变成上面文档中的即可。
、、、 基本现在就差一个 ---- 结算的接口了、想想办法。