Compare commits

..

2 Commits

Author SHA1 Message Date
a543a8805f Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-29 12:10:39 +08:00
510cf76e4a feat(transaction): 集成易生支付功能
- 新增易生支付相关配置和常量- 实现易生支付回调处理和测试支付接口
- 添加易生支付请求和响应对象
2025-08-29 12:10:31 +08:00
88 changed files with 4968 additions and 123 deletions

View File

@ -254,3 +254,12 @@ tencent:
password: A1969bf8
authentication-database: admin
# replica-set-name: mongoreplset
easypay:
api-path-prefix: https://d-phoenix-gap.easypay.com.cn:24443/yqt
req-id: D01X66666667068
mcht-code: 631000000003325
wechat-mchid: 804474446
easypay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArgVerkGaSEQvZIOpLjeUoVpL0lSYLc04+txtPFtfm5r5XFbaNaf5Ahu0lziGEwWzrGONThSsnb3U9pqoY6BpqviN4h+Guw5oEdHr1T/eDkQD5urgQUaZA6lDoU9XC662r+0kpbKidvXIsK2CrShN+BF8HEJmRZuhglxh25OHWIWqQiUDjLZC+QJRZqUu9Uzy9RBBu7qa0f0xbqYl3hnYi+vH++SsyOavO2gUVQyKU5Kkt5ZJVpZFQvD3BXePgwJSpsvrjhj0hiYp2v6PScN9XHP1vXB4wtIYSFYwmVus1KkV/LfDzUm6zHjliHYTVl6lPMhveIVJlRIqInRZRHxg5QIDAQAB
merRsaPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCc1mku1mtfTc1vZM9z3TkRMZ9SaKP+6MdoQhjDHB9vJUOuG2Jnegej4gtzcm8MVYomV1azJMtCbPq4PN9aHegH13JthvrUPR3nAKp8AUp9Fh47ded//snNyAf7C7o8xKN5e7n89ROwacCAL2QDno76ngXzQQVj1TxY9pBdekZ03ezuDk1sv/u4FBlW8kRyaVdqyl4FdvP+EEljDe8gGxRikLyb3cK1B6G7w2BXgM/svft5SOoiqStx2XvgHRrFRB5w96TdoKNH9yxHU2clMJiz+5cej1VL6OHZspuY3cnPyJtyS+weYjDT+COLLBUe9UwbOV15DXDNpBLd34W4GiqtAgMBAAECggEAYaVwmVOwSAblp7wJGScb16OggStbJ2MAe93jEt7Yh1eZGrY7/xbP2O3smTUfBHvhZlusRB7dWf8F3l0v5iiGhRNTT/PhCPEARAl7G3emS9jQe869kkgslq06ose7bQg0i3dH5cEkQAqnameXClXWyRxHshrCY1SonO7uFPUDFtD2Z9GHu6dOWkOHfX7UETHV5/NTSqvner5M2YNsV/5To87zrmaeeNyvu91JgJSYofTD8IcMyhxcswxB9F3ECP7nulLDdCV+9mvE9zO0i4mPBxYb++87J0pu35TN9OY+gpiCK3Ed0gDqvvkTiCQEFu6y7OiqsQwy03CE5hAwWZR2YQKBgQDdb6e7+FWJSr9fIknfvZPPtKmbEkMHP1RYnVo3pmuVm14Z3UmostiSBRPMfVjeOX0N82SONM9P+1v9SDgSK3pL8rlk9Hx6D5KI7uj2IMtTVt00pO31KtxDLmXfgapDbWHK1RGEn1PDrnKYy5yOKJ8n0Wgp4lVEPIBN6uIud0A9iQKBgQC1UXdhEXFETyqEYWb9OnWbBjiVIw3D2/qW5c+WQGsHYdMEImC/0oTWIH9fKd4Azf26JjZ9nQvs5VcijJP6BXbGPqir5NgGVkwCj33PoNg4dDgIVE4BYaSp//7B6jCi5QiRTzCSOmUSkZ5L1Kz4SNEDe9r0MpLhxrsAzmR9aEJ/BQKBgHI71Ks63F2cSwd39+ZNtYA0cj7Gd/+4IvooCs+kseGXKj9rkkFOKj2CEwmuLHdP7vyQcHKQOdbIFFegtxRgi5G8oPm8yq5pdC3iGhpHJr1SlYFACGYu+zxJJlLcYIqyVf2+V3A0hZDwYLwEZjpMKHbxJ6xbz6MJFyObJZ3U9TYJAoGANXoGjJF5Z501u/+CQZN5VjSagZnqGGcL3G+BLx5msrGua9y7zjeHyCOjjWyqtnAKsllM3vVvq/nkHiN6DVaJNmUKmFARSqUvG944TAFzZAsa75H1w8CJsT34ZDbvC0wjn7/MYoRohPZ/ynu6XCwVwUJJTJaR7ZcQVmeJCdezLQUCgYEAszix6V9oL80Clb1nMwIly6I78+pcFKyk82yXxvySb6XPJvgoasbz9xYIeKlPyy6r8Aj/ujz5GVtDtkE6n6bsjekCdnUKUY3uTvFAX+YGQkuZnaPoisELJFI2Hal22tNnJyCOYh//AGAiHYpHNUKD4hsKBb45MhK1xwvTHpuLkdc=
backUrl: http://192.168.1.71:8080/easypay/trade/callback

View File

@ -375,6 +375,9 @@ wechat:
transfer-notify-url: https://a94aeb5582c2.ngrok-free.app/no-auth/wechat/notify # 转账回调地址
app-id: wxebcdaea31881caab # 应用ID
secret: your_wechat_secret # 应用密钥
mini-program:
app-id: wx87a5db19138da60d
secret: your_wechat_secret
http:
client:

View File

@ -0,0 +1,47 @@
package com.wzj.soopin.transaction.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "easypay")
public class EasypayConfig {
/**
* 易生接口请求地址前缀
*/
private String apiPathPrefix;
/**
* 易生分配的机构号
*/
private String reqId;
/**
* 易生分配的商户号
*/
private String mchtCode;
/**
* 微信子商户号
*/
private String wechatMchid;
/**
* 易生公钥
*/
private String easypayPublicKey;
/**
* 商户私钥
*/
private String merRsaPrivateKey;
/**
* 易生异步回调通知地址
*/
private String backUrl;
}

View File

@ -0,0 +1,16 @@
package com.wzj.soopin.transaction.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "wechat.mini-program")
public class WechatMiniProgramConfig {
private String appId;
private String secret;
}

View File

@ -0,0 +1,67 @@
package com.wzj.soopin.transaction.constans;
/**
* 易生接口涉及常量
*/
public interface EasypayConstants {
/**
* 请求方类型.1商户2拓展机构 默认是1
* 1商户模式下reqId即为商户号mchtCode
* 2机构模式下reqId即为拓展机构编号
*/
public static final String REQ_TYPE = "2";
/**
* 生成订单前缀
*/
public static final String TRACE_PREFIX = "wzj";
/**
* 支付订单超时时长,单位:
*/
public static final Long TRACE_TIMEOUT = 180L;
/**
* 通讯返回码-成功
*/
public static final String RSP_HEADER_OK = "000000";
/**
* 业务返回码-成功
*/
public static final String RSP_BODY_RESP_OK = "000000";
/**
* 交易状态返回码-交易成功
*/
public static final String RSP_BODY_TRANS_OK = "0";
/**
* 交易状态返回码-交易部分成功
*/
public static final String RSP_BODY_TRANS_PARTIALLY_OK = "1";
/**
* 交易状态返回码-支付成功待发货
*/
public static final String RSP_BODY_TRANS_OK_WETCAT = "2";
/**
* 交易状态返回码-支付中,需查询或接收通知获取最终状态
*/
public static final String RSP_BODY_TRANS_PROCESSING = "9";
/**
* 交易状态返回码-交易失败
*/
public static final String RSP_BODY_TRANS_FAIL = "X";
/**
* 交易状态返回码-已退款
*/
public static final String RSP_BODY_REFUND_OK = "R";
}

View File

@ -0,0 +1,61 @@
package com.wzj.soopin.transaction.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.wzj.soopin.transaction.domain.bo.PaymentBO;
import com.wzj.soopin.transaction.domain.bo.easypay.EasyPayRequest;
import com.wzj.soopin.transaction.domain.vo.EasypayPrePayVO;
import com.wzj.soopin.transaction.service.IEasypayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.rmi.ServerException;
import java.util.HashMap;
import java.util.Map;
/**
* 易生支付结果通知回调
*/
@RestController
@Slf4j
@RequestMapping("/easypay")
@RequiredArgsConstructor
public class EasypayCallbackController {
private final IEasypayService easypayService;
/**
* 处理易生支付结果通知回调
* @param request
* @return
*/
@SaIgnore
@Log(title = "易生支付结果通知回调", businessType = BusinessType.UPDATE)
@PostMapping("/trade/callback")
public Map tradeCallback(@RequestBody EasyPayRequest request) {
easypayService.handlerTradeCallback(request);
HashMap<Object, Object> map = new HashMap<>();
map.put("code", "000000");
map.put("msg", "Success");
return map;
}
/**
* 测试发起支付
* @param request
* @return
*/
@SaIgnore
@Log(title = "测试发起支付", businessType = BusinessType.OTHER)
@PostMapping("/test/trade")
public R<EasypayPrePayVO> testTrade(@RequestBody PaymentBO paymentBO) throws ServerException {
EasypayPrePayVO easypayPrePayVO = easypayService.payment(paymentBO);
return R.ok(easypayPrePayVO);
}
}

View File

@ -11,6 +11,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
@ -20,7 +21,6 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -179,6 +179,22 @@ public class WxPayController {
}
}
/**
* 通过小程序的授权码获取用户的openid
*
* @param code 授权码
* @return 包含openid的响应对象
*/
@Tag(name = "获取用户openid")
@GetMapping("/openid2")
@Parameters({
@Parameter(name = "code", description = "授权码", required = true, in = ParameterIn.QUERY)
})
public R<WxAuthResponse> getOpenIdByMiniProgramCode(@RequestParam String code) {
WxAuthResponse response = wxAuthService.getOpenIdByMiniProgramCode(code);
return R.ok(response);
}
}

View File

@ -0,0 +1,99 @@
package com.wzj.soopin.transaction.domain.bo;
import com.wzj.soopin.transaction.enums.easypay.PayType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 支付请求参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PaymentBO {
private String memberId;
private String goodsId;
/**
* 订单标题对应支付宝订单里的 商品说明微信订单里的商品
*/
private String orderSub;
/**
* 订单描述
*/
private String orderDes;
/**
* 订单金额单位分最小1
*/
private long transAmount;
/**
* 支付方式
*/
private PayType payType;
/**
* 支付宝业务参数:买家的支付宝唯一用户号
*/
private String buyerId;
/**
* 微信业务参数:微信用户子标识
*/
private String subOpenId;
// ============银联业务参数 start ==============
/**
* 交易类型
*/
private String transType;
/**
* 授权码
*/
private String userAuthCode;
/**
* 用户标识对应旧系统的payerId
*/
private String userId;
/**
* 地区信息7位1-3为国家代码境内业务统一为1564-7位为地区码采用银联卡跨行业务地区代码标准境外商户受理的二维码业务地区代码用全0 填充 点击
* [地区码](https://www.yuque.com/pandans/ws1g9s/loa46fu6isbvoksz#n3L1v)
* <p>
* 上海市上海市浦东新区 则传 1562904
*/
private String areaInfo;
/**
* 支付有效时间允许对一个订单进行支付的最长相对时间单位为秒
*/
private String paymentValidTime;
/**
* 二维码payType=UnionPayJsapiUnionPayJsMini时必填
* 二维码表示的数据内容为特定格式的URL或TLV其中境内二维码采用URL格式境外二维码采用TLV格式见附录F21.
*/
private String qrCode;
/**
* 二维码类型payType=UnionPayJsapiUnionPayJsMini时必填
*/
private String qrCodeType;
/**
* 支付方式payType=UnionPayJsMini时必填
*/
private String payChannel;
/**
* 微信分配的公众账号IDpayType=UnionPayJsMini时必填上送调起云闪付微信小程序的微信APPID
*/
private String appid;
/**
* 银联支付标识payType=UnionPayJsMini时必填固定上送MicroMessenger
*/
private String appUpIdentifier;
// ============银联业务参数 end ==============
}

