微信云支付之退款

前言

上一篇文章,我们介绍了微信云支付的扫码支付实现的大体流程,这篇文章我们将介绍的是退款。

一、 计算签名

我们查看API说明的时候,发现退款的时候,需要传递签名和签名算法,如下图
这里写图片描述

签名生成算法:RSASSA-PSS-2048-SHA256,私钥为服务商在云支付录入商户时,在网页上生成的签名私钥(该私钥只有服务商知道,云支付不知道,请妥善保存


使用java实现计算签名功能(官方API上是C++实现)

    /**
     * 计算SHA256WithRSA签名
     *
     * @param data
     * @param
     * @return
     * @throws Exception
     */
    public static String caculateSignature(String key, String data) throws Exception {
        PrivateKey privateKey = null;
        try {
            byte[] buffer = Base64.getDecoder().decode(key);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec);

        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法");
        } catch (InvalidKeySpecException e) {
            throw new Exception("私钥非法");
        } catch (NullPointerException e) {
            throw new Exception("私钥数据为空");
        }

        Signature signature = Signature.getInstance("SHA256withRSA/PSS", "BC");  //安装bcprov-ext-jdk15on-158.jar

        signature.initSign(privateKey);

        signature.update(data.getBytes(ENCODING));

        return encodeBase64(signature.sign());
    }

    /***
     * encode by Base64
     */
    public static String encodeBase64(byte[] input) throws Exception {
        Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
        Method mainMethod = clazz.getMethod("encode", byte[].class);
        mainMethod.setAccessible(true);
        Object retObj = mainMethod.invoke(null, new Object[]{input});
        return (String) retObj;
    }

拼接请求数据

申请退款API
相关代码如下(其中,代码中传递的订单号,一定是之前付款成功的订单号)

private static void initRefund() {
        RefundRequestContent requestContent = new RefundRequestContent();
        refundAuthenInfo = new SignatureInfo();
        PayMchKey payMchKey = new PayMchKey();
        payMchKey.setPayPlatform(2);
        payMchKey.setOut_mch_id("云支付分配给服务商的帐号");//
        payMchKey.setOut_sub_mch_id("云支付分配给子商户的帐号");
        payMchKey.setOut_shop_id("门店账号");   //在请求门店接口的返回信息中找

        OrderClient orderClient = new OrderClient();
        orderClient.setDevice_id("设备id");//在请求门店接口的返回信息中找
        orderClient.setStaff_id("店员id");//在请求门店接口的返回信息中找
        orderClient.setTerminal_type(2);在请求门店接口的返回信息中找
        orderClient.setSdk_version("SDK");
        orderClient.setSpbill_create_ip("ip地址");

        RefundContent refundContent = new RefundContent();
        refundContent.setOut_trade_no("订单号");    //由客户端生成的订单号,需要退款的订单号,前缀必须是云支付订单前缀
        refundContent.setOut_refund_no("退款单号");//由客户端生成的退款单号,前缀必须是云支付订单前缀
        refundContent.setTotal_fee(Long.parseLong(AmountUtils.changeY2F(0.01 + "")));//单位:分,总金额,当前是举例0.01元
        refundContent.setRefund_fee(Long.parseLong(AmountUtils.changeY2F(0.01 + "")));//单位:分,此次退款金额,当前是举例0.01元
        refundContent.setRefund_fee_type("CNY");


        requestContent.setPay_mch_key(payMchKey);
        requestContent.setPay_content(refundContent);
        requestContent.setOrder_client(orderClient);
        requestContent.setNonce_str("17f827a751761f6f");
        /**
         * 退款的requestContent
         */
        requestContentJson = requestContent.getJson();
        System.out.println("request=="+requestContentJson);
        /**
         * 计算签名
         */
        String str ="您的签名私钥";
        try {
            hashScanCode = CaculateUtil.caculateSignature(str, requestContentJson);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("hashScanCode:"+ hashScanCode);

        /**
         * 认证信息
         */
        Signature signature = new Signature();
        signature.setSign_type(1);
        signature.setSign(hashScanCode);
        refundAuthenInfo.setS(signature);
    }

使用上一节介绍的方法请求微信云支付后台
如果退款成功,得到数据大体如下
这里写图片描述

退款成功后,如果之前是余额支付的,基本上实时到账,如果是银行卡付款,应该是7个工作日到账。
这里写图片描述

OVER

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信支付v3接口退款是指商户在使用微信支付接口完成支付后,需要对订单进行退款操作。在PHP语言中,可以通过以下步骤实现微信支付V3接口退款。 首先,商户需要在微信商户平台上创建退款证书,可以从微信商务平台下载到API证书。 接下来,商户需要使用PHP调用微信支付的v3接口,发送退款请求。可以使用curl库来发送HTTP请求。在请求中,需要设置退款的相关参数,包括商户订单号、退款金额、退款原因、退款结果通知地址等。另外,还需要设置HTTP头部,包括商户证书信息,用于进行身份验证。 然后,商户需要对请求的数据进行签名,并将签名结果作为请求体的一部分。 接下来,使用curl库发送HTTP请求,将请求体和HTTP头部发送给微信支付服务器。 微信支付服务器接收到请求后,对请求进行验证和解析。验证通过后,微信支付服务器会返回退款结果给商户服务器。商户服务器接收到退款结果后,可以根据返回的结果进行相应的处理,如更新订单状态等。 最后,商户服务器需要对返回结果进行处理和存储,以便日后查询和对账。 需要注意的是,商户在使用微信支付v3接口退款时,需要确保请求的安全性,保护商户和客户的信息。在退款时,商户还需要根据微信支付接口文档的要求,处理返回结果,以保证退款操作的准确性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值