持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
每日英语:
Every heart sings a song,incomplete,until another heart whispers back.
翻译:每颗心都在唱着一首残缺的歌,直到另一颗心轻声和应。 ——柏拉图
退款结果处理
执行退款申请虽然状态通过了,但并不表示退款成功了,退款结果微信支付服务器会通过最初发起退款申请的时候留下的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);
}
退款结果解密
微信退款中结果是加密处理了,我们需要获取退款结果并进行解密,但需要对商户秘钥做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,再根据退款状态更新订单即可。
总结
本篇主要讲述了退款结果后的一些处理,退款结果接收、退款结果解密。