xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderCancelDto.java
New file @@ -0,0 +1,41 @@ package com.xiaopeng.api.dto.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "取消订单参数") public class CreditOrderCancelDto { @ApiModelProperty(value = "业务方id") @NotBlank(message = "业务方id不能为空") private String businessId; @ApiModelProperty(value = "业务方订单id") @NotBlank(message = "业务方订单id不能为空") private String businessOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号") @NotBlank(message = "支付中心授权单号不能为空") private String authOrderId; @ApiModelProperty(value = "业务方类目,由支付中心分配") @NotBlank(message = "业务方类目不能为空") private String category; @ApiModelProperty(value = "用户此订单是否守约") private String isFulfilled; @ApiModelProperty(value = "对本次操作的附言描述,透传支付宝") private String remark; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分") @NotBlank(message = "支付类型不能为空") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderCreateDto.java
New file @@ -0,0 +1,77 @@ package com.xiaopeng.api.dto.payFront; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import java.util.List; @Data @ApiModel(value = "信用下单参数") public class CreditOrderCreateDto { @ApiModelProperty(value = "用户id") private Long uid; @ApiModelProperty(value = "业务方id") @NotBlank(message = "业务方id不能为空") private String businessId; @ApiModelProperty(value = "业务方类目,由支付中心分配") @NotBlank(message = "业务方类目不能为空") private String category; @ApiModelProperty(value = "业务方订单id,同一个订单只会生成一个信用单") @NotBlank(message = "业务方订单id不能为空") private String businessOrderId; @ApiModelProperty(value = "订单超时时间,不传默认不会超时 yyyy-MM-dd HH:mm:ss") private String expireTime; @ApiModelProperty(value = "开通签约时传入的外部请求号,signOrderId和mercToken必传一个") private String signOrderId; @ApiModelProperty(value = "外部协议号,和信用协议号一对一映射,如果不传默认取signOrderId对应的协议号") private String mercToken; @ApiModelProperty(value = "订单扣款上限金额,单位分") private Long orderAmount; @ApiModelProperty(value = "微信用户在商户对应appid下的唯一标识") private String openId; @ApiModelProperty(value = "订单标题,展示在用户订单") @NotBlank(message = "订单标题不能为空") private String subject; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分") @NotBlank(message = "支付类型不能为空") private String payType; @ApiModelProperty(value = "是否需要用户确认,RT固定传true") private String needUserConfirm; @ApiModelProperty(value = "回调订单授权结果地址") private String payCallbackUrl; @ApiModelProperty(value = "后付费项目") @Valid @JsonProperty("post_payments") private List<PostPayment> postPayments; @Data @ApiModel(value = "PostPayment对象", description = "后付费项目") public static class PostPayment { @ApiModelProperty(value = "付费名称,不能超过20个字符") @NotBlank(message = "付费名称不能为空") private String name; @ApiModelProperty(value = "付费说明,对付费项目的详细说明,不超过30个字符") @NotBlank(message = "付费说明不能为空") private String description; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderQueryDto.java
New file @@ -0,0 +1,35 @@ package com.xiaopeng.api.dto.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "查询信用订单参数") public class CreditOrderQueryDto { @ApiModelProperty(value = "业务方id") @NotBlank(message = "业务方id不能为空") private String businessId; @ApiModelProperty(value = "业务方订单id") @NotBlank(message = "业务方订单id不能为空") private String businessOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号") @NotBlank(message = "支付中心授权单号不能为空") private String authOrderId; @ApiModelProperty(value = "业务方类目,由支付中心分配") @NotBlank(message = "业务方类目不能为空") private String category; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分") @NotBlank(message = "支付类型不能为空") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditOrderWxPayDto.java
New file @@ -0,0 +1,62 @@ package com.xiaopeng.api.dto.payFront; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.List; @Data @ApiModel(value = "异步完结扣款订单参数") public class CreditOrderWxPayDto { @ApiModelProperty(value = "业务方id") @NotBlank(message = "业务方id不能为空") private String businessId; @ApiModelProperty(value = "业务方订单id") @NotBlank(message = "业务方订单id不能为空") private String businessOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号(商户订单号)") @NotBlank(message = "支付中心授权单号不能为空") private String authOrderId; @ApiModelProperty(value = "业务方类目,由支付中心分配") @NotBlank(message = "业务方类目不能为空") private String category; @ApiModelProperty(value = "回调订单完结结果地址,没有填则从商户配置中取") @NotBlank(message = "回调订单完结结果地址不能为空") private String payCallbackUrl; @ApiModelProperty(value = "信用订单本次扣款金额,单位分") @NotNull(message = "扣款金额不能为空") private Long totalAmount; @ApiModelProperty(value = "订单标题,展示在用户订单") @NotBlank(message = "订单标题不能为空") private String subject; @ApiModelProperty(value = "对本次操作的附言描述,透传支付宝or微信(30字符以内)") private String remark; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分") @NotBlank(message = "支付类型不能为空") private String payType; @ApiModelProperty(value = "支付场景,APP支付:3,支付宝小程序:9,默认未知场景:99") private Integer payScene; @ApiModelProperty(value = "后付费项目") @Valid @JsonProperty("post_payments") private List<CreditOrderCreateDto.PostPayment> postPayments; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditPaySignDto.java
New file @@ -0,0 +1,40 @@ package com.xiaopeng.api.dto.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "微信支付分开通签约参数") public class CreditPaySignDto { @ApiModelProperty(value = "用户id") private Long uid; @ApiModelProperty(value = "用户成功完成芝麻先用后付开通流程后,跳转回商户的页面地址") private String returnUrl; @ApiModelProperty(value = "用户中断开通流程后,跳转回商户的页面地址") private String cancelUrl; @ApiModelProperty(value = "回调开通结果地址,没有填则从商户配置中取") private String callbackUrl; @ApiModelProperty(value = "业务方类目,由支付中心分配") @NotBlank(message = "业务方类目不能为空") private String category; @ApiModelProperty(value = "业务方id") @NotBlank(message = "业务方id不能为空") private String businessId; @ApiModelProperty(value = "业务方外部单号,不同的支付宝用户需要传递不同的外部单号") @NotBlank(message = "业务方外部单号不能为空") private String businessOrderId; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分") @NotBlank(message = "支付类型不能为空") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditPaySignQueryDto.java
New file @@ -0,0 +1,33 @@ package com.xiaopeng.api.dto.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "主动查询开通结果参数") public class CreditPaySignQueryDto { @ApiModelProperty(value = "用户id") private Long uid; @ApiModelProperty(value = "业务方id") @NotBlank(message = "业务方id不能为空") private String businessId; @ApiModelProperty(value = "业务方类目,由支付中心分配") @NotBlank(message = "业务方类目不能为空") private String category; @ApiModelProperty(value = "业务方外部单号,不同的用户需要传递不同的外部单号") @NotBlank(message = "业务方外部单号不能为空") private String businessOrderId; @ApiModelProperty(value = "外部协议号,和渠道协议号一对一映射,优先查询") private String mercToken; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分,不传查所有") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/CreditPrecreateDto.java
New file @@ -0,0 +1,87 @@ package com.xiaopeng.api.dto.payFront; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.List; import java.util.Map; @Data @ApiModel(value = "预下单参数") public class CreditPrecreateDto { @ApiModelProperty(value = "用户uid") private String uid; @ApiModelProperty(value = "业务appid") @NotBlank(message = "业务appid不能为空") private String bizId; @ApiModelProperty(value = "业务订单号") @NotBlank(message = "业务订单号不能为空") private String bizOrderId; @ApiModelProperty(value = "支付场景") @NotNull(message = "支付场景不能为空") private Integer payScene; @ApiModelProperty(value = "支付金额,分为单位") @NotNull(message = "支付金额不能为空") private Integer amount; @ApiModelProperty(value = "订单类别") @NotBlank(message = "订单类别不能为空") private String category; @ApiModelProperty(value = "订单标题") @NotBlank(message = "订单标题不能为空") private String title; @ApiModelProperty(value = "订单详情") @NotBlank(message = "订单详情不能为空") private String detail; @ApiModelProperty(value = "订单支付失效时间") private String expireTime; @ApiModelProperty(value = "业务支付拓展参数") private Map<String, String> businessExtend; @ApiModelProperty(value = "业务拓展参数,透传") private String extBusinessData; @ApiModelProperty(value = "业务拓展参数,不透传") private String extBusinessData2; @ApiModelProperty(value = "微信用户在商户appid下的唯一标识") private String wxOpenId; @ApiModelProperty(value = "免检登录态开关") private String noLoginCheck; @ApiModelProperty(value = "分账串") private String ledgerInfo; @ApiModelProperty(value = "分账类型") private String ledgerInfoType; @ApiModelProperty(value = "支付宝小程序支付用户id") private String alipayMiniUserId; @ApiModelProperty(value = "支付宝芝麻授权调用") private String alipayZhimaAuth; @ApiModelProperty(value = "回调订单授权结果地址") private String authCallbackUrl; @ApiModelProperty(value = "是否需要用户确认") private String needUserConfirm; @ApiModelProperty(value = "后付费项目") @JsonProperty("post_payments") private List<CreditOrderCreateDto.PostPayment> postPayments; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/RefundRequestDto.java
New file @@ -0,0 +1,50 @@ package com.xiaopeng.api.dto.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "退款参数") public class RefundRequestDto { @ApiModelProperty(value = "业务appid") @NotBlank(message = "业务appid不能为空") private String bizId; @ApiModelProperty(value = "业务订单号") @NotBlank(message = "业务订单号不能为空") private String bizOrderId; @ApiModelProperty(value = "业务退款订单号") @NotBlank(message = "业务退款订单号不能为空") private String bizRefundId; @ApiModelProperty(value = "退款金额,分为单位") @NotNull(message = "退款金额不能为空") private Integer amount; @ApiModelProperty(value = "退款原因类型") private String refundType; @ApiModelProperty(value = "退款拓展字段") private String refundExtend; @ApiModelProperty(value = "分账退款分账串") private String refundLedgerInfo; @ApiModelProperty(value = "退款回调地址") private String refundCallbackUrl; @ApiModelProperty(value = "退款业务数据") private String refundBusinessData; @ApiModelProperty(value = "退款透传字段") private String refundPassThroughData; @ApiModelProperty(value = "银联小U退款专用,是否退券标识") private Integer refundCouponFlag; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/payFront/UnsignCreditPayDto.java
New file @@ -0,0 +1,35 @@ package com.xiaopeng.api.dto.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "微信支付分取消授权参数") public class UnsignCreditPayDto { @ApiModelProperty(value = "用户id") private Long uid; @ApiModelProperty(value = "业务方id") @NotBlank(message = "业务方id不能为空") private String businessId; @ApiModelProperty(value = "业务方类目,由支付中心分配") @NotBlank(message = "业务方类目不能为空") private String category; @ApiModelProperty(value = "业务方外部单号,不同的用户需要传递不同的外部单号") @NotBlank(message = "业务方外部单号不能为空") private String businessOrderId; @ApiModelProperty(value = "外部协议号,和渠道协议号一对一映射,优先查询") @NotBlank(message = "外部协议号不能为空") private String mercToken; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分),13: 微信支付分") @NotBlank(message = "支付类型不能为空") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/payFront/XpPayFrontClientFallbackFactory.java
New file @@ -0,0 +1,91 @@ package com.xiaopeng.api.factory.payFront; import com.xiaopeng.api.dto.payFront.CreditOrderCancelDto; import com.xiaopeng.api.dto.payFront.CreditOrderCreateDto; import com.xiaopeng.api.dto.payFront.CreditOrderQueryDto; import com.xiaopeng.api.dto.payFront.CreditOrderWxPayDto; import com.xiaopeng.api.dto.payFront.CreditPaySignDto; import com.xiaopeng.api.dto.payFront.CreditPaySignQueryDto; import com.xiaopeng.api.dto.payFront.CreditPrecreateDto; import com.xiaopeng.api.dto.payFront.RefundRequestDto; import com.xiaopeng.api.dto.payFront.UnsignCreditPayDto; import com.xiaopeng.api.feignClient.payFront.XpPayFrontClient; import com.xiaopeng.api.vo.payFront.CreditOrderCancelVo; import com.xiaopeng.api.vo.payFront.CreditOrderCreateVo; import com.xiaopeng.api.vo.payFront.CreditOrderQueryVo; import com.xiaopeng.api.vo.payFront.CreditOrderWxPayVo; import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo; import com.xiaopeng.api.vo.payFront.CreditPaySignVo; import com.xiaopeng.api.vo.payFront.CreditPrecreateVo; import com.xiaopeng.api.vo.payFront.RefundVo; import com.xiaopeng.api.vo.payFront.UnsignCreditPayVo; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; /** * Pay front Feign fallback factory. * * @author mitao */ @Slf4j @Component public class XpPayFrontClientFallbackFactory implements FallbackFactory<XpPayFrontClient> { @Override public XpPayFrontClient create(Throwable cause) { log.error("pay front service call failed: {}", cause.getMessage()); return new XpPayFrontClient() { @Override public R<CreditPaySignVo> creditPaySign(CreditPaySignDto dto) { return fail("credit pay sign failed"); } @Override public R<CreditPaySignQueryVo> queryCreditPaySign(CreditPaySignQueryDto dto) { return fail("credit pay sign query failed"); } @Override public R<CreditOrderCreateVo> createCreditOrder(CreditOrderCreateDto dto) { return fail("credit order create failed"); } @Override public R<CreditOrderWxPayVo> creditOrderWxPay(CreditOrderWxPayDto dto) { return fail("credit order wxPay failed"); } @Override public R<CreditOrderCancelVo> cancelCreditOrder(CreditOrderCancelDto dto) { return fail("credit order cancel failed"); } @Override public R<CreditOrderQueryVo> queryCreditOrder(CreditOrderQueryDto dto) { return fail("credit order query failed"); } @Override public R<RefundVo> refund(RefundRequestDto dto) { return fail("refund failed"); } @Override public R<CreditPrecreateVo> precreate(CreditPrecreateDto dto) { return fail("precreate failed"); } @Override public R<UnsignCreditPayVo> unsign(UnsignCreditPayDto dto) { return fail("credit pay unsign failed"); } private <T> R<T> fail(String message) { log.error("{}: {}", message, cause.getMessage()); return R.fail(message); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/payFront/XpPayFrontClient.java
New file @@ -0,0 +1,64 @@ package com.xiaopeng.api.feignClient.payFront; import com.xiaopeng.api.dto.payFront.CreditOrderCancelDto; import com.xiaopeng.api.dto.payFront.CreditOrderCreateDto; import com.xiaopeng.api.dto.payFront.CreditOrderQueryDto; import com.xiaopeng.api.dto.payFront.CreditOrderWxPayDto; import com.xiaopeng.api.dto.payFront.CreditPaySignDto; import com.xiaopeng.api.dto.payFront.CreditPaySignQueryDto; import com.xiaopeng.api.dto.payFront.CreditPrecreateDto; import com.xiaopeng.api.dto.payFront.RefundRequestDto; import com.xiaopeng.api.dto.payFront.UnsignCreditPayDto; import com.xiaopeng.api.factory.payFront.XpPayFrontClientFallbackFactory; import com.xiaopeng.api.vo.payFront.CreditOrderCancelVo; import com.xiaopeng.api.vo.payFront.CreditOrderCreateVo; import com.xiaopeng.api.vo.payFront.CreditOrderQueryVo; import com.xiaopeng.api.vo.payFront.CreditOrderWxPayVo; import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo; import com.xiaopeng.api.vo.payFront.CreditPaySignVo; import com.xiaopeng.api.vo.payFront.CreditPrecreateVo; import com.xiaopeng.api.vo.payFront.RefundVo; import com.xiaopeng.api.vo.payFront.UnsignCreditPayVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * 支付中心Feign客户端 * * @author mitao */ @FeignClient(contextId = "XpPayFrontClient", value = ServiceNameConstantsEnum.XP_PAY_FRONT_BOOT, fallbackFactory = XpPayFrontClientFallbackFactory.class) public interface XpPayFrontClient { @PostMapping("/logan/pay/creditPay/sign") R<CreditPaySignVo> creditPaySign(@RequestBody CreditPaySignDto dto); @PostMapping("/logan/pay/creditPay/sign/query") R<CreditPaySignQueryVo> queryCreditPaySign(@RequestBody CreditPaySignQueryDto dto); @PostMapping("/logan/pay/creditPay/creditOrder/create") R<CreditOrderCreateVo> createCreditOrder(@RequestBody CreditOrderCreateDto dto); @PostMapping("/logan/pay/creditPay/creditOrder/wxPay") R<CreditOrderWxPayVo> creditOrderWxPay(@RequestBody CreditOrderWxPayDto dto); @PostMapping("/logan/pay/creditPay/creditOrder/cancel") R<CreditOrderCancelVo> cancelCreditOrder(@RequestBody CreditOrderCancelDto dto); @PostMapping("/logan/pay/creditPay/creditOrder/query") R<CreditOrderQueryVo> queryCreditOrder(@RequestBody CreditOrderQueryDto dto); @PostMapping("/logan/v1/order/refund") R<RefundVo> refund(@RequestBody RefundRequestDto dto); @PostMapping("/logan/v1/order/precreate") R<CreditPrecreateVo> precreate(@RequestBody CreditPrecreateDto dto); @PostMapping("/logan/pay/creditPay/unsign") R<UnsignCreditPayVo> unsign(@RequestBody UnsignCreditPayDto dto); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/CreditOrderCancelVo.java
New file @@ -0,0 +1,25 @@ package com.xiaopeng.api.vo.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "取消订单响应") public class CreditOrderCancelVo { @ApiModelProperty(value = "业务方订单号") private String businessOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号") private String authOrderId; @ApiModelProperty(value = "信用订单状态") private String creditOrderStatus; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分)") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/CreditOrderCreateVo.java
New file @@ -0,0 +1,27 @@ package com.xiaopeng.api.vo.payFront; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "信用下单响应") public class CreditOrderCreateVo { @ApiModelProperty(value = "业务方订单号") private String businessOrderId; @ApiModelProperty(value = "支付中心授权单号(商户订单号)") private String authOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分)") private String payType; @ApiModelProperty(value = "跳转微信侧小程序订单数据") @JsonProperty("package") private String packageValue; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/CreditOrderQueryVo.java
New file @@ -0,0 +1,28 @@ package com.xiaopeng.api.vo.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "查询信用订单响应") public class CreditOrderQueryVo { @ApiModelProperty(value = "业务方订单号") private String businessOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号") private String authOrderId; @ApiModelProperty(value = "微信用户在商户对应appid下的唯一标识") private String openId; @ApiModelProperty(value = "信用订单状态") private String creditOrderStatus; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分)") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/CreditOrderWxPayVo.java
New file @@ -0,0 +1,28 @@ package com.xiaopeng.api.vo.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "异步完结扣款订单响应") public class CreditOrderWxPayVo { @ApiModelProperty(value = "业务方订单号") private String businessOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号") private String authOrderId; @ApiModelProperty(value = "信用订单状态") private String creditOrderStatus; @ApiModelProperty(value = "信用订单本次扣款金额,单位分") private Long totalAmount; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分)") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/CreditPaySignQueryVo.java
New file @@ -0,0 +1,41 @@ package com.xiaopeng.api.vo.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel(value = "主动查询开通结果响应") public class CreditPaySignQueryVo { @ApiModelProperty(value = "签约列表") private List<Sign> signList; @Data @ApiModel(value = "CreditPaySign对象", description = "签约结果") public static class Sign { @ApiModelProperty(value = "外部协议号,和渠道协议号一对一映射,空则表示未开通") private String mercToken; @ApiModelProperty(value = "外部请求号,和渠道协议号一对一映射,空则表示未开通") private String signOrderId; @ApiModelProperty(value = "业务方外部单号,不同的支付宝用户需要传递不同的外部单号") private String businessOrderId; @ApiModelProperty(value = "协议号状态:VALID(已签约),INVALID(未签约),INIT(初始化可当作未签约),WAIT(解约中)") private String status; @ApiModelProperty(value = "用户id") private Long uid; @ApiModelProperty(value = "开通时间 yyyy-MM-dd HH:mm:ss") private String bizTime; @ApiModelProperty(value = "支付类型") private String payType; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/CreditPaySignVo.java
New file @@ -0,0 +1,28 @@ package com.xiaopeng.api.vo.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "微信支付分开通签约响应") public class CreditPaySignVo { @ApiModelProperty(value = "签名串,小程序跳转使用 or 微信支付分:预授权token") private String signStr; @ApiModelProperty(value = "芝麻服务id,小程序跳转使用") private String zmServiceId; @ApiModelProperty(value = "APP跳转URL") private String schemaUrl; @ApiModelProperty(value = "业务方id") private String businessId; @ApiModelProperty(value = "支付宝下载跳转URL") private String downloadAlipayUrl; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分)") private String payType; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/CreditPrecreateVo.java
New file @@ -0,0 +1,22 @@ package com.xiaopeng.api.vo.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "预下单响应") public class CreditPrecreateVo { @ApiModelProperty(value = "业务订单号") private String bizOrderId; @ApiModelProperty(value = "预支付id") private String prePayId; @ApiModelProperty(value = "收银台url") private String url; @ApiModelProperty(value = "收银台token") private String token; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/RefundVo.java
New file @@ -0,0 +1,38 @@ package com.xiaopeng.api.vo.payFront; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @Data @ApiModel(value = "退款响应") public class RefundVo { @ApiModelProperty(value = "业务订单号") private String bizOrderId; @ApiModelProperty(value = "业务退款订单号") private String bizRefundId; @ApiModelProperty(value = "支付订单号") private String payOrderId; @ApiModelProperty(value = "支付平台退款订单号") private String refundOrderId; @ApiModelProperty(value = "渠道订单号") private String channelOrderId; @ApiModelProperty(value = "用户uid") private String uid; @ApiModelProperty(value = "退款金额,单位为分") private Integer amount; @ApiModelProperty(value = "退款订单创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/payFront/UnsignCreditPayVo.java
New file @@ -0,0 +1,28 @@ package com.xiaopeng.api.vo.payFront; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "微信支付分取消授权响应") public class UnsignCreditPayVo { @ApiModelProperty(value = "业务方订单号") private String businessOrderId; @ApiModelProperty(value = "渠道返回支付服务订单号") private String channelOrderId; @ApiModelProperty(value = "信用下单接口获取的支付中心授权单号") private String authOrderId; @ApiModelProperty(value = "开放用户id") private String openId; @ApiModelProperty(value = "信用订单状态") private String creditOrderStatus; @ApiModelProperty(value = "支付类型(芝麻后付or微信支付分)") private String payType; } xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -63,4 +63,5 @@ com.xiaopeng.api.factory.vehicleConvoy.VehicleMacClientFallbackFactory com.xiaopeng.api.factory.account.XpOperationsUserClientFallbackFactory com.xiaopeng.api.factory.pushMessage.WebSocketMessageFallbackFactory com.xiaopeng.api.factory.operation.XpOfficialPartnerClientFallbackFactory com.xiaopeng.api.factory.operation.XpOfficialPartnerClientFallbackFactory com.xiaopeng.api.factory.payFront.XpPayFrontClientFallbackFactory xp-robotaxi-common/xp-common-core/src/main/java/com/xiaopeng/common/core/dto/ServiceNameConstantsEnum.java
@@ -77,5 +77,9 @@ * 小鹏数字秘钥服务 */ String XP_DIGITAL_KEY_BOOT = "xp-digital-key-boot"; /** * 支付中心 */ String XP_PAY_FRONT_BOOT = "xp-pay-front-boot"; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -21,6 +21,9 @@ import com.xiaopeng.api.dto.map.RouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.dto.order.*; import com.xiaopeng.api.dto.payFront.CreditOrderCreateDto; import com.xiaopeng.api.dto.payFront.CreditPaySignQueryDto; import com.xiaopeng.api.dto.payFront.CreditPrecreateDto; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.dto.statistics.DailyCountDTO; import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO; @@ -36,6 +39,7 @@ import com.xiaopeng.api.feignClient.map.XpMapClient; import com.xiaopeng.api.feignClient.operation.*; import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; import com.xiaopeng.api.feignClient.payFront.XpPayFrontClient; import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; import com.xiaopeng.api.feignClient.vehicleConvoy.*; import com.xiaopeng.api.model.maintenance.XpTaskRule; @@ -55,6 +59,8 @@ import com.xiaopeng.api.vo.operation.NearestNextVo; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.api.vo.order.*; import com.xiaopeng.api.vo.payFront.CreditOrderCreateVo; import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo; import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo; import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo; import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo; @@ -196,6 +202,9 @@ @Resource private OfficialPartnerUtil officialPartnerUtil; @Resource private XpPayFrontClient xpPayFrontClient; @Value("${robotaxi.appId:xp_robotaxi_api}") private String appid; @@ -3218,27 +3227,90 @@ @Override public R payment(XpOrderPayDto dto, String uid) { // mvp版本不做支付 使用优惠券抵扣为0元订单处理 处理订单状态即可 XpOrder order = this.getById(dto.getOrderId()); order.setStatus(9); order.setAppUserId(null); if (order.getCouponId() != null) { UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); useUserCouponDto.setUserCouponId(order.getCouponId()); R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto); if (decimalR.getCode() == 200) { order.setCouponMoney(decimalR.getData()); if (order.getCouponMoney().compareTo(order.getOrderMoney()) > 0) { order.setPayMoney(BigDecimal.ZERO); order.setCouponMoney(order.getOrderMoney()); } else { order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData())); } // 1.0 免密 //查询是否开通免密 // 1先查用户是否申请 申请了拿到通过的businessOrderId boolean signed = false; CreditPaySignQueryDto creditPaySignQueryDto = new CreditPaySignQueryDto(); creditPaySignQueryDto.setUid(Long.valueOf(uid)); creditPaySignQueryDto.setBusinessId(appid); creditPaySignQueryDto.setCategory("xp_robotaxi_api"); creditPaySignQueryDto.setBusinessOrderId(""); R<CreditPaySignQueryVo> creditPaySignQueryVoR = xpPayFrontClient.queryCreditPaySign(creditPaySignQueryDto); if (creditPaySignQueryVoR.getCode()==200) { CreditPaySignQueryVo data = creditPaySignQueryVoR.getData(); // 查看是否有签约的 long count = data.getSignList().stream().filter(e -> e.getStatus().equals("VALID")).count(); if (count > 0){ signed = true; } } baseMapper.updateById(order); bootCommonService.setCache_orderStatus(order.getId(), order, null); return R.ok(); if(signed){ // y已签约 1.信用下单 CreditOrderCreateDto creditOrderCreateDto = new CreditOrderCreateDto(); creditOrderCreateDto.setUid(Long.valueOf(uid)); creditOrderCreateDto.setBusinessId(appid); creditOrderCreateDto.setCategory("xp_robotaxi_api"); creditOrderCreateDto.setBusinessOrderId(""); creditOrderCreateDto.setSubject("信用下单"); creditOrderCreateDto.setPayType("13"); // 信用下单 ArrayList<CreditOrderCreateDto.PostPayment> postPayments = new ArrayList<>(1); CreditOrderCreateDto.PostPayment postPayment = new CreditOrderCreateDto.PostPayment(); postPayment.setName("收费标准"); postPayment.setDescription("行程价格动态浮动,具体详情可在费用详情或计价规则查看"); postPayments.add(postPayment); creditOrderCreateDto.setPostPayments(postPayments); R<CreditOrderCreateVo> creditOrderCreateVoR = xpPayFrontClient.createCreditOrder(creditOrderCreateDto); if(creditOrderCreateVoR.getCode()==200){ CreditOrderCreateVo data = creditOrderCreateVoR.getData(); return R.ok(data.getPackageValue()); } }else { // 未签约 // 调用预下单接口 XpOrder order = this.getById(dto.getOrderId()); CreditPrecreateDto creditPrecreateDto = new CreditPrecreateDto(); creditPrecreateDto.setUid(uid); creditPrecreateDto.setBizId(appid); creditPrecreateDto.setBizOrderId(""); creditPrecreateDto.setPayScene(99); creditPrecreateDto.setAmount(order.getOrderMoney().multiply(new BigDecimal(100)).intValue()); creditPrecreateDto.setCategory("信用下单"); creditPrecreateDto.setTitle("信用下单"); creditPrecreateDto.setDetail("信用下单"); } // mvp版本不做支付 使用优惠券抵扣为0元订单处理 处理订单状态即可 // XpOrder order = this.getById(dto.getOrderId()); // order.setStatus(9); // order.setAppUserId(null); // if (order.getCouponId() != null) { // UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); // useUserCouponDto.setUserCouponId(order.getCouponId()); // R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto); // if (decimalR.getCode() == 200) { // order.setCouponMoney(decimalR.getData()); // if (order.getCouponMoney().compareTo(order.getOrderMoney()) > 0) { // order.setPayMoney(BigDecimal.ZERO); // order.setCouponMoney(order.getOrderMoney()); // } else { // order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData())); // } // } // } // baseMapper.updateById(order); // bootCommonService.setCache_orderStatus(order.getId(), order, null); return R.fail(); } /**