微信云支付之退款

前言

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

一、 计算签名

我们查看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

你好!关于微信小程序开发退款问题,我可以为您提供一些指导。首先,请确保您已经了解微信支付相关的退款规则和流程。 在微信小程序开发中,退款通常涉及到两个方面:用户退款和后台退款。用户退款是指用户通过小程序发起退款申请,而后台退款是指开发者在后台进行退款操作。 对于用户退款,您可以通过微信支付的相关接口实现,具体步骤如下: 1. 用户在小程序中发起退款申请,并提供退款原因等必要信息。 2. 小程序调用微信支付退款接口,将退款请求发送给微信支付后台。 3. 微信支付后台验证退款请求的合法性,并进行退款处理。 4. 微信支付后台将退款结果返回给小程序,小程序根据退款结果进行相应的处理通知用户。 对于后台退款,您可以在小程序的服务端代码中调用微信支付的相关接口实现,具体步骤如下: 1. 在小程序的服务端代码中,构造退款请求参数,包括订单号、退款金额等必要信息。 2. 使用微信支付退款接口发送退款请求。 3. 接收并处理微信支付后台返回的退款结果。 需要注意的是,退款操作需要保证数据的安全性和准确性,建议在实际操作中加入适当的安全措施和数据验证机制。 此外,您还可以参考微信支付官方文档,了解更多关于小程序退款的详细操作步骤和接口使用说明。 希望以上信息能对您有所帮助!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值