Java支付宝异步通知

2022-10-31 16:11:26 浏览数 (1)

准备

Jar包依赖

代码语言:javascript复制
        <!-- AliPay Old -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.12.4.ALL</version>
        </dependency>

方法

支付宝API,异步通知:官方文档 说到这一点,支付宝还是比较实在的,调用API整个过程不花一分钱,而且文档详细,人工服务很好联系,这点微信支付应该学习一下

代码语言:javascript复制
    /**
     * 支付宝异步通知
     * @param request
     * @return
     * @throws Exception
     */
    @PostMapping(value = "aliPayCallBack")
    public String aliPayCallBack(HttpServletRequest request) throws Exception {
        Map<String, String[]> requestParameterMap = request.getParameterMap();
        HashMap<String, Object> map = null;
        //异步验签
        log.info("[支付_支付宝]开始异步验签");
        map = AliPayUtil.asyncSignVerify(requestParameterMap);
        String notice = "fail";
        //验签成功
        if ((boolean) map.get("succ")) {
            log.info("[支付_支付宝]验签成功!");
            //获取支付状态
            LinkedHashMap<String, String> linkedHashMap = (LinkedHashMap<String, String>) map.get("data");
            String trade_status = linkedHashMap.get("trade_status");
            switch (trade_status) {
                //等待买家付款
                case "WAIT_BUYER_PAY":
                    /**todo 业务处理,省略,根据自己需求**/

                    break;
                //未付款交易超时关闭,或支付完成后全额退款。
                case "TRADE_CLOSED":
                    /**todo 业务处理,省略,根据自己需求**/

                    break;
                //交易结束,不可退款。
                case "TRADE_FINISHED":
                    /**todo 业务处理,省略,根据自己需求**/

                    //更新订单完成时间

                    break;
                //交易支付成功。
                case "TRADE_SUCCESS":
                    /**todo 业务处理,省略,根据自己需求**/

                    /**
                    *注意异步通知处理完成后,必须返回给支付宝:success 这几个字符
                    *或者HttpServletResponse输出,详情看官方文档
                    */
                    notice = "success";
                    break;
            }
        } else {
            log.info("[支付_支付宝]验签失败!");
        }
        //默认返回验签失败,支付宝会以一定时间间隔持续通知
        return notice;
    }

工具类/方法

验签方法 AliPayUtil.asyncSignVerify() Jar包依赖,主要是StringUtils这个工具类的

代码语言:javascript复制
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
代码语言:javascript复制
    /**
     * 异步验签
     *
     * @param requestParameterMap
     * @return
     * @throws AlipayApiException
     */
    public static HashMap<String, Object> asyncSignVerify(Map<String, String[]> requestParameterMap) 
            throws AlipayApiException {
        //编码格式,修改成你自己的
        String charset = "utf-8";
        //支付宝公钥,修改成你自己的
        String alipaypublicKey = "支付宝公钥";
        //签名方式,修改成你自己的
        String sign_type = "RSA2";
        //拼接返回内容
        StringBuilder builder = new StringBuilder();
        for (Map.Entry<String, String[]> stringEntry : requestParameterMap.entrySet()) {
            builder.append(stringEntry.getKey()).append("=").
                    append(StringUtils.removeEnd(
                            StringUtils.removeStart(Arrays.toString(
                                    stringEntry.getValue()), "["), "]"))
                    .append("&");
        }
        String resultInfo = StringUtils.removeEnd(builder.toString(), "&");
        log.info("[支付_支付宝]待验签内容:{}", resultInfo);
        //对待签名字符串数据通过&进行拆分
        String[] temp = resultInfo.split("&");
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
        //把拆分数据放在map集合内
        for (int i = 0; i < temp.length; i  ) {
            String[] arr = temp[i].split("=", 2); //通过"="号分割成2个数据
            String[] tempAagin = new String[arr.length]; //再开辟一个数组用来接收分割后的数据
            for (int j = 0; j < arr.length; j  ) {
                tempAagin[j] = arr[j];
            }
            map.put(tempAagin[0], tempAagin[1]);
        }
        boolean flg = AlipaySignature.rsaCheckV1(map, alipaypublicKey, charset, sign_type);
        HashMap<String, Object> objectHashMap = new HashMap<>();
        objectHashMap.put("data", map);
        objectHashMap.put("succ", flg);
        return objectHashMap;
    }

0 人点赞