支付宝api全(支付宝支付(app,h5,js),支付宝订单查询,支付宝退款,支付宝交易退款查询,支付宝提现,支付宝提现查询)

支付宝支付相关代码

①需要在支付宝中签约相关权限
在这里插入图片描述
②配置支付宝公私钥

在这里插入图片描述

此处注意,前端金额单位为分,但支付宝的单位为元,此处是支付宝需要注意的地方
支付宝app支付

			//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
			AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
			//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
            // callbackurl : 支付成功回调地址
            request.setNotifyUrl(callBackUrl);
            //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
            //对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
            model.setBody(payParam.getBody());
            //商品的标题/交易标题/订单标题/订单关键字等。	
            model.setSubject(payParam.getSubject());
            //业务订单号
            model.setOutTradeNo(payParam.getOrderId());
            //设置订单超期时间
            model.setTimeExpire(DateUtil.format(new Date(System.currentTimeMillis() + 1000 * 60 * OutTimeMinute), "yyyy-MM-dd HH:mm:ss"));
            //支付宝金额(单位元)
            model.setTotalAmount(payParam.getTotalAmount().divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString());
            model.setProductCode("QUICK_MSECURITY_PAY");
            log.info("model:{}", JSON.toJSONString(model, true));
            request.setBizModel(model);
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = client.sdkExecute(request);
            log.info("支付宝下单response={}", response.getBody());
            if (response.isSuccess()) {
               //成功后处理的逻辑
            } else {
               //失败时处理的逻辑
            }

支付宝js支付

			//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
			AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
			AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
            // callbackurl : 
            request.setNotifyUrl(callBackUrl);
            AlipayTradeCreateModel model = new AlipayTradeCreateModel();
            model.setBody(payParam.getBody());
            model.setBuyerId(payParam.getBuyerId());
            model.setSubject(payParam.getSubject());
            model.setOutTradeNo(payParam.getOrderId());
            model.setTimeoutExpress(DateUtil.format(DateUtils.addMinutes(new Date(), 10), "yyyy-MM-dd HH:mm:ss"));
            //转化交易金额单位为元
            DecimalFormat df = new DecimalFormat("#0.00");
            model.setTotalAmount(df.format(payParam.getTotalAmount().divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString()));
            request.setBizModel(model);
            log.info("model:{}", JSON.toJSONString(model, true));
            AlipayTradeCreateResponse response = client.pageExecute(request);
            log.info("支付宝下单response={}", response);
             if (response.isSuccess()) {
               //成功后处理的逻辑
            } else {
               //失败时处理的逻辑
            }

支付宝H5支付

			//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
			AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
			//该笔订单允许的最晚付款时间
            //设置请求参数
            String content = "{\"out_trade_no\":\"" + payParam.getOrderId() + "\","
                    + "\"total_amount\":\"" + payParam.getTotalAmount().divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString() + "\","
                    + "\"subject\":\"" + payParam.getSubject() + "\","
                    + "\"timeout_express\":\"" + DateUtil.format(new Date(System.currentTimeMillis() + 1000 * 60 * OutTimeMinute), "yyyy-MM-dd HH:mm:ss") + "\","
                    + "\"body\":\"" + payParam.getBody() + "\","
                    + "\"product_code\":\"" + "QUICK_MSECURITY_PAY" + "\"}";
            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
//            alipayRequest.setReturnUrl(AlipayConfig.return_url);
            alipayRequest.setNotifyUrl(callBackUrl);
            alipayRequest.setBizContent(content);
            //请求
            AlipayTradeWapPayResponse response = client.pageExecute(alipayRequest);
          	log.info("支付宝下单response={}", response);
            if (response.isSuccess()) {
               //成功后处理的逻辑
            } else {
               //失败时处理的逻辑
            }