View File

@ -0,0 +1,24 @@
package com.wzj.soopin.transaction.domain.bo.easypay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 易企通接口请求实体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EasyPayRequest {
private EasyPayRequestHeader reqHeader;
private Object reqBody;
private String reqSign;
}

View File

@ -0,0 +1,40 @@
package com.wzj.soopin.transaction.domain.bo.easypay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 易企通接口请求头
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EasyPayRequestHeader {
//请求时间,当前时间yyyyMMddHHmmss
private String transTime;
//业务交易码
private String transCode;
// 请求流水号
private String transSequence;
// 密钥Id,商户号机构号等
private String reqId;
//请求方类型,1商户2拓展机构 默认是1. 1商户模式下reqId即为商户号mchtCode,2机构模式下reqId即为拓展机构编号
private String reqType;
//证书Id多证书情况下需要支持同一个reqId下有多证书
private String certificateId;
//易生证书Id多证书情况下需要为空时使用默认证书
private String easyPayCertificateId;
}

View File

@ -0,0 +1,24 @@
package com.wzj.soopin.transaction.domain.bo.easypay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 易企通接口响应实体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EasyPayResponse {
private EasyPayResponseHeader rspHeader;
private Object rspBody;
private String rspSign;
}

View File

@ -0,0 +1,33 @@
package com.wzj.soopin.transaction.domain.bo.easypay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 易企通接口响应头
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EasyPayResponseHeader {
// 应答码 000000-成功其他失败
private String rspCode;
// 应答消息,错误信息
private String rspInfo;
//业务交易码, 同请求
private String transCode;
// 请求流水号同请求
private String transSequence;
//易生证书Id多证书情况下需要为空时使用默认证书
private String easyPayCertificateId;
}

View File

@ -0,0 +1,42 @@
package com.wzj.soopin.transaction.domain.bo.easypay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 支付信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PayInfo {
/**
* 业务场景建议上线前与产品经理确认
* 微信订单发货业务时必填送值说明参见2.业务指引/2.15微信订单发货
* 建议上线前与产品经理确认
*/
private String bizScen;
/**
* 业务类型
* 微信订单发货业务时必填送值说明参见2.业务指引/2.15微信订单发货
* 建议上线前与产品经理确认
*/
private String bizType;
/**
* 支付方式
* @See com.wzj.soopin.transaction.enums.easypay.PayType
*/
private String payType;
/**
* 产品代码yqt
*/
private String productCode;
/**
* 业务日期yyyyMMdd
*/
private String transDate;
}

View File

@ -0,0 +1,26 @@
package com.wzj.soopin.transaction.domain.bo.easypay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 请求方信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ReqInfo {
/**
* 商户号合作商户号易生提供
*/
private String mchtCode;
/**
* 终端号商户入网成功后可获得客户根据自己情况选择上送如需通过商服平台查询交易则建议上送易生提供
*/
private String termCode;
}

View File

@ -0,0 +1,41 @@
package com.wzj.soopin.transaction.domain.bo.easypay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 返回码信息规则详见F.1
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RespStateInfo {
/**
* 渠道返回码
*/
private String appendRetCode;
/**
* 渠道返回码描述
*/
private String appendRetMsg;
/**
* 易生状态码
*/
private String respCode;
/**
* 易生状态码描述
*/
private String respDesc;
/**
* 交易状态码
*/
private String transState;
/**
* 交易状态码描述
*/
private String transStatusDesc;
}

View File

@ -0,0 +1,251 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* 支付宝业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AliBizParam {
/**
* ali:商品详情列表订单包含的商品列表信息json格式
*/
private List<AliGoodsDetail> aliGoodsDetail;
/**
* 商户机具终端信息
*/
private Map<String, Map<String, Object>> aliTerminalParams;
/**
* ali:商户传入业务信息用于安全/营销等参数直传场景, json
*/
private String businessParams;
/**
* 买家的支付宝唯一用户号[点击查看获取userId](https://opendocs.alipay.com/open/02xtl7)
*/
private String buyerId;
/**
* 买家支付宝账号
*/
private String buyerLogonId;
/**
* ali:禁用支付渠道逗号分隔
* https://docs.open.alipay.com/common/wifww7多个渠道以逗号分割如同时禁用信用支付类型和积分则disable_pay_channels="credit_group,point"https://docs.open.alipay.com/common/wifww7
*/
private String disablePayChannels;
/**
* 可打折金额
*/
private String discountableAmount;
/** * 扩展参数可传支付宝能力使用分期付款信息格式为json字符串 * 1信用卡分期格式 * { "fq_num" : "3" , "fq_seller_percent" : "0", "fq_channels " : "alipayfq_cc"} * 2花呗分期格式 * { "hb_fq_num" : "3" , "hb_fq_seller_percent" : "0" } */
private String extendParams;
/**
* 实名支付信息
*/
private AliBizParamIdentity identity;
/**
* 商户操作员编号
*/
private String operatorId;
/**
* 描述分账信息
*/
private RoyaltyInfo royaltyInfo;
/**
* 卖家id
*/
private String sellerId;
/**
* 商户门店编号
*/
private String storeId;
/**
* 间联商户信息体
*/
private SubMerchant subMerchant;
/**
* 不可打折金额
*/
private String unDiscountableAmount;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class AliGoodsDetail {
/**
* 支付宝定义的统一商品编号
*/
private String alipayGoodsId;
/**
* 商品描述信息
*/
private String body;
/**
* 商品类目树从商品类目根节点到叶子节点的类目id组成类目id值使用|分割
*/
private String categoriesTree;
/**
* 商品类目
*/
private String goodsCategory;
/**
* 商品的编号
*/
private String goodsId;
/**
* 商品名称
*/
private String goodsName;
/**
* 商品单价单位
*/
private Double price;
/**
* 商品数量
*/
private Long quantity;
/**
* 商品的展示地址
*/
private String showUrl;
}
/**
* 实名支付信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class AliBizParamIdentity {
/**
* 证件号
*/
private String certNo;
/**
* 证件类型身份证 IDENTITY_CARD 护照 PASSPORT OFFICER_CARD SOLDIER_CARD户口本
* HOKOU need_check_info=T 该参数才有 IDENTITY_CARD28
*/
private String certType;
/**
* 数字信封见2.4
*/
private String dgtlEnvlp;
/**
* 是否强制校验付款人身份信息 T:强制校验 F不强制
*/
private String fixBuyer;
/**
* 允许的最小买家年龄买家年龄必须大于等于所传数值买家年龄必须大 于等于所传数值 1. need_check_info=T 时该参数才有效 2. min_age
* 为整数必须大于等于 0
*/
private Long minAge;
/**
* 手机号
*/
private String mobile;
/**
* 姓名
*/
private String name;
/**
* 是否强制校验身份信息T:强制校验 F不强制
*/
private String needCheckInfo;
}
/**
* 描述分账信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class RoyaltyInfo {
/**
* 分账明细的信息
*/
private List<RoyaltyDetailInfo> royaltyDetailInfos;
/**
* 分账类型卖家的分账类型
*/
private String royaltyType;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class RoyaltyDetailInfo {
/**
* 分账的金额
*/
private long amount;
/**
* 分账的比例
*/
private String amountPercentage;
/**
* 分账批次号
*/
private String batchNo;
/**
* 分账描述信息
*/
private String desc;
/**
* 商户分账的外部关联号
*/
private String outRelationId;
/**
* 分账序列号
*/
private String serialNo;
/**
* 如果转入账号类型为 userId本参 数为接受分账金额的支付宝账号对应的支付宝唯一用户号
*/
private String transIn;
/**
* 接受分账金额的账户类型
*/
private String transInType;
/**
* 如果转出账号类型为 userId本参数为要分账的支付宝账号对应的 支付宝唯一用户号
*/
private String transOut;
/**
* 要分账的账户类型
*/
private String transOutType;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class SubMerchant {
/**
* 间连受理商户的支付宝商户编号间连受理商户的支付宝商户编号
*/
private String merchantId;
/**
* 商户id类型商户id类型
*/
private String merchantType;
}
}

View File

@ -0,0 +1,79 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.lang.Nullable;
import java.util.List;
/**
* JSAPI支付接口请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class JsApiReqBody {
/**
* 请求方信息
*/
private ReqInfo reqInfo;
/**
* 基础订单信息
*/
private JsapiReqOrderInfo reqOrderInfo;
/**
* 支付信息
*/
private PayInfo payInfo;
/**
* 支付宝业务参数
*/
private @Nullable AliBizParam aliBizParam;
/**
* 微信业务参数
*/
private @Nullable WxBizParam wxBizParam;
/**
* 银联业务参数
*/
private @Nullable QrBizParam qrBizParam;
/**
* toC营销信息一笔交易请求中支持最多上送5条toC营销活动信息
*/
private @Nullable List<MarketingOrder> marketingOrders;
/**
* toB营销信息1一笔交易请求中仅可上送一个toB营销活动
* 2如上送toB营销活动则不再命中后台配置的手续费营销活动
* 3活动业务说明见2.7
*/
private @Nullable List<Promo> promos;
/**
* 清算信息三个标识互斥,三个标识互斥最多仅能其中一个送是非0
* 合单支付时主单清算标识本字段不起作用以各子单的清算标识为准
*/
private SettleParamInfo settleParamInfo;
/**
* 分账信息
*/
private @Nullable SeparateInfo separateInfo;
/**
* 合单信息
*/
private @Nullable List<MergeOrder> mergeOrders;
/**
* 合规信息
*/
private RiskData riskData;
/**
* 其他信息
*/
private @Nullable OtherParamInfo otherParamInfo;
}

View File

@ -0,0 +1,45 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 基础订单信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class JsapiReqOrderInfo {
/**
* 异步通知地址
*/
private String backUrl;
/**
* 订单描述
*/
private String orderDes;
/**
* 订单标题对应支付宝订单里的 商品说明微信订单里的商品
*/
private String orderSub;
/**
* 请求方自定义信息不作处理
*/
private String orgInfo;
/**
* 商户订单号商户生成请求易生的流水号同一日下商户号下唯一
*/
private String orgTrace;
/**
* 订单超时时间单位秒例如3分钟送180
*/
private String timeout;
/**
* 订单金额单位分最小1
*/
private long transAmount;
}

View File

