支付宝手机网站支付、支付查询、退款、退款查询、转账接口整合

         
    /**
     * 二次验签
     */
    public boolean checkSign(HttpServletRequest request, String alipayPublicCertPath) throws AlipayApiException {
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        /**公钥模式验证签名
         * boolean verify_result = AlipaySignature.rsaCheckV1(params, "publicKey", "UTF-8", "RSA2");
         * **/
        /**证书模式验签方法**/
        boolean verify_result = AlipaySignature.rsaCertCheckV1(params, rechargeCommon.downloadCert(alipayPublicCertPath), "UTF-8", "RSA2");
        return verify_result;
    }

    /**
     * 证书模式
     */
    public AlipayClient certAlipayClient(PaySetVO paySetVO) {
        /** 初始化 **/
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        /** 支付宝网关 **/
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
        /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
        certAlipayRequest.setAppId(paySetVO.getAliAppId());
        /** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/
        certAlipayRequest.setPrivateKey(paySetVO.getPrivateKey());
        /** 应用公钥证书路径,下载后保存位置的绝对路径 **/
        certAlipayRequest.setCertPath(rechargeCommon.downloadCert(paySetVO.getAliCertPath()));
        /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
        certAlipayRequest.setAlipayPublicCertPath(rechargeCommon.downloadCert(paySetVO.getAliPublicCertPath()));
        /** 支付宝根证书路径,下载后保存位置的绝对路径 **/
        certAlipayRequest.setRootCertPath(rechargeCommon.downloadCert(paySetVO.getAliRootCertPath()));
        /** 设置签名类型 **/
        certAlipayRequest.setSignType("RSA2");
        /** 设置请求格式,固定值json **/
        certAlipayRequest.setFormat("json");
        /** 设置编码格式 **/
        certAlipayRequest.setCharset("UTF-8");
        AlipayClient alipayClient = null;
        try {
            alipayClient = new DefaultAlipayClient(certAlipayRequest);
        } catch (AlipayApiException e1) {
            e1.printStackTrace();
        }
        return alipayClient;
    }

    /**
     * 公钥模式
     */
    public AlipayClient alipayClient(PaySetVO paySetVO) {
        AlipayClient alipayClient = new
                DefaultAlipayClient("https://openapi.alipay.com/gateway.do", paySetVO.getAliAppId().trim(), paySetVO.getPrivateKey().trim(), "json", "UTF-8",
                paySetVO.getPublicKey().trim(), "RSA2");
        return alipayClient;
    }


    /**
     * 支付宝小程序统一下单
     * 1、在服务端调用  alipay.trade.create (统一收单交易创建接口),获得支付宝交易号 tradeNO
     * 2、 在小程序端使用 tradeNO,调用 my.tradePay 接口唤起支付宝收银台,引导用户完成支付。
     * 3、服务端处理回调信息
     * 详见文档:https://opendocs.alipay.com/mini/00arkf
     */
    public AlipayTradeCreateResponse miniAliPay(PaySetVO paySetVO, String notifyUrl, AlipayTradeCreateModel model) {
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
        /** 后台异步回调地址**/
        request.setNotifyUrl(notifyUrl);
        /** 设置业务参数 **/
        AlipayTradeCreateModel alipayTradeCreateModel = new AlipayTradeCreateModel();
        /** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
        alipayTradeCreateModel.setOutTradeNo(model.getOutTradeNo());
        /** 订单金额,精确到小数点后两位 **/
        alipayTradeCreateModel.setTotalAmount(model.getTotalAmount());
        /** 订单标题 **/
        alipayTradeCreateModel.setSubject(model.getSubject());
        /** 买家唯一id **/
        alipayTradeCreateModel.setBuyerId(model.getBuyerId());
        /** 将业务参数传至request中 **/
        request.setBizModel(alipayTradeCreateModel);
        AlipayTradeCreateResponse response = null;
        try {
            response = alipayClient.certificateExecute(request);
            /**String trade_no = response.getTradeNo();获取返回的tradeNO。**/
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return response;
    }


    /**
     * 统一下单 h5
     * 1、支付信息提交到服务端,服务端生成支付表单 返回到客户端
     * 2、客户端拿到服务端返回from 表单 发起表单提交
     * 3、服务端接收处理回调信息
     * 详见文档 https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay?scene=common
     */
    public AlipayTradeWapPayResponse doAliPay(PaySetVO paySetVO, AlipayTradeWapPayModel alipayTradeWapPayModel, AlipayTradeWapPayRequest alipayTradeWapPayRequest){
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.wap.pay(手机网站支付接口) **/
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
        alipayRequest.setReturnUrl(alipayTradeWapPayRequest.getReturnUrl());
        alipayRequest.setNotifyUrl(alipayTradeWapPayRequest.getNotifyUrl());
        /** 设置业务参数 **/
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
        /** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
        model.setOutTradeNo(alipayTradeWapPayModel.getOutTradeNo());
        /** 销售产品码,固定值:QUICK_WAP_WAY **/
        model.setProductCode("QUICK_WAP_WAY");
        /** 订单标题 **/
        model.setSubject(alipayTradeWapPayModel.getSubject());
        /** 订单金额,精确到小数点后两位 **/
        model.setTotalAmount(alipayTradeWapPayModel.getTotalAmount());
        /** 订单描述 **/
        model.setBody(alipayTradeWapPayModel.getBody());
        /** 业务扩展参数 **/
        //ExtendParams extendParams = new ExtendParams();
        /** 系统商编号,填写服务商的PID,返佣参数传值前提:传值账号需要签约返佣协议,用于isv商户。 **/
        //extendParams.setSysServiceProviderId("2088511****07846");
        /** 花呗参数,传值前提:必须有该接口花呗收款准入条件,且需签约花呗分期 **/
        /** 指定可选期数,只支持3/6/12期,还款期数越长手续费越高 **/
        // extendParams.setHbFqNum("3");
        /** 指定手续费承担方式,手续费可以由用户全承担(该值为0),也可以商户全承担(该值为100),但不可以共同承担,即不可取0和100外的其他值。 **/
        //extendParams.setHbFqSellerPercent("0");
        //model.setExtendParams(extendParams);
        /** 将业务参数传至request中 **/
        alipayRequest.setBizModel(model);
        AlipayTradeWapPayResponse wapPayResponse = null;
        try {
            wapPayResponse = alipayClient.pageExecute(alipayRequest);
            /**获取需提交的form表单 客户端拿到submitFormData做表单提交   String submitFormData = response.getBody();**/
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return wapPayResponse;
        // String form = "";
        // try {
        //     //调用SDK生成表单
        //     form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
        // } catch (AlipayApiException e) {
        //     e.printStackTrace();
        // }
        // //直接将完整的表单html输出到页面
        // response.setContentType("text/html;charset=UTF-8");
        // response.getWriter().write(form);//直接将完整的表单html输出到页面
        // response.getWriter().flush();
        // response.getWriter().close();
    }

 - List item

    /**
     * 订单查询`加粗样式`
     */
    public AlipayTradeQueryResponse queryOrder(PaySetVO paySetVO, AlipayTradeQueryModel alipayTradeQueryModel) {
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.query(统一收单线下交易查询)**/
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        /** 设置业务参数 **/
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        /** 注:交易号(TradeNo)与订单号(OutTradeNo)二选一传入即可,如果2个同时传入,则以交易号为准 **/
        /** 支付接口传入的商户订单号。如:2020061601290011200000140004 **/
        model.setOutTradeNo(alipayTradeQueryModel.getOutTradeNo());
        /** 异步通知/查询接口返回的支付宝交易号,如:2020061622001473951448314322 **/
        model.setTradeNo(alipayTradeQueryModel.getTradeNo());
        /** 将业务参数传至request中 **/
        request.setBizModel(model);
        /**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **/
        //request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");
        AlipayTradeQueryResponse response = null;
        try {
            /** 通过alipayClient调用API,获得对应的response类 **/
            /** 证书模式 **/
            response = alipayClient.certificateExecute(request);
            /** 公钥模式 **/
            //response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return response;
        /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/
    }

    /**
     * 单笔退款
     */
    public AlipayTradeRefundResponse toRefund(PaySetVO paySetVO, AlipayTradeRefundModel alipayTradeRefundModel) {
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.refund(统一收单交易退款接口) **/
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        /** 设置业务参数 **/
        AlipayTradeRefundModel model = new AlipayTradeRefundModel();
        /** 支付接口传入的商户订单号。如:2020061601290011200000140004  交易号二选一 **/
        model.setOutTradeNo(alipayTradeRefundModel.getOutTradeNo());
        /** 退款金额,退款总金额不能大于该笔订单支付最大金额 **/
        model.setRefundAmount(alipayTradeRefundModel.getRefundAmount());
        /** 异步通知/查询接口返回的支付宝交易号,如:2020061622001473951448314322 商户订单号二选一 **/
        model.setTradeNo(alipayTradeRefundModel.getTradeNo());
        /** 如需部分退款,则此参数必传,且每次请求不能重复,如:202006230001 **/
        model.setOutRequestNo(WxCommonUtil.getSerialNumber());
        /** 将业务参数传至request中 **/
        request.setBizModel(model);
        /**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **/
        //request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");
        AlipayTradeRefundResponse response = null;
        try {
            /** 通过alipayClient调用API,获得对应的response类 **/
            /** 证书模式 **/
            response = alipayClient.certificateExecute(request);
            /** 公钥模式 **/
            //response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/
        return response;
    }

    /**
     * 退款查询
     */
    public AlipayTradeFastpayRefundQueryResponse queryRefund(PaySetVO paySetVO, AlipayTradeFastpayRefundQueryModel alipayTradeFastpayRefundQueryModel) throws AlipayApiException {
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
        AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
        /** 交易单号 和商户单号二选一**/
        model.setTradeNo(alipayTradeFastpayRefundQueryModel.getTradeNo());
        /**
         * 退款时的流水号
         * 请求退款接口时,传入的退款请求号,
         * 如果在退款请求时未传入,则该值为创建交易时的外部交易号
         * **/
        model.setOutRequestNo(alipayTradeFastpayRefundQueryModel.getOutRequestNo());
        /** 商户单号 和交易单号二选一**/
        model.setOutTradeNo(alipayTradeFastpayRefundQueryModel.getOutTradeNo());
        /** 将业务参数传至request中 **/
        request.setBizModel(model);
        AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
        try {
            /** 证书模式 **/
            response = alipayClient.certificateExecute(request);
            /** 公钥模式 **/
            //response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/
        return response;
    }


    /**
     * 单笔转账
     */
    public AlipayFundTransUniTransferResponse transfer(PaySetVO paySetVO, AlipayFundTransUniTransferModel alipayFundTransUniTransferModel, Participant payee) {
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.uni.transfer(单笔转账接口) **/
        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
        /** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/
        AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
        /** 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 **/
        model.setOutBizNo(alipayFundTransUniTransferModel.getOutBizNo());
        /** 转账金额,TRANS_ACCOUNT_NO_PWD产品取值最低0.1 **/
        model.setTransAmount(alipayFundTransUniTransferModel.getTransAmount());
        /** 产品码,单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD **/
        model.setProductCode("TRANS_ACCOUNT_NO_PWD");
        /** 场景码,单笔无密转账到支付宝账户固定为:DIRECT_TRANSFER **/
        model.setBizScene("DIRECT_TRANSFER");
        /**备注**/
        model.setRemark(alipayFundTransUniTransferModel.getRemark());
        /** 转账业务的标题,用于在支付宝用户的账单里显示 **/
        model.setOrderTitle(alipayFundTransUniTransferModel.getOrderTitle());
        Participant participant = new Participant();
        /** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/
        participant.setIdentity(payee.getIdentity());
        /** 参与方的标识类型:ALIPAY_USER_ID 支付宝的会员ID **/
        participant.setIdentityType(payee.getIdentityType());
        /** 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填 **/
        participant.setName(payee.getName());
        model.setPayeeInfo(participant);
        /** 业务备注 **/
        model.setRemark("单笔转账");
        /** 将业务参数传至request中 **/
        request.setBizModel(model);
        AlipayFundTransUniTransferResponse response = null;
        try {
            /** 证书模式 **/
            response = alipayClient.certificateExecute(request);
            /** 公钥模式 **/
            //response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/
        return response;
    }


    /**
     * 转账查询
     */
    public AlipayFundTransCommonQueryResponse queryTransfer(PaySetVO paySetVO, AlipayFundTransCommonQueryModel alipayFundTransCommonQueryModel) throws AlipayApiException {
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.common.query(转账业务单据查询接口) **/
        AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();
        /** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.common.query/ **/
        AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel();
        /** 固定值:TRANS_ACCOUNT_NO_PWD:单笔无密转账到支付宝账户 **/
        model.setProductCode("TRANS_ACCOUNT_NO_PWD");
        /** 支付宝转账单据号,单笔转账接口返回 **/
        model.setOrderId(alipayFundTransCommonQueryModel.getOrderId());
        /** 描述特定的业务场景,如果传递了out_biz_no则该字段为必传,固定值:DIRECT_TRANSFER:B2C 现金红包、单笔无密转账 **/
        model.setBizScene("DIRECT_TRANSFER");
        /** 商户转账唯一订单号,单笔转账接口的入参 **/
        model.setOutBizNo(alipayFundTransCommonQueryModel.getOutBizNo());
        request.setBizModel(model);
        AlipayFundTransCommonQueryResponse response = null;
        try {
            /** 证书模式 **/
            response = alipayClient.certificateExecute(request);
            /** 公钥模式 **/
            //response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/
        return response;
    }

    /**
     * 查询用户是否已经关注生活号,支持生活号、内容号、财富号
     * {
     * "alipay_open_public_user_follow_query_response": {
     * "code": "10000",
     * "msg": "Success",
     * "is_follow": "T"
     * },
     * "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
     * }
     * 用户是否关注,T代表已关注,F代表未关注
     */
    public AlipayOpenPublicUserFollowQueryResponse queryFollowByOne(PaySetVO paySetVO, String aliUserId) {
        AlipayClient alipayClient = certAlipayClient(paySetVO);
        AlipayOpenPublicUserFollowQueryRequest request = new AlipayOpenPublicUserFollowQueryRequest();
        AlipayOpenPublicUserFollowQueryModel model = new AlipayOpenPublicUserFollowQueryModel();
        model.setUserId(aliUserId);
        request.setBizModel(model);
        AlipayOpenPublicUserFollowQueryResponse response = null;
        try {
            response = alipayClient.certificateExecute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return response;
    }

 -----------------------------------调用demo-----------------------------------------
  /**
     * 支付宝支付
     *
     * @param httpResponse,sellerId
     * @return
     */
    @GetMapping("/pay")
    @ApiOperation("统一下单")
    public void getPagePay(HttpServletResponse httpResponse, Integer sellerId) throws Exception {
        PaySetVO paySetVO = paySetService.findAll(sellerId);
        AlipayTradeWapPayModel wapPayModel = new AlipayTradeWapPayModel();
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
        alipayRequest.setReturnUrl(wxApiConfig.getInterfacePath() + "alipay/callbackWeb");
        alipayRequest.setNotifyUrl(wxApiConfig.getInterfacePath() + "alipay/callback");
        String orderNum = WxCommonUtil.getTimeOrderNum();
        wapPayModel.setOutTradeNo(orderNum);
        wapPayModel.setBody("商品名称");
        wapPayModel.setSubject("//商品标题/交易标题/订单标题/订单关键字等");
        wapPayModel.setTotalAmount("0.01");
        AlipayTradeWapPayResponse response= alipayApi.doAliPay(paySetVO, wapPayModel, alipayRequest);
        response.getBody(); //返回到前端提交表单即可
    }


    /**
     * 支付宝后台回调
     *
     * @param
     * @return
     */
    @PostMapping(value = "/callback")
    public void alipayNotify(HttpServletRequest request, HttpServletResponse respons) throws Exception {
        //商户订单号
        String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
        //支付宝交易号
        String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
        //交易状态
        String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
        log.info("-------out_trade_no-------" + out_trade_no);
        log.info("-------trade_no-------" + trade_no);
        PaySetVO paySetVO = paySetService.findAll(2);
        if (alipayApi.checkSign(request, paySetVO.getAliPublicCertPath())) {//验证成功
            //请在这里加上商户的业务逻辑程序代码
            if (trade_status.equals("TRADE_FINISHED")) {
                log.info("-------支付宝回调成功-------");
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序
                //注意:
                //如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                //如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
            } else if (trade_status.equals("TRADE_SUCCESS")) {
                log.info("-------支付宝回调成功-------");
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序
                //注意:
                //如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
            }
            respons.getWriter().println("success");
        } else {//验证失败
            respons.getWriter().println("failure");
        }
    }


    /**
     * 支付宝前台回调 也可以直接在retrun_url 配置成功页面地址
     *
     * @param request
     * @return
     */
    @GetMapping(value = "/callbackWeb")
    public String callbackWeb(HttpServletRequest request) throws Exception {
        //商户订单号
        String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
        //支付宝交易号
        String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
        PaySetVO paySetVO = paySetService.findAll(2);
        if (alipayApi.checkSign(request, paySetVO.getAliPublicCertPath())) {//验证成功
            //请在这里加上商户的业务逻辑程序代码
            //该页面可做页面美工编辑
            // out.clear();
            // out.println("验证成功<br />");
            log.info("-------支付宝前台回调成功-------");
            return "交易成功";
        } else {
            //该页面可做页面美工编辑
            // out.clear();
            // out.println("验证失败");
            log.info("-------支付宝前台回调失败-------");
            return "交易失败";
        }


    }


    /**
     * 交易查询
     * 商家可调用 alipay.trade.query(统一收单线下交易查询)接口,通过商户网站唯一订单号
     * out_trade_no 或支付宝交易号 trade_no 查询对应订单支付情况
     *
     * @param out_trade_no or trade_no (二选一)
     */
    @GetMapping("/queryOrder")
    @ApiOperation("交易查询")
    public AlipayTradeQueryResponse queryOrder(Integer sellerId, String out_trade_no) {
        PaySetVO paySetVO = paySetService.findAll(sellerId);
        AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel();
        alipayTradeQueryModel.setOutTradeNo(out_trade_no);//订单号
        AlipayTradeQueryResponse response = alipayApi.queryOrder(paySetVO, alipayTradeQueryModel);
        if (response.isSuccess()) {
            log.info("---查询成功----");
            response.getTotalAmount();//交易的订单金额,单位为元,两位小数。该参数的值为支付时传入的total_amount
            response.getOutTradeNo();//商家订单号
            response.getTradeNo();//支付宝交易号
            //  交易状态:WAIT_BUYER_PAY
            // (交易创建,等待买家付款)、TRADE_CLOSED
            //  (未付款交易超时关闭,或支付完成后全额退款)
            //  、TRADE_SUCCESS(交易支付成功)
            //  、TRADE_FINISHED(交易结束,不可退款)
            String trade_status = response.getTradeStatus();
        } else {
            String sub_code = response.getSubCode();//错误码
            String sub_msg = response.getSubMsg();//错误码描述
        }
        return response;
    }


    /**
     * 退款的途径按照支付途径原路返回;
     * 支付渠道为花呗、余额等退款即时到账;
     * 银行卡的退款时间以银行退款时间为准,一般情况下 2 小时内可到账;
     * 开发者也可以在商家中心(b.alipay.com)中退款;
     * 退款是否成功可以根据同步响应的 fund_change 参数来判断,返回值为 Y 则表示退款成功;
     * 退款接口会根据外部请求号 out_request_no 幂等返回,因此同一笔交易需要多次部分退款时,必须使用不同的 out_request_no
     * aphttps://opendocs.alipay.com/apis/api_1/alipay.trade.refund
     *
     * @param out_trade_no or trade_no (二选一)
     *                     out_request_no,refund_amount
     */
    @GetMapping("/refund")
    @ApiOperation("订单退款")
    public AlipayTradeRefundResponse refund(Integer sellerId, String out_trade_no, String refund_amount) throws AlipayApiException {
        PaySetVO paySetVO = paySetService.findAll(sellerId);
        AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel();
        alipayTradeRefundModel.setRefundAmount(refund_amount);//退款金额
        alipayTradeRefundModel.setOutTradeNo(out_trade_no);//订单号
        AlipayTradeRefundResponse response = alipayApi.toRefund(paySetVO, alipayTradeRefundModel);
        if (response.isSuccess() && response.getFundChange().equals("Y")) {
            log.info("---退款成功----" + response);
            //退款成功
            response.getOutTradeNo();//退款商户单号
            response.getTradeNo();//退款交易单号
            response.getRefundFee();//退款总金额
            response.getGmtRefundPay();//退款时间 Date类型
        } else {
            //退款异常
            String sub_code = response.getSubCode();//错误码
            String sub_msg = response.getSubMsg();//错误描述
        }
        return response;
    }


    /**
     * 退款订单查询
     *
     * @param sellerId alipayTradeFastpayRefundQueryModel
     * @return
     */
    @GetMapping("/queryRefund")
    @ApiOperation("订单退款查询")
    public AlipayTradeFastpayRefundQueryResponse queryRefund(Integer sellerId, AlipayTradeFastpayRefundQueryModel alipayTradeFastpayRefundQueryModel) throws AlipayApiException {
        PaySetVO paySetVO = paySetService.findAll(sellerId);
        AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
        /** 交易单号 和商户单号二选一**/
        model.setTradeNo(alipayTradeFastpayRefundQueryModel.getTradeNo());
        /**
         * 退款时的流水号
         * 请求退款接口时,传入的退款请求号,
         * 如果在退款请求时未传入,则该值为创建交易时的外部交易号
         * **/
        model.setOutRequestNo(alipayTradeFastpayRefundQueryModel.getOutRequestNo());
        /** 商户单号 和交易单号二选一**/
        model.setOutTradeNo(alipayTradeFastpayRefundQueryModel.getOutTradeNo());
        AlipayTradeFastpayRefundQueryResponse response = alipayApi.queryRefund(paySetVO, model);
        if (response.isSuccess()) {
            response.getTotalAmount();//该笔退款所对应的交易的订单金额
            response.getRefundAmount();//本次退款请求,对应的退款金额
            response.getOutTradeNo();//创建交易传入的商户订单号
            response.getTradeNo();//支付宝交易号
            response.getRefundReason();//退款原因
            log.info("---退款成功---" + response);
        } else {
            //查询失败
            response.getSubCode();//错误码码
            response.getSubMsg();//错误描述
        }
        log.info("----订单退款查询结果---" + response);
        return response;
    }

    /**
     * 转账到余额
     *
     * @param sellerId
     * @retrun
     */
    @GetMapping("/transfer")
    @ApiOperation("转账到余额")
    public void transfer(Integer sellerId) throws AlipayApiException {
        PaySetVO paySetVO = paySetService.findAll(sellerId);
        AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
        //商户自定义的唯一订单号
        model.setOutBizNo(WxCommonUtil.getTimeOrderNum());
        //订单总金额,单位为元,精确到小数点后两位
        model.setTransAmount("0.01");
        //转账业务的标题,用于在支付宝用户的账单里显示 (选填)
        model.setOrderTitle("测试转账");
        //业务备注 (选填)
        model.setRemark("测试转账");
        //收款方账户(必填)
        Participant payee = new Participant();
        //参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID
        // 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式 (必填)
        payee.setIdentityType("ALIPAY_USER_ID");
        //参与方的标识ID,比如支付宝用户UID。 (必填)
        payee.setIdentity("2088612545861215");
        AlipayFundTransUniTransferResponse response = alipayApi.transfer(paySetVO, model, payee);
        if (response.isSuccess() && response.getStatus().equals("SUCCESS")) {
            log.info("----测试转账成功------");
        } else {
            log.info("----测试转账失败 重新查单------");
            String outBizNo = response.getOutBizNo();//商户订单号
            String orderId = response.getOrder
Id();//支付宝转账订单号
            //调用查询接口查询数据
            AlipayFundTransCommonQueryModel queryModel = new AlipayFundTransCommonQueryModel();
            queryModel.setOutBizNo(outBizNo); //商户订单号
            queryModel.setOrderId(orderId);
            AlipayFundTransCommonQueryResponse queryResponse = alipayApi.queryTransfer(paySetVO, queryModel);
            if (response.isSuccess() && response.getStatus().equals("SUCCESS")) {
                log.info("----查询转账订单---转账成功" + queryResponse);
            } else {
                log.info("----查询转账订单---转账失败" + queryResponse);
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值