package cn.stylefeng.rest.ijpay.controller; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.StrUtil; import cn.stylefeng.guns.modular.business.dto.request.OrderPayRequest; import cn.stylefeng.guns.modular.business.entity.CounsellingOrder; import cn.stylefeng.guns.modular.business.entity.CourseOrder; import cn.stylefeng.guns.modular.business.entity.OrderConsultOne; import cn.stylefeng.guns.modular.business.entity.OrderMentalTest; import cn.stylefeng.guns.modular.business.service.ICounsellingOrderService; import cn.stylefeng.guns.modular.business.service.ICourseOrderService; import cn.stylefeng.guns.modular.business.service.IOrderConsultOneService; import cn.stylefeng.guns.modular.business.service.IOrderMentalTestService; import cn.stylefeng.guns.utils.GeneralUtil; import cn.stylefeng.rest.ijpay.entity.AliPayBean; import cn.stylefeng.rest.ijpay.entity.IosDto; import cn.stylefeng.rest.ijpay.entity.request.AliAppPayRequest; import cn.stylefeng.rest.ijpay.iosUtil.IosPalUtils; import cn.stylefeng.rest.modular.order.service.MentalTestOrderBizService; import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; import cn.stylefeng.roses.kernel.rule.enums.OrderStatusFlagEnum; import cn.stylefeng.roses.kernel.rule.enums.OrderTypeEnum; import cn.stylefeng.roses.kernel.rule.enums.PayTypeEnum; import cn.stylefeng.roses.kernel.rule.pojo.response.ErrorResponseData; import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData; import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.*; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.response.AlipayFundAuthOrderFreezeResponse; import com.alipay.api.response.AlipayFundCouponOrderAgreementPayResponse; import com.alipay.api.response.AlipayTradeCreateResponse; import com.alipay.api.response.AlipayTradeRefundResponse; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ijpay.alipay.AliPayApi; import com.ijpay.alipay.AliPayApiConfig; import com.ijpay.alipay.AliPayApiConfigKit; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.Map; @Slf4j @Controller @Api(tags = "支付接口") @RequestMapping("/aliPay") public class AliPayController { @Resource AliPayBean aliPayBean; @Resource IOrderMentalTestService orderMentalTestService; @Resource IOrderConsultOneService orderConsultOneService; @Resource MentalTestOrderBizService mentalTestOrderBizService; @Resource ICourseOrderService courseOrderService; @Resource ICounsellingOrderService counsellingOrderService; // 普通公钥模式 private final static String NOTIFY_URL = "/aliPay" + RuleConstants.NOT_LOGIN + "/notify_url"; private final static String RETURN_URL = "/aliPay" + RuleConstants.NOT_LOGIN + "/return_url"; /** * app支付 */ @ApiOperation(value = "支付宝APP支付") @PostMapping(value = "/appPay") @ResponseBody public ResponseData appPay(@RequestBody @Validated AliAppPayRequest req) { // 支付金额 String totalAmount = ""; // 订单编号判断订单类型 if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) { // 心理测试订单 OrderMentalTest order = orderMentalTestService.getOrderByNo(req.getOrderNo()); totalAmount = order.getPayAmount().toString(); } else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) { // 心理咨询1V1订单 OrderConsultOne order = orderConsultOneService.getOrderByNo(req.getOrderNo()); totalAmount = order.getPayAmount().toString(); }else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())){ CourseOrder courseOrder = this.courseOrderService.getCourseOrderByNo(req.getOrderNo()); totalAmount = courseOrder.getPayAmount().toString(); } else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { CounsellingOrder counsellingOrder = this.counsellingOrderService.getCounsellingOrderByNo(req.getOrderNo()); totalAmount = counsellingOrder.getPayAmount().toString(); } // 判断支付金额是否为0 BigDecimal amount = new BigDecimal(totalAmount); // 判断转换后的BigDecimal是否为0 if (amount.compareTo(BigDecimal.ZERO) == 0) { if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) { // 心理测试订单 orderMentalTestService.paySuccess(req.getOrderNo(), req.getOrderNo(), totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) { // 心理咨询1V1订单 mentalTestOrderBizService.paySuccessOrderConsultOne(req.getOrderNo(), req.getOrderNo(), totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) { //课程订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(req.getOrderNo()); orderPayRequest.setTransactionNo(req.getOrderNo()); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(1); courseOrderService.payCourseOrder(orderPayRequest); } else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { //咨询订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(req.getOrderNo()); orderPayRequest.setTransactionNo(req.getOrderNo()); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(2); counsellingOrderService.payCounsellingOrder(orderPayRequest); } return new SuccessResponseData("支付成功"); } try { // 设置支付配置 AliPayApiConfigKit.putApiConfig(getApiConfig()); //AliPayApiConfigKit.setThreadLocalAppId(aliPayBean.getAppId()); //AliPayApiConfigKit.setThreadLocalAliPayApiConfig(getApiConfig()); // 设置支付参数 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(req.getSubject()); model.setSubject(req.getSubject()); //model.setOutTradeNo(UUID.randomUUID().toString(true)); model.setOutTradeNo(req.getOrderNo()); model.setTotalAmount(totalAmount); model.setTimeoutExpress("30m"); model.setPassbackParams("callback params"); model.setProductCode("QUICK_MSECURITY_PAY"); String orderInfo = AliPayApi.appPayToResponse(model, aliPayBean.getDomain() + NOTIFY_URL).getBody(); log.info("支付宝APP支付返回参数:{}", orderInfo); return new SuccessResponseData(orderInfo); } catch (AlipayApiException e) { e.printStackTrace(); log.error("支付宝APP支付异常!", e.getMessage()); return new ErrorResponseData("500", e.getMessage()); } } @ApiOperation(value = "ios支付") @PostMapping(value = "/ios") @ResponseBody public ResponseData ios(@RequestBody IosDto iosDto) { // Boolean success = IosPalUtils.isSuccess(iosDto.getTransactionReceipt()); // if (!success){ // return new ErrorResponseData("支付失败"); // } String tradeNo = iosDto.getOrderNo(); String totalAmount = iosDto.getMoney(); // 获取订单号 // 订单编号判断订单类型 if (iosDto.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) { // 心理测试订单 orderMentalTestService.paySuccess(iosDto.getOrderNo(), tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (iosDto.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) { // 心理咨询1V1订单 mentalTestOrderBizService.paySuccessOrderConsultOne(iosDto.getOrderNo(), tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (iosDto.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) { //课程订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(iosDto.getOrderNo()); orderPayRequest.setTransactionNo(tradeNo); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(1); courseOrderService.payCourseOrder(orderPayRequest); } else if (iosDto.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { //咨询订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(iosDto.getOrderNo()); orderPayRequest.setTransactionNo(tradeNo); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(2); counsellingOrderService.payCounsellingOrder(orderPayRequest); } return new SuccessResponseData("支付成功"); } @PostMapping(value = RuleConstants.NOT_LOGIN + "/freePay") @ResponseBody public String freePay(HttpServletRequest request) { try { log.info("支付宝异步通知"); // 获取支付宝POST过来反馈信息 Map params = AliPayApi.toMap(request); for (Map.Entry entry : params.entrySet()) { log.info(entry.getKey() + " = " + entry.getValue()); } if (params.get("out_biz_no") != null){ log.info(params.get("out_biz_no").toString()+",退费成功!"); return "success"; } boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2"); if (verifyResult) { // 参数文档:https://opendocs.alipay.com/open/204/105301?pathHash=fef00e6d String tradeNo = params.get("trade_no"); String totalAmount = params.get("total_amount"); // 获取订单号 String orderNo = params.get("out_trade_no"); // 订单编号判断订单类型 if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) { // 心理测试订单 orderMentalTestService.paySuccess(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (orderNo.startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) { // 心理咨询1V1订单 mentalTestOrderBizService.paySuccessOrderConsultOne(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (orderNo.startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) { //课程订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(orderNo); orderPayRequest.setTransactionNo(tradeNo); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(1); courseOrderService.payCourseOrder(orderPayRequest); } else if (orderNo.startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { //咨询订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(orderNo); orderPayRequest.setTransactionNo(tradeNo); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(2); counsellingOrderService.payCounsellingOrder(orderPayRequest); } log.info("notify_url 验证成功succcess"); return "success"; } else { log.error("notify_url 验证失败"); return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); return "failure"; } } @RequestMapping(value = RuleConstants.NOT_LOGIN + "/notify_url", method = {RequestMethod.POST, RequestMethod.GET}) @ResponseBody public String notifyUrl(HttpServletRequest request) { try { log.info("支付宝异步通知"); // 获取支付宝POST过来反馈信息 Map params = AliPayApi.toMap(request); for (Map.Entry entry : params.entrySet()) { log.info(entry.getKey() + " = " + entry.getValue()); } if (params.get("out_biz_no") != null){ log.info(params.get("out_biz_no").toString()+",退费成功!"); return "success"; } boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2"); if (verifyResult) { // 参数文档:https://opendocs.alipay.com/open/204/105301?pathHash=fef00e6d String tradeNo = params.get("trade_no"); String totalAmount = params.get("total_amount"); // 获取订单号 String orderNo = params.get("out_trade_no"); // 订单编号判断订单类型 if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) { // 心理测试订单 orderMentalTestService.paySuccess(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (orderNo.startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) { // 心理咨询1V1订单 mentalTestOrderBizService.paySuccessOrderConsultOne(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode()); } else if (orderNo.startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) { //课程订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(orderNo); orderPayRequest.setTransactionNo(tradeNo); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(1); courseOrderService.payCourseOrder(orderPayRequest); } else if (orderNo.startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { //咨询订单 OrderPayRequest orderPayRequest = new OrderPayRequest(); orderPayRequest.setOrderNo(orderNo); orderPayRequest.setTransactionNo(tradeNo); orderPayRequest.setPayType("2"); orderPayRequest.setOrderType(2); counsellingOrderService.payCounsellingOrder(orderPayRequest); } log.info("notify_url 验证成功succcess"); return "success"; } else { log.error("notify_url 验证失败"); return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); return "failure"; } } /** * 获取Api配置 * @return */ public AliPayApiConfig getApiConfig() { AliPayApiConfig aliPayApiConfig; try { aliPayApiConfig = AliPayApiConfigKit.getApiConfig(aliPayBean.getAppId()); } catch (Exception e) { aliPayApiConfig = AliPayApiConfig.builder() .setAppId(aliPayBean.getAppId()) .setAliPayPublicKey(aliPayBean.getPublicKey()) .setAppCertPath(aliPayBean.getAppCertPath()) .setAliPayCertPath(aliPayBean.getAliPayCertPath()) .setAliPayRootCertPath(aliPayBean.getAliPayRootCertPath()) .setCharset("UTF-8") .setPrivateKey(aliPayBean.getPrivateKey()) .setServiceUrl(aliPayBean.getServerUrl()) .setSignType("RSA2") .build(); // 普通公钥模式 } return aliPayApiConfig; } @RequestMapping(value = "/wapPay") @ResponseBody public void wapPay(HttpServletResponse response) { String body = "我是测试数据-By Javen"; String subject = "Javen Wap支付测试"; String totalAmount = "1"; String passBackParams = "1"; String returnUrl = aliPayBean.getDomain() + RETURN_URL; String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL; AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); model.setBody(body); model.setSubject(subject); model.setTotalAmount(totalAmount); model.setPassbackParams(passBackParams); String outTradeNo = UUID.randomUUID().toString(true); System.out.println("wap outTradeNo>" + outTradeNo); model.setOutTradeNo(outTradeNo); model.setProductCode("QUICK_WAP_PAY"); try { AliPayApi.wapPay(response, model, returnUrl, notifyUrl); } catch (Exception e) { e.printStackTrace(); } } /** * PC支付 */ @RequestMapping(value = "/pcPay") @ResponseBody public void pcPay(HttpServletResponse response) { try { String totalAmount = "88.88"; String outTradeNo = UUID.randomUUID().toString(true); log.info("pc outTradeNo>" + outTradeNo); String returnUrl = aliPayBean.getDomain() + RETURN_URL; String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL; AlipayTradePagePayModel model = new AlipayTradePagePayModel(); model.setOutTradeNo(outTradeNo); model.setProductCode("FAST_INSTANT_TRADE_PAY"); model.setTotalAmount(totalAmount); model.setSubject("Javen PC支付测试"); model.setBody("Javen IJPay PC支付测试"); model.setPassbackParams("passback_params"); /** * 花呗分期相关的设置,测试环境不支持花呗分期的测试 * hb_fq_num代表花呗分期数,仅支持传入3、6、12,其他期数暂不支持,传入会报错; * hb_fq_seller_percent代表卖家承担收费比例,商家承担手续费传入100,用户承担手续费传入0,仅支持传入100、0两种,其他比例暂不支持,传入会报错。 */ // ExtendParams extendParams = new ExtendParams(); // extendParams.setHbFqNum("3"); // extendParams.setHbFqSellerPercent("0"); // model.setExtendParams(extendParams); AliPayApi.tradePage(response, model, notifyUrl, returnUrl); // https://opensupport.alipay.com/support/helpcenter/192/201602488772?ant_source=antsupport // Alipay Easy SDK(新版)目前只支持输出form表单,不支持打印出url链接。 // AliPayApi.tradePage(response, "GET", model, notifyUrl, returnUrl); } catch (Exception e) { e.printStackTrace(); } } @RequestMapping(value = "/tradePay") @ResponseBody public String tradePay(@RequestParam("authCode") String authCode, @RequestParam("scene") String scene) { String subject = null; String waveCode = "wave_code"; String barCode = "bar_code"; if (scene.equals(waveCode)) { subject = "Javen 支付宝声波支付测试"; } else if (scene.equals(barCode)) { subject = "Javen 支付宝条形码支付测试"; } String totalAmount = "100"; String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL; AlipayTradePayModel model = new AlipayTradePayModel(); model.setAuthCode(authCode); model.setSubject(subject); model.setTotalAmount(totalAmount); model.setOutTradeNo(UUID.randomUUID().toString(true)); model.setScene(scene); try { return AliPayApi.tradePayToResponse(model, notifyUrl).getBody(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 扫码支付 */ @RequestMapping(value = "/tradePreCreatePay") @ResponseBody public String tradePreCreatePay() { String subject = "Javen 支付宝扫码支付测试"; String totalAmount = "86"; String storeId = "123"; // String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL; String notifyUrl = aliPayBean.getDomain() + "/aliPay/cert_notify_url"; AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); model.setSubject(subject); model.setTotalAmount(totalAmount); model.setStoreId(storeId); model.setTimeoutExpress("5m"); model.setOutTradeNo(UUID.randomUUID().toString(true)); try { String resultStr = AliPayApi.tradePrecreatePayToResponse(model, notifyUrl).getBody(); JSONObject jsonObject = JSONObject.parseObject(resultStr); return jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code"); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 单笔转账到支付宝账户 * https://docs.open.alipay.com/309/106235/ */ @RequestMapping(value = "/transfer") @ResponseBody public String transfer() { String totalAmount = "66"; AlipayFundTransToaccountTransferModel model = new AlipayFundTransToaccountTransferModel(); model.setOutBizNo(UUID.randomUUID().toString(true)); model.setPayeeType("ALIPAY_LOGONID"); model.setPayeeAccount("gxthqd7606@sandbox.com"); model.setAmount(totalAmount); model.setPayerShowName("测试退款"); model.setPayerRealName("沙箱环境"); model.setRemark("javen测试单笔转账到支付宝"); try { return AliPayApi.transferToResponse(model).getBody(); } catch (Exception e) { e.printStackTrace(); } return null; } @RequestMapping(value = "/transferQuery") @ResponseBody public String transferQuery(@RequestParam(required = false, name = "outBizNo") String outBizNo, @RequestParam(required = false, name = "orderId") String orderId) { AlipayFundTransOrderQueryModel model = new AlipayFundTransOrderQueryModel(); if (StrUtil.isNotEmpty(outBizNo)) { model.setOutBizNo(outBizNo); } if (StrUtil.isNotEmpty(orderId)) { model.setOrderId(orderId); } try { return AliPayApi.transferQueryToResponse(model).getBody(); } catch (Exception e) { e.printStackTrace(); } return null; } @RequestMapping(value = "/uniTransfer") @ResponseBody public String uniTransfer() { String totalAmount = "1"; AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); model.setOutBizNo(UUID.randomUUID().toString(true)); model.setTransAmount(totalAmount); model.setProductCode("TRANS_ACCOUNT_NO_PWD"); model.setBizScene("DIRECT_TRANSFER"); model.setOrderTitle("统一转账-转账至支付宝账户"); model.setRemark("IJPay 测试统一转账"); Participant payeeInfo = new Participant(); payeeInfo.setIdentity("gxthqd7606@sandbox.com"); payeeInfo.setIdentityType("ALIPAY_LOGON_ID"); payeeInfo.setName("沙箱环境"); model.setPayeeInfo(payeeInfo); try { return AliPayApi.uniTransferToResponse(model, null).getBody(); } catch (Exception e) { e.printStackTrace(); } return null; } @RequestMapping(value = "/uniTransferQuery") @ResponseBody public String uniTransferQuery(@RequestParam(required = false, name = "outBizNo") String outBizNo, @RequestParam(required = false, name = "orderId") String orderId) { AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel(); if (StrUtil.isNotEmpty(outBizNo)) { model.setOutBizNo(outBizNo); } if (StrUtil.isNotEmpty(orderId)) { model.setOrderId(orderId); } try { return AliPayApi.transCommonQueryToResponse(model, null).getBody(); } catch (Exception e) { e.printStackTrace(); } return null; } @RequestMapping(value = "/accountQuery") @ResponseBody public String accountQuery(@RequestParam(required = true, name = "aliPayUserId") String aliPayUserId) { AlipayFundAccountQueryModel model = new AlipayFundAccountQueryModel(); model.setAlipayUserId(aliPayUserId); model.setAccountType("ACCTRANS_ACCOUNT"); try { return AliPayApi.accountQueryToResponse(model, null).getBody(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 资金授权冻结接口 */ @RequestMapping(value = "/authOrderFreeze") @ResponseBody public AlipayFundAuthOrderFreezeResponse authOrderFreeze(@RequestParam("auth_code") String authCode) { try { AlipayFundAuthOrderFreezeModel model = new AlipayFundAuthOrderFreezeModel(); model.setOutOrderNo(UUID.randomUUID().toString(true)); model.setOutRequestNo(UUID.randomUUID().toString(true)); model.setAuthCode(authCode); model.setAuthCodeType("bar_code"); model.setOrderTitle("资金授权冻结-By IJPay"); model.setAmount("36"); model.setProductCode("PRE_AUTH"); return AliPayApi.authOrderFreezeToResponse(model); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 红包协议支付接口 * https://docs.open.alipay.com/301/106168/ */ @RequestMapping(value = "/agreementPay") @ResponseBody public AlipayFundCouponOrderAgreementPayResponse agreementPay() { try { AlipayFundCouponOrderAgreementPayModel model = new AlipayFundCouponOrderAgreementPayModel(); model.setOutOrderNo(UUID.randomUUID().toString(true)); model.setOutRequestNo(UUID.randomUUID().toString(true)); model.setOrderTitle("红包协议支付接口-By IJPay"); model.setAmount("36"); model.setPayerUserId("2088102180432465"); return AliPayApi.fundCouponOrderAgreementPayToResponse(model); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 下载对账单 */ @RequestMapping(value = "/dataDataServiceBill") @ResponseBody public String dataDataServiceBill(@RequestParam("billDate") String billDate) { try { AlipayDataDataserviceBillDownloadurlQueryModel model = new AlipayDataDataserviceBillDownloadurlQueryModel(); model.setBillType("trade"); model.setBillDate(billDate); return AliPayApi.billDownloadUrlQuery(model); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } /** * 退款 */ @ApiOperation("支付宝退款") @RequestMapping(value = RuleConstants.NOT_LOGIN + "/tradeRefund", method = {RequestMethod.POST, RequestMethod.GET}) @ResponseBody public Boolean tradeRefund(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) { log.info("支付宝-退款信息-outTradeNo:"+outTradeNo+", tradeNo:"+tradeNo); try { AlipayTradeRefundModel model = new AlipayTradeRefundModel(); if (StrUtil.isNotEmpty(outTradeNo)) { // 生成退款单号 model.setOutTradeNo(GeneralUtil.generateRefundOrderNo(outTradeNo)); } if (StrUtil.isNotEmpty(tradeNo)) { model.setTradeNo(tradeNo); } if (outTradeNo.startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) { //课程订单 CourseOrder courseOrder = this.courseOrderService.getCourseOrderByNo(outTradeNo); //状态:0待支付,1已支付,2已过期,9取消,10退款 // if (courseOrder.getStatusFlag().intValue() == 1){ model.setRefundAmount(courseOrder.getPayAmount().toString()); model.setRefundReason("课程订单退款"); AlipayTradeRefundResponse apipay = AliPayApi.tradeRefundToResponse(model); log.info("课程订单信息退款:"+JSONObject.toJSONString(apipay)); if (apipay.getCode().equals("10000")){ courseOrder.setStatusFlag(9); courseOrder.setRefundTime(new Date()); courseOrder.setRefundAmount(courseOrder.getPayAmount()); this.courseOrderService.update(new LambdaUpdateWrapper() .set(CourseOrder::getStatusFlag,9).set(CourseOrder::getRefundTime,new Date()) .set(CourseOrder::getRefundAmount,courseOrder.getPayAmount()) .eq(CourseOrder::getId,courseOrder.getId())); return true; } // } } else if (outTradeNo.startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { //咨询订单 CounsellingOrder counsellingOrder = this.counsellingOrderService.getCounsellingOrderByNo(outTradeNo); //状态:0待支付,1已支付,2已完成,9取消,10退款 // if (counsellingOrder.getStatusFlag().intValue() == 1){ model.setRefundAmount(counsellingOrder.getPayAmount().toString()); model.setRefundReason("咨询订单退款"); AlipayTradeRefundResponse apipay = AliPayApi.tradeRefundToResponse(model); log.info("咨询订单信息退款:"+JSONObject.toJSONString(apipay)); if (apipay.getCode().equals("10000")){ counsellingOrder.setStatusFlag(9); counsellingOrder.setRefundTime(new Date()); counsellingOrder.setRefundAmount(counsellingOrder.getPayAmount()); this.counsellingOrderService.update(new LambdaUpdateWrapper() .set(CounsellingOrder::getStatusFlag,9).set(CounsellingOrder::getRefundTime,new Date()) .set(CounsellingOrder::getRefundAmount,counsellingOrder.getPayAmount()) .eq(CounsellingOrder::getId,counsellingOrder.getId())); return true; } // } } else if (outTradeNo.startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) { // 1v1咨询订单 OrderConsultOne orderConsultOne = this.orderConsultOneService.getOrderByNo(outTradeNo); //状态:0待支付,1已支付,2已完成,9取消,10退款 if (orderConsultOne.getStatusFlag().equals(OrderStatusFlagEnum.PAY_SUCCESS.getCode())) { model.setRefundAmount(orderConsultOne.getPayAmount().toString()); model.setRefundReason("1v1咨询订单退款"); AlipayTradeRefundResponse apipay = AliPayApi.tradeRefundToResponse(model); log.info("1v1咨询订单退款:" + JSONObject.toJSONString(apipay)); if (apipay.getCode().equals("10000")) { return true; } } } return false; } catch (AlipayApiException e) { e.printStackTrace(); } return false; } /** * 交易查询 */ @RequestMapping(value = "/tradeQuery") @ResponseBody public String tradeQuery(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) { try { AlipayTradeQueryModel model = new AlipayTradeQueryModel(); if (StrUtil.isNotEmpty(outTradeNo)) { model.setOutTradeNo(outTradeNo); } if (StrUtil.isNotEmpty(tradeNo)) { model.setTradeNo(tradeNo); } return AliPayApi.tradeQueryToResponse(model).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } @RequestMapping(value = "/tradeQueryByStr") @ResponseBody public String tradeQueryByStr(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) { AlipayTradeQueryModel model = new AlipayTradeQueryModel(); if (StrUtil.isNotEmpty(outTradeNo)) { model.setOutTradeNo(outTradeNo); } if (StrUtil.isNotEmpty(tradeNo)) { model.setTradeNo(tradeNo); } try { return AliPayApi.tradeQueryToResponse(model).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } /** * 创建订单 * {"alipay_trade_create_response":{"code":"10000","msg":"Success","out_trade_no":"081014283315033","trade_no":"2017081021001004200200274066"},"sign":"ZagfFZntf0loojZzdrBNnHhenhyRrsXwHLBNt1Z/dBbx7cF1o7SZQrzNjRHHmVypHKuCmYifikZIqbNNrFJauSuhT4MQkBJE+YGPDtHqDf4Ajdsv3JEyAM3TR/Xm5gUOpzCY7w+RZzkHevsTd4cjKeGM54GBh0hQH/gSyhs4pEN3lRWopqcKkrkOGZPcmunkbrUAF7+AhKGUpK+AqDw4xmKFuVChDKaRdnhM6/yVsezJFXzlQeVgFjbfiWqULxBXq1gqicntyUxvRygKA+5zDTqE5Jj3XRDjVFIDBeOBAnM+u03fUP489wV5V5apyI449RWeybLg08Wo+jUmeOuXOA=="} */ @RequestMapping(value = "/tradeCreate") @ResponseBody public String tradeCreate(@RequestParam("outTradeNo") String outTradeNo) { String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL; AlipayTradeCreateModel model = new AlipayTradeCreateModel(); model.setOutTradeNo(outTradeNo); model.setTotalAmount("88.88"); model.setBody("Body"); model.setSubject("Javen 测试统一收单交易创建接口"); //买家支付宝账号,和buyer_id不能同时为空 model.setBuyerLogonId("abpkvd0206@sandbox.com"); try { AlipayTradeCreateResponse response = AliPayApi.tradeCreateToResponse(model, notifyUrl); return response.getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } /** * 撤销订单 */ @RequestMapping(value = "/tradeCancel") @ResponseBody public String tradeCancel(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) { try { AlipayTradeCancelModel model = new AlipayTradeCancelModel(); if (StrUtil.isNotEmpty(outTradeNo)) { model.setOutTradeNo(outTradeNo); } if (StrUtil.isNotEmpty(tradeNo)) { model.setTradeNo(tradeNo); } return AliPayApi.tradeCancelToResponse(model).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } /** * 关闭订单 */ @RequestMapping(value = "/tradeClose") @ResponseBody public String tradeClose(@RequestParam("outTradeNo") String outTradeNo, @RequestParam("tradeNo") String tradeNo) { try { AlipayTradeCloseModel model = new AlipayTradeCloseModel(); if (StrUtil.isNotEmpty(outTradeNo)) { model.setOutTradeNo(outTradeNo); } if (StrUtil.isNotEmpty(tradeNo)) { model.setTradeNo(tradeNo); } return AliPayApi.tradeCloseToResponse(model).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } /** * 结算 */ @RequestMapping(value = "/tradeOrderSettle") @ResponseBody public String tradeOrderSettle(@RequestParam("tradeNo") String tradeNo) { try { AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); model.setOutRequestNo(UUID.randomUUID().toString(true)); model.setTradeNo(tradeNo); return AliPayApi.tradeOrderSettleToResponse(model).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } /** * 获取应用授权URL并授权 */ @RequestMapping(value = "/toOauth") @ResponseBody public void toOauth(HttpServletResponse response) { try { String redirectUri = aliPayBean.getDomain() + "/aliPay/redirect_uri"; String oauth2Url = AliPayApi.getOauth2Url(aliPayBean.getAppId(), redirectUri); response.sendRedirect(oauth2Url); } catch (Exception e) { e.printStackTrace(); } } /** * 应用授权回调 */ @RequestMapping(value = "/redirect_uri") @ResponseBody public String redirectUri(@RequestParam("app_id") String appId, @RequestParam("app_auth_code") String appAuthCode) { try { System.out.println("app_id:" + appId); System.out.println("app_auth_code:" + appAuthCode); //使用app_auth_code换取app_auth_token AlipayOpenAuthTokenAppModel model = new AlipayOpenAuthTokenAppModel(); model.setGrantType("authorization_code"); model.setCode(appAuthCode); return AliPayApi.openAuthTokenAppToResponse(model).getBody(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 查询授权信息 */ @RequestMapping(value = "/openAuthTokenAppQuery") @ResponseBody public String openAuthTokenAppQuery(@RequestParam("appAuthToken") String appAuthToken) { try { AlipayOpenAuthTokenAppQueryModel model = new AlipayOpenAuthTokenAppQueryModel(); model.setAppAuthToken(appAuthToken); return AliPayApi.openAuthTokenAppQueryToResponse(model).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } /** * 批量付款到支付宝账户有密接口 */ @RequestMapping(value = "/batchTrans") @ResponseBody public void batchTrans(HttpServletResponse response) { try { String signType = "MD5"; String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL; Map params = new HashMap<>(15); params.put("partner", "PID"); params.put("sign_type", signType); params.put("notify_url", notifyUrl); params.put("account_name", "xxx"); params.put("detail_data", "流水号1^收款方账号1^收款账号姓名1^付款金额1^备注说明1|流水号2^收款方账号2^收款账号姓名2^付款金额2^备注说明2"); params.put("batch_no", String.valueOf(System.currentTimeMillis())); params.put("batch_num", 1 + ""); params.put("batch_fee", 10.00 + ""); params.put("email", "xx@xxx.com"); AliPayApi.batchTrans(params, aliPayBean.getPrivateKey(), signType, response); } catch (Exception e) { e.printStackTrace(); } } /** * 地铁购票核销码发码 */ @RequestMapping(value = "/voucherGenerate") @ResponseBody public String voucherGenerate(@RequestParam("tradeNo") String tradeNo) { try { //需要支付成功的订单号 // String tradeNo = getPara("tradeNo"); AlipayCommerceCityfacilitatorVoucherGenerateModel model = new AlipayCommerceCityfacilitatorVoucherGenerateModel(); model.setCityCode("440300"); model.setTradeNo(tradeNo); model.setTotalFee("8"); model.setTicketNum("2"); model.setTicketType("oneway"); model.setSiteBegin("001"); model.setSiteEnd("002"); model.setTicketPrice("4"); return AliPayApi.voucherGenerateToResponse(model).getBody(); } catch (AlipayApiException e) { e.printStackTrace(); } return null; } @RequestMapping(value = "/return_url") @ResponseBody public String returnUrl(HttpServletRequest request) { try { // 获取支付宝GET过来反馈信息 Map map = AliPayApi.toMap(request); for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } boolean verifyResult = AlipaySignature.rsaCheckV1(map, aliPayBean.getPublicKey(), "UTF-8", "RSA2"); if (verifyResult) { // TODO 请在这里加上商户的业务逻辑程序代码 System.out.println("return_url 验证成功"); return "success"; } else { System.out.println("return_url 验证失败"); // TODO return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); return "failure"; } } @RequestMapping(value = "/cert_return_url") @ResponseBody public String certReturnUrl(HttpServletRequest request) { try { // 获取支付宝GET过来反馈信息 Map map = AliPayApi.toMap(request); for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } boolean verifyResult = AlipaySignature.rsaCertCheckV1(map, aliPayBean.getAliPayCertPath(), "UTF-8", "RSA2"); if (verifyResult) { // TODO 请在这里加上商户的业务逻辑程序代码 System.out.println("certReturnUrl 验证成功"); return "success"; } else { System.out.println("certReturnUrl 验证失败"); // TODO return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); return "failure"; } } @RequestMapping(value = "/cert_notify_url") @ResponseBody public String certNotifyUrl(HttpServletRequest request) { try { // 获取支付宝POST过来反馈信息 Map params = AliPayApi.toMap(request); for (Map.Entry entry : params.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } boolean verifyResult = AlipaySignature.rsaCertCheckV1(params, aliPayBean.getAliPayCertPath(), "UTF-8", "RSA2"); if (verifyResult) { // TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理 System.out.println("certNotifyUrl 验证成功succcess"); return "success"; } else { System.out.println("certNotifyUrl 验证失败"); // TODO return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); return "failure"; } } }