@ -0,0 +1,45 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 分账信息子单支持分账
*
* 合单子单分账信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class JsapiSeparateInfo {
/**
* 商户号
*/
private String mchtCode;
/**
* 分账批次号分账批次流水号
*/
private String separaBatchTrace;
/**
* 分账单信息列表
*/
private List<SeparateInfo.SeparateOrderDetailList> separateOrderDetailList;
/**
* 商户终端号
*/
private String termCode;
/**
* 同批次分账金额合计单位分取值范围1-10000000000
*/
private long transSumAmt;
/**
* 同批次分账笔数取值范围1-10000000000
*/
private long transSumCount;
}

View File

@ -0,0 +1,43 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MarketingOrder {
/**
* 活动ID
*/
private Double activityId;
/**
* 营销金额币种默认CNY
*/
private String marketingCurrency;
/**
* 收银单营销请求扩展信息
*/
private Map<String, Object> marketingExtInfo;
/**
* 营销金额单位分
*/
private double marketingTransAmount;
/**
* 商户号与reqInfo中保持一致
*/
private String mchtCode;
/**
* 营销报名ID
*/
private Double registrationId;
/**
* 商户终端号非必填如上送需与reqInfo中保持一致
*/
private String termCode;
}

View File

@ -0,0 +1,83 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.DelaySettleFlag;
import com.wzj.soopin.transaction.enums.easypay.PatnerSettleFlag;
import com.wzj.soopin.transaction.enums.easypay.SplitSettleFlag;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MergeOrder {
/**
* 代理结算模式
*/
private String agentStlmMode;
/**
* 币种
*/
private String currency;
/**
* 请求方自定义信息
*/
private String customInfo;
/**
* 延时结算标识
*/
private DelaySettleFlag delaySettleFlag;
/**
* 下游手续费, 单位分
*/
private Double handlingFee;
/**
* 下游机构商户唯一标识
*/
private String orgSmerCode;
/**
* 小商户终端号
*/
private String orgSterminalCode;
/**
* 特殊计费
*/
private String otherFee;
/**
* D0标识0: 非D0交易即按进件商户开通功能结算周期结算
* 1: D0交易商户需开通了D0且此字段送1时会d0到账
* 默认值0
*/
private PatnerSettleFlag patnerSettleFlag;
/**
* 分账信息子单支持分账
*/
private JsapiSeparateInfo separateInfo;
/**
* 小商户号
*/
private String smallMchtCode;
/**
* 分账标识与主单分账标识互斥不能同时上送1
*/
private SplitSettleFlag splitSettleFlag;
/**
* 子单商户号子单商户号
*/
private String subMchtCode;
/**
* 商户子单流水号
*/
private String subOrgTrace;
/**
* 子单商户终端号
*/
private String subTermCode;
/**
* 子单商户订单金额单位分
*/
private double transAmount;
}

View File

@ -0,0 +1,47 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 其他信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class OtherParamInfo {
/**
* 请求方自定义信息
*/
private String customInfo;
/**
* 下游手续费
*/
private Double handlingFee;
/**
* 下游机构商户唯一标识
*/
private String orgSmerCode;
/**
* 小商户终端号
*/
private String orgSterminalCode;
/**
* 特殊计费
*/
private List<Specialfee> otherFee;
/**
* 所属项目
*/
private String projectId;
/**
* 小商户号
*/
private String smallMchtCode;
}

View File

@ -0,0 +1,22 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Promo {
/**
* 营销活动ID
*/
private String promoCode;
/**
* 营销金额单位分必须小于等于交易应收手续费金额
*/
private String promoFeeAmount;
}

View File

@ -0,0 +1,282 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.IDCheckIn;
import com.wzj.soopin.transaction.enums.easypay.LimitCreditPay;
import com.wzj.soopin.transaction.enums.easypay.PayChannel;
import com.wzj.soopin.transaction.enums.easypay.QrCodeType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 银联业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class QrBizParam {
/**
* AcqAddnData
*/
private AcqAddnData acqAddnData;
/**
* 微信分配的公众账号IDpayType=UnionPayJsMini时必填上送调起云闪付微信小程序的微信APPID
*/
private String appid;
/**
* 银联支付标识payType=UnionPayJsMini时必填固定上送MicroMessenger
*/
private String appUpIdentifier;
/**
* 地区信息7位1-3为国家代码境内业务统一为1564-7位为地区码采用银联卡跨行业务地区代码标准境外商户受理的二维码业务地区代码用全0 填充 点击
* [地区码](https://www.yuque.com/pandans/ws1g9s/loa46fu6isbvoksz#n3L1v)
* <p>
* 上海市上海市浦东新区 则传 1562904
*/
private String areaInfo;
/**
* 优惠码
*/
private String discountCode;
/**
* 前台失败通知地址与frontUrl同时出现
* APP侧未成功完成支付时调
* 银联将通过GET方式访问
* 本地址银联将在frontFailUrl
* 后附加付款中止原因码原因
* 码error_code取值如下
* 01 - APP付款失败
* 91 - 用户取消支付
*/
private String frontFailUrl;
/**
* 前台通知地址
*/
private String frontUrl;
/**
* 实名支付验证标识
*/
private IDCheckIn idCheckIn;
/**
* 实名支付验证地址当idCheckIn 取值为1时出现
*/
private String idCheckUrl;
/**
* UnionIdentity
*/
private QrBizParamIdentity identity;
/**
* 禁用支付渠道
*/
private LimitCreditPay limitCreditPay;
/**
* 商户交易索引若商户必须使用自身交易索引且无法使用orderNo作为交易主键发起撤销退货交易时出现
*/
private String merTransIndex;
/**
* 是否支持发票
*/
private String needReceipt;
/**
* 支付方式payType=UnionPayJsMini时必填
*/
private PayChannel payChannel;
/**
* PayeeInfo
*/
private PayeeInfo payeeInfo;
/**
* 支付有效时间允许对一个订单进行支付的最长相对时间单位为秒
*/
private long paymentValidTime;
/**
* 银联服务商信息json格式参数值示例如下
* <p>
* {"pnrOrderId":"1220250321034502483875104", "pidSct" :"lj8352@da099%ldang", "tradeScene"
* :"1"}
*/
private String pidInfo;
/**
* 二维码payType=UnionPayJsapiUnionPayJsMini时必填
* 二维码表示的数据内容为特定格式的URL或TLV其中境内二维码采用URL格式境外二维码采用TLV格式见附录F21.
*/
private String qrCode;
/**
* 二维码类型payType=UnionPayJsapiUnionPayJsMini时必填
*/
private QrCodeType qrCodeType;
/**
* 银联服务商机构标识码这是银联的渠道商号类似微信渠道商号24006513
*/
private String qrPnrInsIdCd;
/**
* 请求方自定义域
*/
private String reqReserved;
/**
* 交易类型参考
* [附录F1.2](https://apifox.com/apidoc/shared/9758ecc8-2c38-4ec6-914f-b09be6f563bc/doc-5524664)
*/
private String transType;
/**
* 授权码
*/
private String userAuthCode;
/**
* 用户标识对应旧系统的payerId
*/
private String userId;
/**
* AcqAddnData
*/
@lombok.Data
public static class AcqAddnData {
/**
* 自定义数据
*/
private String customData;
/**
* 商品信息商品明细内容
*/
private List<GoodsInfo> goodsInfos;
/**
* QrOrderInfo
*/
private OrderInfo orderInfo;
}
/**
* QrGoodsInfo白条支付下如涉及贴息信息可在本参数下上送信息参数说明详见F22
*/
@Data
public static class GoodsInfo {
/**
* 商品简述信息
*/
private String body;
/**
* 商品类目树
*/
private String categoriesTree;
/**
* 商品类目
*/
private String goodsCategory;
/**
* 商品编号
*/
private String goodsId;
/**
* 商品名称
*/
private String goodsName;
/**
* 商品单价
*/
private long price;
/**
* 商品数量
*/
private long quantity;
/**
* 商品的展示地址
*/
private String showUrl;
/**
* 支付宝定义的统一商品编号
* 第三方商品编号
*/
private String thirdGoodsId;
}
/**
* QrOrderInfo
*/
@Data
public static class OrderInfo {
/**
* 附件信息
* <p>
* 如需京东白条支付可在此参数下上送白条相应参数详细参数见附录F22
*/
private String addnInfo;
/**
* 可优惠金额
*/
private String dctAmount;
/**
* 订单描述
*/
private String description;
/**
* 订单标题
*/
private String title;
}
/**
* UnionIdentity
*/
@lombok.Data
public static class QrBizParamIdentity {
/**
* 证件号
*/
private String certNo;
/**
* 证件类型
*/
private String certType;
/**
* 数字信封
*/
private String dgtlEnvlp;
/**
* 手机号
*/
private String mobile;
/**
* 证件姓名
*/
private String name;
}
/**
* PayeeInfo
*/
@lombok.Data
public static class PayeeInfo {
/**
* 商户类别
*/
private String mchtMccCode;
/**
* 商户英文名称
*/
private String nameEng;
/**
* 收款方账号
*/
private String payeeAcctNo;
/**
* 账号类型
*/
private String payeeAcctType;
/**
* 二级商户代码
*/
private String subMchtCode;
/**
* 二级商户名称
*/
private String subMchtName;
}
}

View File

@ -0,0 +1,137 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 合规信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RiskData {
/**
* 用户ip
*/
private String customerIp;
/**
* 终端信息
*/
private TerminalInfo terminalInfo;
/**
* 终端信息
*/
@Data
public static class TerminalInfo {
/**
* 终端版本号
*/
private String appVersion;
/**
* 终端位置地区编码
*/
private String areaNo;
/**
* 终端位置国家编码
*/
private String ctryNo;
/**
* 加密随机数
*/
private String encryptRandNum;
/**
* ICCIDSIM卡卡号
*/
private String iccId;
/**
* 基站编号 1
*/
private String lbsNum1;
/**
* 基站编号 2
*/
private String lbsNum2;
/**
* 基站编号 3
*/
private String lbsNum3;
/**
* 基站信号 1
*/
private String lbsSignal1;
/**
* 基站信号 2
*/
private String lbsSignal2;
/**
* 基站信号 3
*/
private String lbsSignal3;
/**
* 终端实时经纬度信息
*/
private String location;
/**
* 位置区域码 1
*/
private String locationCd1;
/**
* 位置区域码 2
*/
private String locationCd2;
/**
* 位置区域码 3
*/
private String locationCd3;
/**
* 基站信息移动国家代码
*/
private String mobileCountryCd;
/**
* 基站信息移动网络号码
*/
private String mobileNetNum;
/**
* 网络授权
*/
private String networkLicense;
/**
* 密钥文本
*/
private String secretText;
/**
* 终端序列号
*/
private String serialNum;
/**
* 电信基站信号
*/
private String telecomLbs;
/**
* 电信网络识别码
*/
private String telecomNetId;
/**
* 电信系统识别码
*/
private String telecomSysId;
/**
* 终端编号
*/
private String terminalId;
/**
* 终端IP终端信息非必填但如果送了终端信息则terminalIp必填
*/
private String terminalIp;
/**
* 终端类型
*/
private String terminalType;
}
}

View File

