微信支付05

Posted 岷州李斌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信支付05相关的知识,希望对你有一定的参考价值。

接上次 退款接口、现在开始做退款查询接口、该接口主要用于在查询单笔订单退款信息查询、商户月末清算等。废话不多说、、、

看文档:


 

                            退款查询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(交易类型)改变成上面文档中的即可。

、、、 基本现在就差一个  ---- 结算的接口了、想想办法。

 

以上是关于微信支付05的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序代码片段

微信支付之扫码支付相关代码(Java)

微信支付——微信公众号内支付 代码

网站如何接入微信支付功能?微信支付详细教程它来了(建议收藏)

微信支付v3的demo怎么转换成thinkphp代码

微信小程序代码片段分享