退款结果处理

294 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

每日英语:

Every heart sings a song,incomplete,until another heart whispers back.

翻译:每颗心都在唱着一首残缺的歌,直到另一颗心轻声和应。 ——柏拉图

退款结果处理

1606529071900.png

执行退款申请虽然状态通过了,但并不表示退款成功了,退款结果微信支付服务器会通过最初发起退款申请的时候留下的notify_url地址通知我们,所以我们可以编写一个方法接收退款结果,并将结果发送到订单服务,订单服务根据退款结果更新订单状态。

退款结果接收

退款申请的地址http://2cw4969042.wicp.vip:25082/wx/refund/result,我们在mall-pay-service中创建接收方法,修改com.xz.mall.pay.controller.WeixinPayController添加接收方法,代码如下:

/***
 * 退款通知结果
 */
@RequestMapping(value = "/refund/result")
public String refundResult(HttpServletRequest request) throws Exception{
    System.out.println("*****************************退款通知*********************************");
    //获取结果
    ServletInputStream is = request.getInputStream();
    //接收存储网络输入流(微信服务器返回的支付状态数据)
    ByteArrayOutputStream os = new ByteArrayOutputStream();
​
    //缓冲区定义
    byte[] buffer = new byte[1024];
    int len = 0;
    //循环读取输入流,并写入到os中
    while ((len=is.read(buffer))!=-1){
        os.write(buffer,0,len);
    }
​
    //关闭资源
    os.close();
    is.close();
​
    //将结果转成xml的字符串
    String xmlResult = new String(os.toByteArray(),"utf-8");
    //将xmlResult转成Map
    Map<String, String> responseMap = WXPayUtil.xmlToMap(xmlResult);
​
    //发送MQ消息,普通消息,非事务消息
    Message message = MessageBuilder.withPayload(JSON.toJSONString(responseMap)).build();
    rocketMQTemplate.send("lastrefundresult",message);
​
    //返回结果
    Map<String,String> resultMap = new HashMap<String,String>();
    resultMap.put("return_code","SUCCESS");
    resultMap.put("return_msg","OK");
    return WXPayUtil.mapToXml(resultMap);
}

退款结果解密

1607913061650.png

微信退款中结果是加密处理了,我们需要获取退款结果并进行解密,但需要对商户秘钥做MD5加密,并转成小写。代码如下:

//获取退款信息(加密了-AES)
String reqinfo = responseMap.get("req_info");
String key = MD5.md5(skey);
byte[] decode = AESUtil.encryptAndDecrypt(Base64Util.decode(reqinfo), key, 2);
System.out.println("退款解密后的数据:"+new String(decode, "UTF-8"));

输出结果如下:

退款解密后的数据:<root>
<out_refund_no><![CDATA[1338309530114633729]]></out_refund_no>
<out_trade_no><![CDATA[1338284381151772673]]></out_trade_no>
<refund_account><![CDATA[REFUND_SOURCE_RECHARGE_FUNDS]]></refund_account>
<refund_fee><![CDATA[1]]></refund_fee>
<refund_id><![CDATA[50300406652020121404689603101]]></refund_id>
<refund_recv_accout><![CDATA[支付用户零钱]]></refund_recv_accout>
<refund_request_source><![CDATA[API]]></refund_request_source>
<refund_status><![CDATA[SUCCESS]]></refund_status>
<settlement_refund_fee><![CDATA[1]]></settlement_refund_fee>
<settlement_total_fee><![CDATA[1]]></settlement_total_fee>
<success_time><![CDATA[2022-10-23 10:00:18]]></success_time>
<total_fee><![CDATA[1]]></total_fee>
<transaction_id><![CDATA[4200000805202012140051202172]]></transaction_id>
</root>

我们可以把上述xml数据转成Map,再根据退款状态更新订单即可。

总结

本篇主要讲述了退款结果后的一些处理,退款结果接收、退款结果解密。