@ -0,0 +1,87 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.DelaySettleFlag;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 分账信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateInfo {
/**
* 分账商户号即发起分账方分账资金来源方
*/
private String oriSeparateMchtCode;
/**
* 分账流水号商户号下唯一
*/
private String separaBatchTrace;
/**
* 分账订单明细
*/
private List<SeparateOrderDetailList> separateOrderDetailList;
/**
* 分账订单总金额单位分
*/
private long transSumAmt;
/**
* 分账订单总笔数
*/
private long transSumCount;
/**
* 分账订单明细
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class SeparateOrderDetailList {
/**
* 分账订单标题
*/
private String body;
/**
* 分账D0标识D0需提前开通
*/
private DelaySettleFlag isD0;
/**
* 分账收款方商户号可以商户号或分账接收方编号
*/
private String receiveMchtCode;
/**
* 分账手续费承担本金金额金额和比例2选1必填
*/
private Long sepaFeeAmount;
/**
* 分账手续费承担本金比例金额和比例2选1必填30代表30%仅可上送整数
*/
private Long sepaFeeRatio;
/**
* 分账子单流水号
*/
private String separateTrade;
/**
* 分账比例分账金额和分账比例2选一必填30代表30%仅可上送整数
*/
private Long sepaRatio;
/**
* 分账金额分账金额和分账比例2选一必填单位分
*/
private Long sepaTransAmount;
/**
* 分账订单描述
*/
private String subject;
}
}

View File

@ -0,0 +1,35 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.DelaySettleFlag;
import com.wzj.soopin.transaction.enums.easypay.PatnerSettleFlag;
import com.wzj.soopin.transaction.enums.easypay.SplitSettleFlag;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 清算信息三个标识互斥,三个标识互斥最多仅能其中一个送是非0
* 合单支付时主单清算标识本字段不起作用以各子单的清算标识为准
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SettleParamInfo {
/**
* 延时结算标识
* {@link DelaySettleFlag}
*/
private String delaySettleFlag;
/**
* D0标识
* {@link PatnerSettleFlag}
*/
private String patnerSettleFlag;
/**
* 分账标识
* {@link SplitSettleFlag}
*/
private String splitSettleFlag;
}

View File

@ -0,0 +1,23 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.SpecialTag;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Specialfee {
/**
* 费用金额单位分
*/
private long feeAmount;
/**
* 费用类型
*/
private SpecialTag specialTag;
}

View File

@ -0,0 +1,201 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req;
import com.wzj.soopin.transaction.enums.easypay.WxLimitPay;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 微信业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WxBizParam {
/**
* 微信分配的公众账号ID微信分配的公众账号ID企业号corpid即为此appid
*/
private String appId;
/**
* 附加数据在查询API和支付通知中原样返回该字段主要用于商户携带订单的自定义数据
*/
private String attach;
/**
* 单品优惠功能字段
*/
private Detail detail;
/**
* 订单优惠标记用于区分订单是否可以享受优惠字段内容在微信后台配置券时进行设置
*/
private String goodsTag;
/**
* 实名信息
*/
private WxBizParamIdentity identity;
/**
* 是否支持发票
*/
private Boolean needReceip;
/**
* 用户标识
*/
private String openId;
/**
* 商品描述
*/
private String orderBody;
/**
* 微信场景信息该字段用于上报场景信息目前支持上报实际门店信息该字段为JSON对象数据对象格式为{"store_info":{"id": "门店ID","name":
* "名称","area_code": "编码","address": "地址" }}
*/
private SceneInfo sceneInfo;
/**
* 微信分配的子商户公众账号ID
*/
private String subAppid;
/**
* 用户子标识[点击查看获取openid](https://pay.weixin.qq.com/doc/v3/partner/4012081935)
*/
private String subOpenId;
/**
* 交易限制支付类型
*/
private WxLimitPay wxLimitPay;
/**
* 单品优惠功能字段
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Detail {
/**
* 订单原价1.商户侧一张小票订单可能被分多次支付订单原价用于记录整张小票的交易金额<br />2.当订单原价与支付金额不相等则不享受优惠<br
* />3.该字段主要用于防止同一张小票分多次支付以享受多次优惠的情况正常支付订单不必上传此参数
*/
private Long costPrice;
/**
* 单品列表单品信息使用Json数组格式提交
*/
private List<GoodsDetail> goodsDetail;
/**
* 商家小票ID商家小票ID
*/
private String receiptid;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class GoodsDetail {
/**
* 商品编码由半角的大小写字母数字中划线下划线中的一种或几种组成
*/
private String goodsid;
/**
* 商品名称商品的实际名称
*/
private String goodsName;
/**
* 商品单价单位为如果商户有优惠需传输商户优惠后的单价(例如用户对一笔100元的订单使用了商场发的优惠券100-50则活动商品的单价应为原单价-50)
*/
private Long price;
/**
* 商品数量用户购买的数量
*/
private Long quantity;
/**
* 微信侧商品编码微信支付定义的统一商品编号没有可不传
*/
private String wxpayGoodsid;
}
/**
* 实名信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class WxBizParamIdentity {
/**
* 证件号
*/
private String certNo;
/**
* 证件类型
*/
private String certType;
/**
* 数字信封
*/
private String dgtlEnvlp;
/**
* 手机号
*/
private String mobile;
/**
* 姓名
*/
private String name;
}
/**
* 微信场景信息该字段用于上报场景信息目前支持上报实际门店信息该字段为JSON对象数据对象格式为{"store_info":{"id": "门店ID","name":
* "名称","area_code": "编码","address": "地址" }}
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class SceneInfo {
/**
* 商户端设备号商户端设备号
*/
private String deviceid;
/**
* 用户的客户端IP用户的客户端IP
*/
private String payerClientip;
/**
* 门店信息门店信息
*/
private StoreInfo storeInfo;
}
/**
* 门店信息门店信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class StoreInfo {
/**
* 门店详细地址门店详细地址
*/
private String address;
/**
* 门店所在地行政区划码门店所在地行政区划码
*/
private String areaCode;
/**
* 门店唯一标识门店唯一标识
*/
private String id;
/**
* 门店名称门店名称
*/
private String name;
}
}

View File

@ -0,0 +1,22 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* ali业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AliRespParamInfo {
/**
* 调起支付宝支付参数调起支付宝支付参考
* [附录F.15](https://apifox.com/apidoc/shared/9758ecc8-2c38-4ec6-914f-b09be6f563bc/doc-5662571)
*/
private String tradeNo;
}

View File

@ -0,0 +1,39 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* JSAPI支付接口响应
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class JsApiRespBody {
/**
* 返回码信息规则详见F.1
*/
private RespStateInfo respStateInfo;
/**
* 基础订单信息
*/
private JsapiRespOrderInfo respOrderInfo;
/**
* ali业务参数
*/
private AliRespParamInfo aliRespParamInfo;
/**
* wx业务参数
*/
private WxJsApiRespParamInfoVO wxRespParamInfo;
/**
* 银联业务参数
*/
private QrJsApiRespParamInfoVO qrRespParamInfo;
}

View File

@ -0,0 +1,151 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
import com.wzj.soopin.transaction.enums.easypay.AddCalcType;
import com.wzj.soopin.transaction.enums.easypay.BillingCycle;
import com.wzj.soopin.transaction.enums.easypay.CardType;
import com.wzj.soopin.transaction.enums.easypay.FeeType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 基础订单信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class JsapiRespOrderInfo {
/**
* 商户费率信息
*/
private Empty mchtRateList;
/**
* 商户订单号商户生成请求易生的流水号
*/
private String orgTrace;
/**
* 易生订单号易生生成后上送渠道的订单号
*/
private String outTrace;
/**
* 渠道订单号渠道生成返回给易生的订单号例如微信支付宝订单号
*/
private String pcTrace;
/**
* 产品订单号易生系统内流转的订单号求易生的流水号
*/
private String productTrace;
/**
* 交易金额单位分
*/
private Long transAmount;
/**
* 银联订单号
*/
private String unTrace;
/**
* 商户费率信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
private static class Empty {
/**
* 附加手续费计算方式
*/
private AddCalcType addCalcType;
/**
* 附加手续费值单位
*/
private String addCalcVal;
/**
* 交易金额最高值单位
*/
private String amtHighLt;
/**
* 交易金额最低值单位
*/
private String amtLowLt;
/**
* 结算周期
*/
private BillingCycle billingCycle;
/**
* 手续费计算方式
*/
private AddCalcType calcType;
/**
* 手续费费率值按笔单位为分按比例为百万比
*/
private String calcVal;
/**
* 卡机构编号见F.10
*/
private String cardIssuerCode;
/**
* 卡类型
*/
private CardType cardType;
/**
* 生效时间
*/
private String effDatetime;
/**
* 失效时间
*/
private String expDatetime;
/**
* 手续费处理模式
*/
private String feeCalcMode;
/**
* 手续费最高值单位
*/
private String feeHighLimit;
/**
* feeId
*/
private String feeId;
/**
* 手续费承担机构
*/
private String feeInst;
/**
* 手续费最低值单位
*/
private String feeLowLimit;
/**
* 手续费费用类型
*/
private AddCalcType feeMode;
/**
* 手续费处理模式
*/
private FeeType feeType;
/**
* 分期期数
*/
private String instalNum;
/**
* 是否需求配置费率
*/
private String isNeedConfigFee;
/**
* 是否允许退货
*/
private AddCalcType isRefundFee;
/**
* 优先级
*/
private String levelOrder;
/**
* 内部商户号
*/
private String mchtCode;
}
}

View File

@ -0,0 +1,21 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 银联业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class QrJsApiRespParamInfoVO {
/**
* 云闪付支付调用凭证payType=UnionPayJsMini时需要用此参数拼接跳转至云微小程序具体跳转方法见F.17.
*/
private String qrRedirectUrl;
}

View File

@ -0,0 +1,26 @@
package com.wzj.soopin.transaction.domain.bo.easypay.jsapi.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* wx业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WxJsApiRespParamInfoVO {
/**
* 调起微信支付参数调起微信支付调起参考
* [附录F.15](https://apifox.com/apidoc/shared/9758ecc8-2c38-4ec6-914f-b09be6f563bc/doc-5662571)
*/
private String wcPayData;
/**
* 预支付交易会话标识
*/
private String prepayId;
}

View File

@ -0,0 +1,85 @@
package com.wzj.soopin.transaction.domain.bo.easypay.refund.apply.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* AT交易退货请求扩展信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class QrCodeRefundExt {
/**
* 退款货币种类
*/
private String currency;
/**
* 商品详情列表
*/
private List<GoodsDetail> goodsDetail;
/**
* 商户的操作员编号
*/
private String operatorId;
/**
* 查询选项
*/
private List<String> queryOption;
/**
* 退款原因
*/
private String refundReason;
/**
* 商户的门店编号
*/
private String storeCode;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class GoodsDetail {
/**
* 支付宝定义的统一商品编号
*/
private String alipayGoodsid;
/**
* 商品描述信息
*/
private String body;
/**
* 商品类目树
*/
private String categoriesTree;
/**
* 商品类目
*/
private String goodsCategory;
/**
* 商品的编号
*/
private String goodsid;
/**
* 商品名称
*/
private String goodsName;
/**
* 商品单价单位
*/
private Double price;
/**
* 商品数量
*/
private Long quantity;
/**
* 商品的展示地址
*/
private String showurl;
}
}

View File

