前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java支付宝异步通知

Java支付宝异步通知

作者头像
itze
发布2022-10-31 16:11:26
1K0
发布2022-10-31 16:11:26
举报
文章被收录于专栏:IT者

准备

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;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年7月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 方法
  • 工具类/方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档