支付宝订单查询

		log.info("支付宝订单查询queryPayParam={}", queryPayParam);
        //getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
		AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();//创建API对应的request类
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        model.setOutTradeNo(queryPayParam.getOrderId());
        request.setBizModel(model);
        log.info("支付宝第三方查询 : {}", ToStringUtils.getToString(request.getBizModel()));
        AlipayTradeQueryResponse execute = client.execute(request);
        log.info("支付宝订单查询response={}", response);
        if (response.isSuccess()) {
        	PaidStatusEnum paidStatus;
            switch (response.getTradeStatus()) {
                case "TRADE_SUCCESS":
                	//支付成功
                	break;
                case "TRADE_FINISHED":
                    //已支付
                    break;
                case "WAIT_BUYER_PAY":
                    //支付中
                    break;
                case "TRADE_CLOSED":
                    //订单关闭
                    break;
                default:
                    //支付失败
                    break;
            }
        }else{
			//查询失败相关逻辑
		}

支付宝退单退费

		log.info("支付宝订单退费refundParam={}", refundParam);
		=================================(业务逻辑代码start)==================================
        //1.查找支付记录
        OrderPayRecord payRecord = orderPayRecodService.findByOrderId(refundParam.getOrderId());
        ValidateUtil.checkNull(payRecord, ORDER_NOT_FOUND, String.format("不存在订单号:%s", refundParam.getOrderId()));
        ValidateUtil.checkState(payRecord.getAmount().compareTo(refundParam.getRefundFee()) >= 0, ORDER_ALL_REFUNDED,
                String.format("订单号:%s退款金额不能大于付款金额", refundParam.getOrderId()));
        //2.检查是否有重复退款就记录
        int count = orderRefundRecordService.countByRequestNoAndOrderId(refundParam.getOutRequestNo(), refundParam.getOrderId());
        ValidateUtil.checkState(count == 0, REPEAT_REFUND_REQUEST_NO, String.format("存在重复的退款流水:%s", refundParam.getOutRequestNo()));
        //3.init refundRecord modify payRecord
        OrderRefundRecord refundRecord = OrderRefundRecord.build(refundParam);
        refundRecord.setPayWay(PayEnum.PayWayEnum.ALIPAY);//支付宝
        transactionTemplate.execute(transactionStatus -> {
            orderRefundRecordService.save(refundRecord);
            return null;
        });
        =================================(业务逻辑代码end)==================================
        //退费流程
         //getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
		AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        AlipayTradeRefundModel model = new AlipayTradeRefundModel();
        //订单号
        model.setOutTradeNo(refundParam.getOrderId());
        //退费流水号
        model.setOutRequestNo(refundParam.getOutRequestNo());
        //统一传入金额为分
        DecimalFormat df = new DecimalFormat("#0.00");
        //退费金额
        model.setRefundAmount(df.format(refundParam.getRefundFee().divide(BigDecimal.valueOf(100))));
        request.setBizModel(model);
        //request.setNotifyUrl(callBackPrefix + "refund/" + refundParam.getAppId() + ".do"); 这里退款之后会回调支付时填写的地址
        AlipayTradeRefundResponse response = client.execute(request);
        log.info("支付宝订单退费response={}", response);
        if (response.isSuccess()) {
            //保存下返回json,最总结果以回调为准
        } else {
            return new CommonResult().failed("退费失败");
        }