@ -0,0 +1,34 @@
package com.wzj.soopin.transaction.domain.bo.easypay.refund.apply.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 发起退款请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RefundApplyReqBody {
/**
* 请求方信息
*/
private ReqInfo reqInfo;
/**
* 基础订单信息
*/
private RefundReqOrderInfo reqOrderInfo;
/**
* AT交易退货请求扩展信息
*/
private QrCodeRefundExt qrCodeRefundExt;
/**
* 支付信息
*/
private PayInfo payInfo;
}

View File

@ -0,0 +1,40 @@
package com.wzj.soopin.transaction.domain.bo.easypay.refund.apply.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 基础订单信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RefundReqOrderInfo {
/**
* 下游手续费
*/
private Double handlingFee;
/**
* 商户订单号商户生成请求易生的流水号
*/
private String orgTrace;
/**
* 原商户订单号传的是支付交易的orgTrace代表要退哪笔支付交易, 可以是主单订单号和子单订单号
*/
private String oriOrgTrace;
/**
* 原订单outTraceoriOrgTrace与oriOutTrace二选一必填
*/
private String oriOutTrace;
/**
* 原业务日期原交易业务日期格式yyyyMMdd
*/
private String oriTransDate;
/**
* 退款金额单位分 separate
*/
private long refundAmount;
}

View File

@ -0,0 +1,32 @@
package com.wzj.soopin.transaction.domain.bo.easypay.refund.apply.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp.SettleRespParamInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 发起退款响应体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RefundApplyRespBody {
/**
* 基础订单信息
*/
private RefundRespOrderInfo respOrderInfo;
/**
* 返回码信息详见
* [附录F.1](https://apifox.com/apidoc/shared/9758ecc8-2c38-4ec6-914f-b09be6f563bc/doc-5523713)
*/
private RespStateInfo respStateInfo;
/**
* 清算信息
*/
private SettleRespParamInfo settleRespParamInfo;
}

View File

@ -0,0 +1,49 @@
package com.wzj.soopin.transaction.domain.bo.easypay.refund.apply.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RefundRespOrderInfo {
/**
* 请求方自定义信息
*/
private String orgInfo;
/**
* 商户订单号商户生成请求易生的流水号
*/
private String orgTrace;
/**
* 原商户订单号
*/
private String oriOrgTrace;
/**
* 原易生订单号
*/
private String oriOutTrace;
/**
* 易生订单号易生生成后上送渠道的订单号
*/
private String outTrace;
/**
* 渠道订单号渠道生成返回给易生的订单号例如微信支付宝订单号
*/
private String pcTrace;
/**
* 产品订单号
*/
private String productTrace;
/**
* 退货金额单位分
*/
private Long refundAmount;
/**
* 银联订单号
*/
private String unTrace;
}

View File

@ -0,0 +1,31 @@
package com.wzj.soopin.transaction.domain.bo.easypay.refund.query.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.refund.apply.req.RefundReqOrderInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 退款查询请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RefundQueryReqBody {
/**
* 支付信息
*/
private PayInfo payInfo;
/**
* 请求方信息
*/
private ReqInfo reqInfo;
/**
* 基础订单信息
*/
private RefundReqOrderInfo reqOrderInfo;
}

View File

@ -0,0 +1,30 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.apply.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 发起分账请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateApplyReqBody {
/**
* 支付信息
*/
private PayInfo payInfo;
/**
* 请求方信息
*/
private ReqInfo reqInfo;
/**
* 基础订单信息
*/
private SeparateReqOrderInfo reqOrderInfo;
}

View File

@ -0,0 +1,63 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.apply.req;
import com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req.SeparateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateReqOrderInfo {
/**
* 异步通知地址
*/
private String backUrl;
/**
* 原商户交易的orgTrace需要对哪笔交易进行分账就传那笔交易的orgTrace就是支付交易的orgTrace
*/
private String oriOrgTrace;
/**
* 原商户交易日期
*/
private String oriTransDate;
/**
* 营销信息仅支持ToB营销活动
*/
private List<PromoList> promoList;
/**
* 分账总单流水号分账批次号自定义要唯一
*/
private String separateBatchTrace;
/**
* 分账子单明细可送多条
*/
private List<SeparateInfo.SeparateOrderDetailList> separateOrderDetailList;
/**
* 分账订单总金额单位分
*/
private long transSumAmt;
/**
* 分账订单总笔数
*/
private long transSumCount;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class PromoList {
/**
* 营销ID
*/
private String promoCode;
/**
* 营销手续费金额
*/
private long promoFeeAmount;
}
}

View File

@ -0,0 +1,25 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.apply.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 发起分账响应体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateApplyRespBody {
/**
* 基础订单信息
*/
private SeparateRespOrderInfo respOrderInfo;
/**
* 返回码信息
*/
private RespStateInfo respStateInfo;
}

View File

@ -0,0 +1,70 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.apply.resp;
import com.wzj.soopin.transaction.enums.easypay.DelaySettleFlag;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateRespInfoList {
/**
* 分账单标题
*/
private String body;
/**
* 分账D0标识
*/
private DelaySettleFlag isD0;
/**
* 分账收款方商户号
*/
private String receiveMchtCode;
/**
* 当前分账单已退款金额总计
*/
private Long refundAmountSum;
/**
* 分账手续费承担本金金额
*/
private Long sepaFeeAmount;
/**
* 分账手续费承担本金比例
*/
private Long sepaFeeRatio;
/**
* 分账平台应结金额
*/
private Long sepaPlatStlmAmount;
/**
* 分账单流水号同一日期内唯一否则会因流水号重复而失败
*/
private String separateTrade;
/**
* 分账比例
*/
private Long sepaRatio;
/**
* 分账单状态处理中成功失败已退款
*/
private String sepaStatus;
/**
* 分账单状态说明
*/
private String sepaStatusDesc;
/**
* 分账实际结算金额
*/
private Long sepaStlmAmount;
/**
* 分账金额单位分
*/
private Long sepaTransAmount;
/**
* 分账订单描述
*/
private String subject;
}

View File

@ -0,0 +1,40 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.apply.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateRespOrderInfo {
/**
* 同批次分账笔数
*/
private Long batchNum;
/**
* 同批次分账金额合计
*/
private Long batchTransAmount;
/**
* 原商户交易的orgTrace
*/
private String oriOrgTrace;
/**
* 产品订单号
*/
private String productTrace;
/**
* 分账商户批次号同一日期内唯一否则会因为流水号重复失败
*/
private String separateBatchTrace;
/**
* 分账单信息列表
*/
private List<SeparateRespInfoList> separateRespInfoList;
}

View File

@ -0,0 +1,33 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.cancel.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CancelReqOrderInfo {
/**
* 商户订单号商户生成请求易生的流水号
*/
private String orgTrace;
/**
* 原分账总单流水
*/
private String oriSeparateBatchTrace;
/**
* 原分账子单流水号
*/
private String oriSeparateTrade;
/**
* 原业务日期
*/
private String oriTransDate;
/**
* 回退金额
*/
private long refundAmount;
}

View File

@ -0,0 +1,30 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.cancel.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 分账回退请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateCancelReqBody {
/**
* 支付信息
*/
private PayInfo payInfo;
/**
* 请求方信息
*/
private ReqInfo reqInfo;
/**
* 基础订单信息
*/
private CancelReqOrderInfo reqOrderInfo;
}

View File

@ -0,0 +1,106 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.cancel.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CancelRespOrderInfo {
/**
* 同批次分账笔数
*/
private Long batchNum;
/**
* 同批次分账金额合计
*/
private Long batchTransAmount;
/**
* 商户订单号商户生成请求易生的流水号每次都要唯一
*/
private String orgTrace;
/**
* 原商户订单号
*/
private String oriOrgTrace;
/**
* 产品订单号
*/
private String productTrace;
/**
* 原分账批次号原分账总单流水号
*/
private String separateBatchTrace;
/**
* 分账单信息列表
*/
private List<SeparateRespInfoList> separateRespInfoList;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class SeparateRespInfoList {
/**
* 分账订单标题请求方上送
*/
private String body;
/**
* 分账-秒到标识(1: 0)
*/
private String isD0;
/**
* 分账收款方商户号请求方上送
*/
private String receiveMchtCode;
/**
* 当前分账单已退款金额总计
*/
private Long refundAmountSum;
/**
* 分账手续费承担金额(金额和比例都支持传,2选1),根据资产单金额来算比例请求方上送
*/
private Long sepaFeeAmount;
/**
* 分账手续费承担比例(金额和比例都支持传,2选1),30代表百万分之30请求方上送
*/
private Long sepaFeeRatio;
/**
* 分账平台应结金额
*/
private Long sepaPlatStlmAmount;
/**
* 分账单商户订单号请求方上送
*/
private String separateTrade;
/**
* 分账比例请求方上送
*/
private Long sepaRatio;
/**
* 分账单状态处理中成功失败已退款
*/
private String sepaStatus;
/**
* 分账单状态说明
*/
private String sepaStatusDesc;
/**
* 分账实际结算金额
*/
private Long sepaStlmAmount;
/**
* 分账金额请求方上送
*/
private Long sepaTransAmount;
/**
* 分账订单描述请求方上送
*/
private String subject;
}
}

View File

@ -0,0 +1,25 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.cancel.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 分账回退响应体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateCancelRespBody {
/**
* 基础订单信息
*/
private CancelRespOrderInfo respOrderInfo;
/**
* 返回码信息
*/
private RespStateInfo respStateInfo;
}

View File

@ -0,0 +1,21 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.query.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CancelQueryReqOrderInfo {
/**
* 原分账批次流水separateBatchTrace原分账总单流水号
*/
private String oriSeparateBatchTrace;
/**
* 原请求分账日期
*/
private String oriTransDate;
}

View File

@ -0,0 +1,30 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.query.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 分账查询请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateQueryReqBody {
/**
* 支付信息
*/
private PayInfo payInfo;
/**
* 请求方信息
*/
private ReqInfo reqInfo;
/**
* 基础订单信息
*/
private CancelQueryReqOrderInfo reqOrderInfo;
}

View File

@ -0,0 +1,99 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.query.resp;
import com.wzj.soopin.transaction.enums.easypay.SepaStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CancelQueryRespOrderInfo {
/**
* 同批次分账笔数
*/
private Long batchNum;
/**
* 同批次分账金额合计
*/
private Long batchTransAmount;
/**
* 分账总单流水号
*/
private String oriSeparateBatchTrace;
/**
* 产品订单号
*/
private String productTrace;
/**
* 分账单信息列表
*/
private List<SeparateRespInfoList> separateRespInfoList;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class SeparateRespInfoList {
/**
* 分账订单标题
*/
private String body;
/**
* 分账D0标识
*/
private String isD0;
/**
* 分账收款方商户号
*/
private String receiveMchtCode;
/**
* 当前分账单已退款金额总计
*/
private Long refundAmountSum;
/**
* 分账手续费承担本金金额
*/
private Long sepaFeeAmount;
/**
* 分账手续费承担本金比例
*/
private Long sepaFeeRatio;
/**
* 分账平台应结金额
*/
private Long sepaPlatStlmAmount;
/**
* 分账单商户订单号
*/
private String separateTrade;
/**
* 分账比例
*/
private Long sepaRatio;
/**
* 分账单状态处理中成功失败已退款
*/
private SepaStatus sepaStatus;
/**
* 分账单状态说明
*/
private String sepaStatusDesc;
/**
* 分账实际结算金额
*/
private Long sepaStlmAmount;
/**
* 分账金额
*/
private Long sepaTransAmount;
/**
* 分账订单描述
*/
private String subject;
}
}

