微信支付原路退款

第一次写这个微信退款,总结一下

准备工作

  1. 配置文件中配置以下参数
    在这里插入图片描述
    ps:这些参数在application配置文件配置

  2. 获取证书
    在这里插入图片描述
    获取证书并把证书保存到resources资源文件下

  3. 添加以下jar包

		<dependency>
			<groupId>com.jfinal</groupId>
			<artifactId>jfinal-weixin</artifactId>
			<version>1.9</version>
		</dependency>

微信退款

退款方法参数根据各位业务逻辑去判断不需要照搬

    /**
     * 微信支付退款
     * @param refundMoney 退款金额
     * @param saleSn 售后单号
     * @param orderSn 订单号
     * @param orderMoney 订单金额
     * @return
     */
    public Result refundWx(BigDecimal refundMoney, String saleSn, String orderSn, BigDecimal orderMoney) {
        WpOrderReturnApplyExample applyExample = new WpOrderReturnApplyExample();
        applyExample.createCriteria().andSaleSnEqualTo(saleSn);

        StringBuffer sb = new StringBuffer() ;
        sb.append("REFUND");
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String date = df.format(new Date());
        sb.append(date);
        String refundNo = sb.toString(); //退款单号

        BigDecimal returnAmount = refundMoney.multiply(new BigDecimal(100));
        Integer refundFee = returnAmount.intValue();
        BigDecimal orderAmount = orderMoney.multiply(new BigDecimal(100));
        Integer orderFee = orderAmount.intValue();

        Map<String, String> params = new HashMap<>();
        params.put("appid", appIdWX);
        params.put("mch_id", merchantIdWX);
//        params.put("transaction_id", transaction_id); // out_trade_no out_trade_no二选一
        params.put("out_trade_no", orderSn);
        params.put("out_refund_no", refundNo);
        params.put("total_fee",orderFee.toString());
        params.put("refund_fee", refundFee.toString());
        params.put("nonce_str", System.currentTimeMillis() + "");
        String sign = PaymentKit.createSign(params, paternerKey);
        params.put("sign", sign);
        logger.info("申请退款参数:{}", PaymentKit.toXml(params));
        //建立连接并发送数据
        String response = refundUtil(params);
        Map<String, String> responseMap = PaymentKit.xmlToMap(response);

        //退款返回标志码
        logger.info("微信支付退款返回结果 ==================> "+responseMap);
        if( responseMap.get("return_code").equals("SUCCESS") &&
                responseMap.get("result_code").equals("SUCCESS")){

            logger.info("微信支付退款成功!");
            return new Result(HttpStatusEnums.SUCCESS);
        } else {
            logger.info("未知错误,微信支付退款失败!");
            return new Result(OrderReturnApplyEnums.REFUND_ERROR);
        }
    }

退款逻辑

    private String refundUtil(Map<String, String> params) {
        HttpsURLConnection conn = null;
        OutputStream out = null;
        InputStream inputStream = null;
        BufferedReader reader = null;
        try {
            KeyStore clientStore = KeyStore.getInstance("PKCS12");
            InputStream instream = PropertiesUtil.class.getResourceAsStream(certPathWX);
            clientStore.load(instream, merchantIdWX.toCharArray());
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(clientStore, merchantIdWX.toCharArray());
            KeyManager[] kms = kmf.getKeyManagers();
            SSLContext sslContext = SSLContext.getInstance("TLSv1");

            sslContext.init(kms, null, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
            URL _url = new URL(PaymentApi.refundUrl);
            conn = (HttpsURLConnection) _url.openConnection();

            conn.setConnectTimeout(25000);
            conn.setReadTimeout(25000);
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setDoInput(true);

            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
            conn.connect();

            out = conn.getOutputStream();
            out.write(PaymentKit.toXml(params).getBytes(Charsets.UTF_8));
            out.flush();

            inputStream = conn.getInputStream();
            reader = new BufferedReader(new InputStreamReader(inputStream, Charsets.UTF_8));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            IOUtils.closeQuietly(out);
            IOUtils.closeQuietly(reader);
            IOUtils.closeQuietly(inputStream);
            if (conn != null) {
                conn.disconnect();
            }
        }
    }

以上就是微信退款的全部代码了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值