交易退费查询

		log.info("支付宝订单退费查询queryRefundParam={}", queryRefundParam);
        //getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
		AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
        AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
        AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
        //退费流水号
        model.setOutRequestNo(queryRefundParam.getRequestNo());
        //订单号
        model.setOutTradeNo(queryRefundParam.getOrderId());
        request.setBizModel(model);
        AlipayTradeFastpayRefundQueryResponse execute = client.execute(request);
        log.info("支付宝订单退费查询response={}", response);
        if (response.isSuccess()) {
        	//定义的枚举类,详见如下代码块
			RefundStatusEnum refundStatus = RefundStatusEnum.REFUNDED;
            for (RefundRoyaltyResult refundRoyaltyResult : response.getRefundRoyaltys()) {
                if (!"SUCCESS".equals(refundRoyaltyResult.getResultCode())) {
                    refundStatus = RefundStatusEnum.FAILED;
                }
            }
            =============================查询处理逻辑start===================================
            //查询结果与本地不符时,更新本地信息
            if (refundRecord.getStatus() != refundStatus) {
                RefundStatusEnum finalRefundStatus = refundStatus;
                //声明式事务
                transactionTemplate.execute(transactionStatus -> {
                    refundRecord.setStatus(finalRefundStatus);
                    if (finalRefundStatus == RefundStatusEnum.REFUNDED) {
                        mqUtil.sendRefundMsg(refundRecord.getOrderId(), refundRecord.getRequestNo());
                        try {
                            RespBean respBean = tradeCallBackService.tradeRefundNotify(refundRecord);
                            if (respBean.getCode() != 0) {
                                refundRecord.setUpstreamSynStatus(1);
                            }
                        } catch (Exception e) {
                            throw new BizException(AppExceptionEnum.REMOTECALLEXCEPTION, "");
                        }
                        refundRecord.setSynStatus(SynStatusEnum.PUSHED);
                        refundRecord.setRefundTime(new Date());
                        refundRecord.setTradeNo(response.getTradeNo());

                        OrderPayRecord payRecord = orderPayRecodService.findByOrderId(response.getOutTradeNo());
                        BigDecimal originalRefundFee = Objects.isNull(payRecord.getRefundFee()) ? BigDecimal.ZERO :
                                payRecord.getRefundFee();
                        payRecord.setRefundFee(new BigDecimal(response.getRefundAmount()).add(originalRefundFee));
                        orderPayRecodService.update(payRecord);
                    } else {
                        refundRecord.setErrMsg(response.getSubMsg());
                    }
                    orderRefundRecordService.update(refundRecord);
                    return null;
                });
            }
            =============================查询处理逻辑end===================================
		}else{
			//查询失败逻辑
		}

枚举类代码

public enum RefundStatusEnum implements BaseEnum<Integer> {

    REFUNDING(1,"退款中"),
    REFUNDED(2,"已退款"),
    CLOSED(3,"已关闭"),
    FAILED(4,"失败");

    private Integer value;
    private String name;

    RefundStatusEnum(Integer value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public Integer getValue() {
        return value;
    }

    @Override
    public String getName() {
        return name;
    }
}

支付宝提现

①支付宝签约能力
在这里插入图片描述
②支付宝提现加签管理(三个证书)
在这里插入图片描述
在这里插入图片描述

		CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        certAlipayRequest.setServerUrl(aliWiGetway);
        certAlipayRequest.setAppId(aliWiAppid);
        certAlipayRequest.setPrivateKey(aliWiPrivateKey);
        certAlipayRequest.setFormat("json");
        certAlipayRequest.setCharset("GBK");
        certAlipayRequest.setSignType("RSA2");
        certAlipayRequest.setCertPath(new File(aliWiAppCertPublicKey).getAbsolutePath());
        certAlipayRequest.setAlipayPublicCertPath(new File(aliWiAlipayCertPublicKey).getAbsolutePath());
        certAlipayRequest.setRootCertPath(new File(aliWiAlipayRootCert).getAbsolutePath());
		
		DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
            AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
            String str = "";
            //alistr为支付宝授权返回参数,例success=true&result_code=200&app_id=xxxxxxxx&auth_code=02af020d57d643xxxxxxxx646950VC76&scope=kuaijie&alipay_open_id=20880017xxxxxxxx78616971213276&user_id=20887xxxxxx43762&target_id=8753239xxxxxxx5888
            //通过支付宝用户userid提现
            if(StringUtils.isNotBlank(payParam.getAliStr())){
                str = payParam.getAliStr().substring(payParam.getAliStr().indexOf("user_id") + 8);
                str = str.substring(0, str.indexOf("&"));
                request.setBizContent("{" +
                        "\"out_biz_no\":\"" + payParam.getOrderNo() + "\"," +
                        //转账金额 (上游单位为分,转化成元)
                        "\"trans_amount\":" + payParam.getAmount().divide(new BigDecimal(100)) + "," +
                        //单笔无密转账固定为TRANS_ACCOUNT_NO_PWD
                        "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
                        //单笔无密转账固定为DIRECT_TRANSFER
                        "\"biz_scene\":\"DIRECT_TRANSFER\"," +
                        "\"order_title\":\"" + payParam.getNow() + "发起提现申请" + "\"," +
                        "\"payee_info\":{" +
                        //参与方的标识ID,比如支付宝用户UID。
                        "\"identity\":\"" + str + "\"," +
                        //参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID  2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式
                        "\"identity_type\":\"ALIPAY_USER_ID\"," +
                        "    }," +
                        "\"remark\":\"" + "余额提现" + "\"," +
                        "\"business_params\":\"{\\\"sub_biz_scene\\\":\\\"REDPACKET\\\"}\"" +
                        "  }");
            }else {
            	//通过支付宝账号和支付宝实名姓名提现
                request.setBizContent("{" +
                        "\"out_biz_no\":\"" + payParam.getOrderNo() + "\"," +
                        //转账金额 (上游单位为分,转化成元)
                        "\"trans_amount\":" + payParam.getAmount().divide(new BigDecimal(100)) + "," +
                        //单笔无密转账固定为TRANS_ACCOUNT_NO_PWD
                        "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
                        //单笔无密转账固定为DIRECT_TRANSFER
                        "\"biz_scene\":\"DIRECT_TRANSFER\"," +
                        "\"order_title\":\"" + payParam.getNow() + "发起提现申请" + "\"," +
                        "\"payee_info\":{" +
                        //参与方的标识ID,比如支付宝用户UID。
                        "\"identity\":\"" + payParam.getAliAccount() + "\"," +
                        //参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID  2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式
                        "\"identity_type\":\"ALIPAY_LOGON_ID\"," +
                        //参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填。若传入该属性,则在支付宝回单中将会显示这个属性
                        "\"name\":\"" + payParam.getAliRealName() + "\"" +
                        "    }," +
                        "\"remark\":\"" + "余额提现" + "\"," +
                        "\"business_params\":\"{\\\"sub_biz_scene\\\":\\\"REDPACKET\\\"}\"" +
                        "  }");
            }
            AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
            if (response.isSuccess()) {
				//提现成功处理逻辑
			}else{
				//提现失败处理逻辑
			}

支付宝提现查询

		CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        certAlipayRequest.setServerUrl(aliWiGetway);
        certAlipayRequest.setAppId(aliWiAppid);
        certAlipayRequest.setPrivateKey(aliWiPrivateKey);
        certAlipayRequest.setFormat("json");
        certAlipayRequest.setCharset("GBK");
        certAlipayRequest.setSignType("RSA2");
        certAlipayRequest.setCertPath(new File(aliWiAppCertPublicKey).getAbsolutePath());
        certAlipayRequest.setAlipayPublicCertPath(new File(aliWiAlipayCertPublicKey).getAbsolutePath());
        certAlipayRequest.setRootCertPath(new File(aliWiAlipayRootCert).getAbsolutePath());

            DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

            AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();
            if(StringUtils.isNotBlank(param.getOrderId()) && StringUtils.isNotBlank(param.getPayFundOrderId())) {
                request.setBizContent("{" +
                        "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
                        "\"biz_scene\":\"DIRECT_TRANSFER\"," +
                        "\"out_biz_no\":\"" + param.getOrderNo() + "\"," +		//业务订单号
                        "\"order_id\":\"" + param.getOrderId() + "\"," +		//第三方orderId
                        "\"pay_fund_order_id\":\"" + param.getPayFundOrderId() + "\"" +		//第三方pay_fund_order_id
                        "  }");
            }else{
                request.setBizContent("{" +
                        "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
                        "\"biz_scene\":\"DIRECT_TRANSFER\"," +
                        "\"out_biz_no\":\"" + param.getOrderNo() + "\"" +
                        "  }");
            }
            AlipayFundTransCommonQueryResponse response = alipayClient.certificateExecute(request);
            if(response.isSuccess()){
				//提现查询成功逻辑
			}else{
				//提现查询失败逻辑
			}

关注公众号
在这里插入图片描述

每周会更新干货知识

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值