View File

@ -0,0 +1,26 @@
package com.wzj.soopin.transaction.domain.bo.easypay.separate.query.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 查询分账响应体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SeparateQueryRespBody {
/**
/**
* 基础订单信息
*/
private CancelQueryRespOrderInfo respOrderInfo;
/**
* 返回码信息
*/
private RespStateInfo respStateInfo;
}

View File

@ -0,0 +1,57 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.notice.req;
import com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req.Promo;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 交易结果通知请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TradeNoticeReqBody {
/**
* ali业务参数
*/
private AliQueryRespParamInfoVO aliRespParamInfo;
/**
* toC营销信息
*/
private List<MarketingParamInfo> marketingRespParamInfoList;
/**
* toB营销信息
*/
private List<Promo> promos;
/**
* 银联业务参数
*/
private QrRespParamInfoVO qrRespParamInfo;
/**
* 基础订单信息
*/
private TradeQueryRespOrderInfo respOrderInfo;
/**
* 返回码信息规则详见F.1
*/
private RespStateInfo respStateInfo;
/**
* 风险控制信息
*/
private RiskInfo riskParamInfo;
/**
* 清算信息
*/
private SettleRespParamInfo settleRespParamInfo;
/**
* wx业务参数
*/
private WxQueryRespParamInfoVO wxRespParamInfo;
}

View File

@ -0,0 +1,54 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.req;
import com.wzj.soopin.transaction.domain.bo.easypay.PayInfo;
import com.wzj.soopin.transaction.domain.bo.easypay.ReqInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 交易查询请求体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TradeQueryReqBody {
/**
* 请求方信息
*/
private ReqInfo reqInfo;
/**
* 基础订单信息
*/
private ReqOrderInfo reqOrderInfo;
/**
* 支付信息
*/
private PayInfo payInfo;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class ReqOrderInfo {
/**
* 商户订单号要唯一代表本次请求
*/
private String orgTrace;
/**
* 原商户交易的orgTrace需要查询哪笔交易就传那笔交易的orgTrace
*/
private String oriOrgTrace;
/**
* 原订单outTraceoriOrgTrace与oriOutTrace二选一必填
*/
private String oriOutTrace;
/**
* 原商户交易日期yyyyMMdd
*/
private String oriTransDate;
}
}

View File

@ -0,0 +1,206 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AliQueryRespParamInfoVO {
/**
* 支付宝店铺编号 支付宝支付能力出现
*/
private String alipayStoreId;
/**
* 买家的支付宝唯一用户号
*/
private String buyerId;
/**
* 买方登录ID
*/
private String buyerLogonId;
/**
* 费率活动标识
*/
private String chargeFlags;
/**
* 支付货币类型 默认人民 CNY网联微信&银联微信必填网联支付宝&银联支付宝选填币种
*/
private String currency;
private AliDiscountsInfoVO discountsInfo;
/**
* 交易额外信息 网联支付宝渠道出现 特殊场景下与支付宝约定返回 json字符串
*/
private String extInfos;
private List<FundBillVO> fundBillList;
private HbFqPayInfo hbFqPayInfo;
/**
* 行业特殊信息 支付宝能力出现 例如在医保卡 支付业务中 向用户返回医疗信息
*/
private String industrySepcDetail;
/**
* 结算币种兑换标价币种汇率
*/
private String settleTransRate;
/**
* 商户门店编号 支付宝支付能力出现
*/
private String storeId;
/**
* 发生支付交易的商户门店名称
*/
private String storeName;
/**
* 商户机具终端编号 银联支付宝支付能力出现
*/
private String terminalId;
/**
* 标价币种兑换支付币种汇率
*/
private String transPayRate;
/**
* 买家名称 银联支付宝支付能力出现
*/
private String userName;
/**
* 买家用户类型
*/
private String userType;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class AliDiscountsInfoVO {
/**
* 商家优惠金额
*/
private Long mchtDiscountAmount;
/**
* 平台优惠金额
*/
private Long platDiscountAmount;
/**
* 优惠信息
*/
private List<AliDiscountsDetailVO> promotionDetail;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class FundBillVO {
/**
* 该支付工具类型所使用的金额
*/
private Long amount;
/**
* 银行卡支付时的银行代码
*/
private String bankCode;
/**
* 交易使用的资金渠道
*/
private String fundChannel;
/**
* 渠道所使用的资金类型
*/
private String fundType;
/**
* 渠道实际付款金额
*/
private Long realAmount;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class HbFqPayInfo {
/**
* 分期金额
*/
private Long fqAmount;
/**
* 花呗分期数
*/
private Long hbFqNum;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class AliDiscountsDetailVO {
/**
* 活动ID
*/
private String activityId;
/**
* 优惠券面额
*/
private Long amount;
/**
* 优惠券备注信息
*/
private String memo;
/**
* 商户出资
*/
private Long merchantContribute;
/**
* 优惠名称
*/
private String name;
/**
* 其他出资方出资金额
*/
private Long otherContribute;
/**
* 其他出资
*/
private List<OtherContribute> otherContributeDetails;
/**
* 券ID
*/
private String promotionId;
/**
* 如果使用的这张券是用户购买的则该字段代表用户在购买这张券时平台优惠的金额
*/
private Long purchaseAntContribute;
/**
* 如果使用的这张券是用户购买的则该字段代表用户在购买这张券时用户实际付款的金额
*/
private Long purchaseBuyerContribute;
/**
* 如果使用的这张券是用户购买的则该字段代表用户在购买这张券时商户优惠的金额
*/
private Long purchaseMerchanCcontribute;
/**
* 优惠类型
*/
private String type;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class OtherContribute {
/**
* 出资金额
*/
private Long contributeAmount;
/**
* 出资类型
*/
private String contributeType;
}
}

View File

@ -0,0 +1,51 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* 营销单返回
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MarketingParamInfo {
/**
* 活动id
*/
private Double activityId;
/**
* 营销币种
*/
private String currency;
/**
* 营销业务场景码
*/
private String marketingBusinessSceneCode;
/**
* 营销支付能力编号
*/
private String marketingPayAbilityCode;
/**
* 营销支付方式编号
*/
private String marketingPayMethodCode;
/**
* 营销报名id
*/
private Double registrationId;
/**
* 收银台营销请求扩展信息
*/
private Map<String, Map<String, Object>> respMarketingExtInfo;
/**
* 营销金额
*/
private Double transAmount;
private String upOrderNo;
}

View File

@ -0,0 +1,49 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 子单返回信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MergeOrderSubRespList {
/**
* 订单币种默认CNY
*/
private String currency;
/**
* 延时结算标识
*/
private String delaySettleFlag;
/**
* 秒到标识
*/
private String patnerSettleFlag;
/**
* 分账标识
*/
private String splitSettleFlag;
/**
* 子单请求流水号
*/
private String subOrgTrace;
/**
* 订单金额
*/
private String transAmount;
/**
* 交易状态码
*/
private String transState;
/**
* 交易状态说明
*/
private String transStatusDesc;
}

View File

@ -0,0 +1,121 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 银联业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class QrRespParamInfoVO {
private List<QrDiscountsDetailVO> discountsInfo;
/**
* QrPayerInfoInner
*/
private QrPayerInfo qrPayerInfo;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class QrDiscountsDetailVO {
/**
* 活动id
*/
private String activityId;
/**
* 附件信息
*/
private String addnInfo;
/**
* 金额
*/
private Long amount;
/**
* 项目发行发行优惠活动的平台或机构取值如下
* 银联卡券平台固定填写KQPT
* 付款方填写8 位付款方机构代码
*/
private String issuerId;
/**
* 姓名
*/
private String name;
/**
* 营销活动id
*/
private String promotionId;
/**
* 类型
*/
private String type;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class QrPayerInfo {
/**
* 卡号
*/
private String accNo;
/**
* 账户类型
*/
private String acctClass;
/**
* 卡属性01 借记卡
* 02 贷记卡含准贷记卡
*/
private String cardAttr;
/**
* 证件号码可选
* 取证件号后6 位数字
* 再左补0 到与原证件号
* 相同长度
*/
private String certifId;
/**
* 证件类型
*/
private String certifTp;
/**
* cvn2
*/
private String cvn2;
/**
* 卡有效期
*/
private String expired;
/**
* 付款方机构代码代表付款方机构
*/
private String issCode;
/**
* 手机号必选
* 银行卡预留手机号码
* 11 不包括+86 等信
* 银联将根据综合情
* 况决定是否送发卡行
* 验证
*/
private String mobile;
/**
* 姓名
*/
private String name;
/**
* 付款银行信息
*/
private String payerBankInfo;
}
}

View File

@ -0,0 +1,31 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 风险控制信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RiskInfo {
/**
* 终端IP
* 绑卡设备付款 APP所在的公网 IP可用于
* 定位所属地区不是 wifi 连接时的局域网 IP
* 局域网 IP 包括
* A 10.0.0.0-10.255.255.255
* B 172.16.0.0-172.31.255.255
* C 192.168.0.0-192.168.255.255
*/
private String terminalIp;
/**
* 终端位置 付款 APP设备 GPS 位置格式为纬度/经度 +表示北纬东经-表示南纬西经
*/
private String terminalLocation;
}

View File

@ -0,0 +1,49 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 清算信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SettleRespParamInfo {
/**
* 延迟结算标识(1: 0)
*/
private String delaySettleFlag;
/**
* D0标识(1: 0)
*/
private String patnerSettleFlag;
/**
* 分账标识(1:交易后分账 2交易中分账 0非分账交易)
*/
private String splitSettleFlag;
/**
* 手续费金额
*/
private Long fee;
/**
* 清算金额含手续费的金额
*/
private Long settleAmt;
/**
* 结算金额单位分.扣除手续费后的金额
*/
private Long finalAmt;
/**
* 支付完成/清算 日期yyMMdd
*/
private String settleDate;
/**
* 支付完成/清算时间HHMMSS
*/
private String settleTime;
}

View File

@ -0,0 +1,60 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import com.wzj.soopin.transaction.domain.bo.easypay.jsapi.req.Promo;
import com.wzj.soopin.transaction.domain.bo.easypay.RespStateInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 交易查询响应
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TradeQueryRespBody {
/**
* ali业务参数
*/
private AliQueryRespParamInfoVO aliRespParamInfo;
/**
* toC营销信息
*/
private List<MarketingParamInfo> marketingRespParamInfoList;
/**
* 子单返回信息
*/
private MergeOrderSubRespList mergeOrderSubRespList;
/**
* toB营销信息
*/
private List<Promo> promos;
/**
* 银联业务参数
*/
private QrRespParamInfoVO qrRespParamInfo;
/**
* 基础订单信息
*/
private TradeQueryRespOrderInfo respOrderInfo;
/**
* 返回码信息规则详见F.1
*/
private RespStateInfo respStateInfo;
/**
* 风险控制信息
*/
private RiskInfo riskParamInfo;
/**
* 清算信息
*/
private SettleRespParamInfo settleRespParamInfo;
/**
* wx业务参数
*/
private WxQueryRespParamInfoVO wxRespParamInfo;
}

View File

@ -0,0 +1,79 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 基础订单信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TradeQueryRespOrderInfo {
/**
* 付款卡类型详见F.9
*/
private String cardType;
/**
* 支付完成日期
*/
private String dateEnd;
/**
* 商户订单号商户生成请求易生的流水号
*/
private String orgTrace;
/**
* 易生订单号易生生成后上送渠道的订单号
*/
private String outTrace;
/**
* 实际付款金额用户实付金额与订单是否参与渠道优惠活动有关比如当订单发起金额1000参加渠道用户减免100实际付款金额为900
*/
private Long payAmount;
/**
* 渠道订单号渠道生成返回给易生的订单号例如微信支付宝订单号
*/
private String pcTrace;
/**
* 产品订单号
*/
private String productTrace;
/**
* 已退款金额总额
*/
private Long refundAmountSum;
/**
* 已分账金额总额
*/
private Long separateAmountSum;
/**
* 应结订单金额上游渠道清算金额与订单是否参与上游渠道优惠活动有关
* 1假如一笔微信订单1000参与了微信的满减1000-100比如由银行出资微信会按1000给我们结算这个应结金额=1000
* 2假如一笔微信订单1000由商户自己在微信那边配了营销活动且配的是从商户的结算款扣除营销款这时候微信按900来款应结金额=900
*/
private Long stlmAmount;
/**
* 已结算金额总额
*/
private Long stlmAmountSum;
/**
* 支付完成/清算时间
*/
private String timeEnd;
/**
* 交易金额
*/
private Long transAmount;
/**
* 银联订单号银联生成并返回给易生的订单号
*/
private String unTrace;
/**
* 用户唯一编码
*/
private String userId;
}

View File

@ -0,0 +1,135 @@
package com.wzj.soopin.transaction.domain.bo.easypay.trade.query.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/*
* wx业务参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WxQueryRespParamInfoVO {
/**
* 附加信息
*/
private String attach;
/**
* 付款银行类型
*/
private String cardIssuerCode;
/**
* 用户标识 微信在易生appid下面openid
*/
private String openId;
/**
* 子商户openId
*/
private String subOpenId;
/**
* 优惠信息
*/
private WxDiscountsInfoVO wxDiscountsInfo;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class WxDiscountsInfoVO {
/**
* 代金券金额
*/
private Long couponAmount;
/**
* 优惠详细信息
*/
private List<WxDiscountsDetailVO> discountsInfo;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class WxDiscountsDetailVO {
/**
* 活动ID
*/
private String activityId;
/**
* 优惠券面额
*/
private Long amount;
/**
* 优惠币种
*/
private String currency;
/**
* 单品列表
*/
private GoodsDetailRespVO goodsDetail;
/**
* 商户出资
*/
private Long merchantContribute;
/**
* 优惠名称
*/
private String name;
/**
* 其他出资方出资金额
*/
private Long otherContribute;
/**
* 券ID
*/
private String promotionId;
/**
* 优惠范围
*/
private String scope;
/**
* 优惠类型
*/
private String type;
/**
* 微信出资
*/
private Long wxpayContribute;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class GoodsDetailRespVO {
/**
* 商品优惠金额 单位为
*/
private Long discountAmount;
/**
* 商品编号
*/
private String goodsId;
/**
* 商品名称
*/
private String goodsName;
/**
* 商品备注
*/
private String goodsRemark;
/**
* 商品单价 单位为分
*/
private Long price;
/**
* 商品数量
*/
private Long quantity;
}
}

View File

@ -15,7 +15,7 @@ import java.math.BigDecimal;
*/
@Builder(toBuilder = true)
@Data
public class YishengAccountVO {
public class EasypayAccountVO {
/**
* 主键

View File

@ -0,0 +1,50 @@
package com.wzj.soopin.transaction.domain.vo;
import com.wzj.soopin.transaction.enums.easypay.PayType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EasypayPrePayVO {
private PayType payType;
private WxPrePayParamInfo wxPrePayParamInfo;
private String tradeNo;
private String QrRedirectUrl;
/**
* 微信网页或小程序中拉起支付的参数
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WxPrePayParamInfo {
private String appId;
private String timeStamp;
private String nonceStr;
private String signType;
private String paySign;
private String prepayId;
}
}

View File

@ -0,0 +1,32 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 附加手续费计算方式
*
* 手续费计算方式
*
* 手续费费用类型
*
* 是否允许退货
*/
public enum AddCalcType {
THE_0, THE_1;
public String toValue() {
return switch (this) {
case THE_0 -> "0";
case THE_1 -> "1";
};
}
public static AddCalcType forValue(String value) throws IOException {
return switch (value) {
case "0" -> THE_0;
case "1" -> THE_1;
default -> throw new IOException("Cannot deserialize AddCalcType");
};
}
}

View File

@ -0,0 +1,30 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 结算周期
*/
public enum BillingCycle {
D0, D1, DD, T1;
public String toValue() {
return switch (this) {
case D0 -> "D0";
case D1 -> "D1";
case DD -> "DD";
case T1 -> "T1";
};
}
public static BillingCycle forValue(String value) throws IOException {
return switch (value) {
case "D0" -> D0;
case "D1" -> D1;
case "DD" -> DD;
case "T1" -> T1;
default -> throw new IOException("Cannot deserialize BillingCycle");
};
}
}

View File

@ -0,0 +1,30 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 卡类型
*/
public enum CardType {
THE_000_C, THE_000_D, THE_000_U, XXXX;
public String toValue() {
return switch (this) {
case THE_000_C -> "000C";
case THE_000_D -> "000D";
case THE_000_U -> "000U";
case XXXX -> "XXXX";
};
}
public static CardType forValue(String value) throws IOException {
return switch (value) {
case "000C" -> THE_000_C;
case "000D" -> THE_000_D;
case "000U" -> THE_000_U;
case "XXXX" -> XXXX;
default -> throw new IOException("Cannot deserialize CardType");
};
}
}

View File

@ -0,0 +1,37 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 延时结算标识
*
* 分账D0标识D0需提前开通
*
* 分账D0标识
*
* D0标识
*/
public enum DelaySettleFlag {
THE_0, THE_1;
public String toValue() {
switch (this) {
case THE_0 -> {
return "0";
}
case THE_1 -> {
return "1";
}
}
return null;
}
public static DelaySettleFlag forValue(String value) throws IOException {
return switch (value) {
case "0" -> THE_0;
case "1" -> THE_1;
default -> throw new IOException("Cannot deserialize DelaySettleFlag");
};
}
}

View File

@ -0,0 +1,29 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 手续费处理模式
*/
public enum FeeType {
EARNING_EXPENSE, NETTING, OFFLINE;
public String toValue() {
return switch (this) {
case EARNING_EXPENSE -> "EARNING_EXPENSE";
case NETTING -> "NETTING";
case OFFLINE -> "OFFLINE";
};
}
public static FeeType forValue(String value) throws IOException {
return switch (value) {
case "EARNING_EXPENSE" -> EARNING_EXPENSE;
case "NETTING" -> NETTING;
case "OFFLINE" -> OFFLINE;
default -> throw new IOException("Cannot deserialize FeeType");
};
}
}

View File

@ -0,0 +1,39 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 实名支付验证标识
*/
public enum IDCheckIn {
EMPTY, THE_0, THE_1, THE_2;
public String toValue() {
switch (this) {
case EMPTY -> {
return "其他";
}
case THE_0 -> {
return "0";
}
case THE_1 -> {
return "1";
}
case THE_2 -> {
return "2";
}
}
return null;
}
public static IDCheckIn forValue(String value) throws IOException {
return switch (value) {
case "其他" -> EMPTY;
case "0" -> THE_0;
case "1" -> THE_1;
case "2" -> THE_2;
default -> throw new IOException("Cannot deserialize IDCheckIn");
};
}
}

View File

@ -0,0 +1,31 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 禁用支付渠道
*/
public enum LimitCreditPay {
CREDIT_CARD, DEBIT_CARD;
public String toValue() {
switch (this) {
case CREDIT_CARD -> {
return "creditCard";
}
case DEBIT_CARD -> {
return "debitCard";
}
}
return null;
}
public static LimitCreditPay forValue(String value) throws IOException {
return switch (value) {
case "creditCard" -> CREDIT_CARD;
case "debitCard" -> DEBIT_CARD;
default -> throw new IOException("Cannot deserialize LimitCreditPay");
};
}
}

View File

@ -0,0 +1,29 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* D0标识0: 非D0交易即按进件商户开通功能结算周期结算
* 1: D0交易商户需开通了D0且此字段送1时会d0到账
* 默认值0
*/
public enum PatnerSettleFlag {
EMPTY, THE_0, THE_1;
public String toValue() {
switch (this) {
case EMPTY: return "";
case THE_0: return "0";
case THE_1: return "1";
}
return null;
}
public static PatnerSettleFlag forValue(String value) throws IOException {
if (value.equals("")) return EMPTY;
if (value.equals("0")) return THE_0;
if (value.equals("1")) return THE_1;
throw new IOException("Cannot deserialize PatnerSettleFlag");
}
}

View File

@ -0,0 +1,31 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 支付方式payType=UnionPayJsMini时必填
*/
public enum PayChannel {
THE_01, THE_02;
public String toValue() {
switch (this) {
case THE_01 -> {
return "01";
}
case THE_02 -> {
return "02";
}
}
return null;
}
public static PayChannel forValue(String value) throws IOException {
return switch (value) {
case "01" -> THE_01;
case "02" -> THE_02;
default -> throw new IOException("Cannot deserialize PayChannel");
};
}
}

View File

@ -0,0 +1,52 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 支付方式
*/
public enum PayType {
ALI_PAY_JSAPI,
ALI_PAY_MINI_APP,
UNION_PAY_JSAPI,
UNION_PAY_Js_MINI,
WE_CHAT_MINI_APP,
WE_CHAT_JSAPI;
public String toValue() {
switch (this) {
case ALI_PAY_JSAPI -> {
return "AliPayJsapi";
}
case ALI_PAY_MINI_APP -> {
return "AliPayMiniApp";
}
case UNION_PAY_JSAPI -> {
return "UnionPayJsapi";
}
case UNION_PAY_Js_MINI -> {
return "UnionPayJsMini";
}
case WE_CHAT_JSAPI -> {
return "WeChatJsapi";
}
case WE_CHAT_MINI_APP -> {
return "WeChatMiniApp";
}
}
return null;
}
public static PayType forValue(String value) throws IOException {
return switch (value) {
case "AliPayJsapi" -> ALI_PAY_JSAPI;
case "AliPayMiniApp" -> ALI_PAY_MINI_APP;
case "UnionPayJsapi" -> UNION_PAY_JSAPI;
case "UnionPayJsMini" -> UNION_PAY_Js_MINI;
case "WeChatJsapi" -> WE_CHAT_JSAPI;
case "WeChatMiniApp" -> WE_CHAT_MINI_APP;
default -> throw new IOException("Cannot deserialize PayType");
};
}
}

View File

@ -0,0 +1,35 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 二维码类型payType=UnionPayJsapiUnionPayJsMini时必填
*/
public enum QrCodeType {
EMPTY, THE_0, THE_1;
public String toValue() {
switch (this) {
case EMPTY -> {
return "其他";
}
case THE_0 -> {
return "0";
}
case THE_1 -> {
return "1";
}
}
return null;
}
public static QrCodeType forValue(String value) throws IOException {
return switch (value) {
case "其他" -> EMPTY;
case "0" -> THE_0;
case "1" -> THE_1;
default -> throw new IOException("Cannot deserialize QrCodeType");
};
}
}

View File

@ -0,0 +1,27 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 分账单状态处理中成功失败已退款
*/
public enum SepaStatus {
PENDING, REFUNDED, SUCCESS;
public String toValue() {
return switch (this) {
case PENDING -> "PENDING";
case REFUNDED -> "REFUNDED";
case SUCCESS -> "SUCCESS";
};
}
public static SepaStatus forValue(String value) throws IOException {
return switch (value) {
case "PENDING" -> PENDING;
case "REFUNDED" -> REFUNDED;
case "SUCCESS" -> SUCCESS;
default -> throw new IOException("Cannot deserialize SepaStatus");
};
}
}

View File

@ -0,0 +1,29 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 费用类型
*/
public enum SpecialTag {
THE_2301, THE_2302, THE_2303, THE_2304;
public String toValue() {
switch (this) {
case THE_2301: return "2301";
case THE_2302: return "2302";
case THE_2303: return "2303";
case THE_2304: return "2304";
}
return null;
}
public static SpecialTag forValue(String value) throws IOException {
if (value.equals("2301")) return THE_2301;
if (value.equals("2302")) return THE_2302;
if (value.equals("2303")) return THE_2303;
if (value.equals("2304")) return THE_2304;
throw new IOException("Cannot deserialize SpecialTag");
}
}

View File

@ -0,0 +1,37 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 分账标识与主单分账标识互斥不能同时上送1
*
* 分账标识
*/
public enum SplitSettleFlag {
THE_0, THE_1, THE_2;
public String toValue() {
switch (this) {
case THE_0 -> {
return "0";
}
case THE_1 -> {
return "1";
}
case THE_2 -> {
return "2";
}
}
return null;
}
public static SplitSettleFlag forValue(String value) throws IOException {
return switch (value) {
case "0" -> THE_0;
case "1" -> THE_1;
case "2" -> THE_2;
default -> throw new IOException("Cannot deserialize SplitSettleFlag");
};
}
}

View File

@ -0,0 +1,24 @@
package com.wzj.soopin.transaction.enums.easypay;
import java.io.IOException;
/**
* 交易限制支付类型
*/
public enum WxLimitPay {
NO_CREDIT;
public String toValue() {
if (this == WxLimitPay.NO_CREDIT) {
return "no_credit";
}
return null;
}
public static WxLimitPay forValue(String value) throws IOException {
if (value.equals("no_credit")) {
return NO_CREDIT;
}
throw new IOException("Cannot deserialize WxLimitPay");
}
}

View File

@ -0,0 +1,70 @@
package com.wzj.soopin.transaction.service;
import com.wzj.soopin.transaction.domain.bo.PaymentBO;
import com.wzj.soopin.transaction.domain.bo.easypay.EasyPayRequest;
import com.wzj.soopin.transaction.domain.vo.EasypayAccountVO;
import com.wzj.soopin.transaction.domain.vo.EasypayPrePayVO;
import java.math.BigDecimal;
import java.rmi.ServerException;
public interface IEasypayService {
/**
* 发起支付
* @param jsApiReqBody
* @return
*/
EasypayPrePayVO payment(PaymentBO paymentBO) throws ServerException;
/**
* 获取易生账户
* @param memberId
* @return
*/
EasypayAccountVO getEasypayAccount(Long memberId);
/**
* 提现
* @param memberId
* @param money
* @return
*/
boolean withdraw(Long memberId, BigDecimal money);
/**
* 同步会员账户
* @return
*/
boolean syncMemberAccount();
/**
* 开通商户
*/
void openMerchant(Long memberId);
/**
* 获取商户账户
*/
EasypayAccountVO getMerchantAccount(Long memberId);
/**
* 分账
*/
boolean split(Long memberId, BigDecimal money);
/**
* 商户审核通知
* */
boolean merchantAuditNotice(String request);
/**
* 处理易生支付结果通知回调
* @param request
*/
void handlerTradeCallback(EasyPayRequest request);
}

View File

@ -1,52 +0,0 @@
package com.wzj.soopin.transaction.service;
import com.wzj.soopin.transaction.domain.vo.YishengAccountVO;
import java.math.BigDecimal;
public interface IYishengService {
/**
* 获取易生账户
* @param memberId
* @return
*/
YishengAccountVO getYishengAccount(Long memberId);
/**
* 提现
* @param memberId
* @param money
* @return
*/
boolean withdraw(Long memberId, BigDecimal money);
/**
* 同步会员账户
* @return
*/
boolean syncMemberAccount();
/**
* 开通商户
*/
void openMerchant(Long memberId);
/**
* 获取商户账户
*/
YishengAccountVO getMerchantAccount(Long memberId);
/**
* 分账
*/
boolean split(Long memberId, BigDecimal money);
/**
* 商户审核通知
* */
boolean merchantAuditNotice(String request);
}

View File

@ -24,7 +24,7 @@ import com.wzj.soopin.transaction.mapper.DivideDetailMapper;
import com.wzj.soopin.transaction.mapper.DivideMapper;
import com.wzj.soopin.transaction.service.IDivideRuleService;
import com.wzj.soopin.transaction.service.IDivideService;
import com.wzj.soopin.transaction.service.IYishengService;
import com.wzj.soopin.transaction.service.IEasypayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
@ -66,7 +66,7 @@ public class DivideServiceImpl extends ServiceImpl<DivideMapper, Divide> impleme
private final ConfigService configService;
private final IYishengService yishengService;
private final IEasypayService easypayService;
private final IMemberAccountService accountService;

File diff suppressed because one or more lines are too long

View File

@ -9,12 +9,11 @@ import com.wzj.soopin.member.enums.AccountBillChangeTypeEnum;
import com.wzj.soopin.member.enums.AccountBillSourceEnum;
import com.wzj.soopin.transaction.enums.WithdrawAuditStatus;
import com.wzj.soopin.transaction.enums.WithdrawStatus;
import com.wzj.soopin.transaction.enums.WithdrawType;
import com.wzj.soopin.transaction.mapper.WithdrawMapper;
import com.wzj.soopin.member.service.*;
import com.wzj.soopin.transaction.domain.vo.YishengAccountVO;
import com.wzj.soopin.transaction.domain.vo.EasypayAccountVO;
import com.wzj.soopin.transaction.service.IWithdrawService;
import com.wzj.soopin.transaction.service.IYishengService;
import com.wzj.soopin.transaction.service.IEasypayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.satoken.utils.LoginHelper;
@ -44,7 +43,7 @@ public class WithdrawServiceImpl extends ServiceImpl<WithdrawMapper, Withdraw> i
/**
* 易生账户充值服务
*/
private final IYishengService yishengService;
private final IEasypayService easypayService;
private final IAccountBillService accountBillService;
@ -58,7 +57,7 @@ public class WithdrawServiceImpl extends ServiceImpl<WithdrawMapper, Withdraw> i
throw new RuntimeException("提现申请已处理");
}
//发起提现
boolean chargeSuccess = yishengService.withdraw(withdraw.getMemberId(), withdraw.getMoney());
boolean chargeSuccess = easypayService.withdraw(withdraw.getMemberId(), withdraw.getMoney());
if (!chargeSuccess) {
throw new RuntimeException("提现失败");
}
@ -80,14 +79,14 @@ public class WithdrawServiceImpl extends ServiceImpl<WithdrawMapper, Withdraw> i
//从易生取别用自己计算的
//// TODO: 2025/6/21 测试的时候用计算的 测试完用易生的
BigDecimal finalBalance = balance.subtract(withdraw.getMoney());
YishengAccountVO yishengAccountVO = yishengService.getYishengAccount(withdraw.getMemberId());
EasypayAccountVO easypayAccountVO = easypayService.getEasypayAccount(withdraw.getMemberId());
memberAccountService.updateById(memberAccount.toBuilder().wallet(finalBalance).build());
//生成账户变动记录bh
AccountBill memberAccountChangeRecord = AccountBill.builder()
.accountId(withdraw.getMemberId())
.moneyBalance(finalBalance)
.beforeBalance(balance)
.afterBalance(yishengAccountVO.getBalance())
.afterBalance(easypayAccountVO.getBalance())
.changeType(AccountBillChangeTypeEnum.OUT.getCode())
.changeDesc("提现")
.source(AccountBillSourceEnum.WITHDRAW.getCode()).build();
@ -110,9 +109,9 @@ public class WithdrawServiceImpl extends ServiceImpl<WithdrawMapper, Withdraw> i
throw new RuntimeException("用户不存在");
}
BigDecimal balance = tenantAccount.getRevenue();
YishengAccountVO yishengAccountVO = yishengService.getYishengAccount(withdraw.getMemberId());
EasypayAccountVO easypayAccountVO = easypayService.getEasypayAccount(withdraw.getMemberId());
if (yishengAccountVO == null) {
if (easypayAccountVO == null) {
throw new RuntimeException("账户余额获取失败");
}
//生成费用

View File

@ -1,6 +1,8 @@
package com.wzj.soopin.transaction.service.impl;
import cn.hutool.core.text.StrBuilder;
import com.wzj.soopin.transaction.domain.entity.WxAuthResponse;
import com.wzj.soopin.transaction.config.WechatMiniProgramConfig;
import com.wzj.soopin.transaction.wechat.WechatPayConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -14,10 +16,14 @@ public class WxAuthService {
@Autowired
private WechatPayConfig wechatPayConfig;
@Autowired
private WechatMiniProgramConfig wechatMiniProgramConfig;
private RestTemplate restTemplate = new RestTemplate();
/**
* 通过code获取openid
* 网页-通过code获取openid
*
* @param code 授权码
* @return 包含openid的响应对象
*/
@ -34,5 +40,27 @@ public class WxAuthService {
return response;
}
/**
* 小程序登录-通过code获取openid
*
* @param code 授权码
* @return 包含openid的响应对象
*/
public WxAuthResponse getOpenIdByMiniProgramCode(String code) {
String url = StrBuilder.create("https://api.weixin.qq.com/sns/jscode2session?appid=")
.append(wechatMiniProgramConfig.getAppId())
.append("&secret=")
.append(wechatMiniProgramConfig.getSecret())
.append("&js_code=")
.append(code)
.append("&grant_type=authorization_code")
.toString();
WxAuthResponse response = restTemplate.getForObject(url, WxAuthResponse.class);
if (response == null || response.getOpenid() == null) {
throw new RuntimeException("Failed to get openid from WeChat");
}
return response;
}
}

View File

@ -1,57 +0,0 @@
package com.wzj.soopin.transaction.service.impl;
import com.wzj.soopin.transaction.domain.vo.YishengAccountVO;
import com.wzj.soopin.transaction.service.IYishengService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* 会员封禁
*
* @author zcc
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class YishengServiceImpl implements IYishengService {
@Override
public YishengAccountVO getYishengAccount(Long memberId) {
return YishengAccountVO.builder().balance(new BigDecimal(1000)).build();
}
@Override
public boolean withdraw(Long memberId, BigDecimal money) {
return true;
}
@Override
public boolean syncMemberAccount() {
return true;
}
@Override
public void openMerchant(Long memberId) {
}
@Override
public YishengAccountVO getMerchantAccount(Long memberId) {
return null;
}
@Override
public boolean split(Long memberId, BigDecimal money) {
return false;
}
@Override
public boolean merchantAuditNotice(String request) {
return false;
}
}