分账功能实现

This commit is contained in:
egzosn
2021-10-06 23:31:37 +08:00
parent 9db3f5a76d
commit a888fb58b1
20 changed files with 1624 additions and 37 deletions

View File

@@ -0,0 +1,36 @@
package com.egzosn.pay.wx.v3.api;
import java.util.Map;
import com.egzosn.pay.common.bean.PayOrder;
/**
* 分账服务
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public interface ProfitSharingService {
/**
* 添加分账接收方
* @param order 添加分账
* @return 结果
*/
Map<String, Object> add(PayOrder order);
/**
* 删除分账接收方
* @param order 删除分账
* @return 结果
*/
Map<String, Object> delete(PayOrder order);
/**
* 解冻剩余资金
* @param order 解冻
* @return 结果
*/
Map<String, Object> unfreeze(PayOrder order);
}

View File

@@ -6,7 +6,7 @@ import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.egzosn.pay.common.bean.CloseOrder;
import com.egzosn.pay.common.bean.AssistOrder;
import com.egzosn.pay.common.bean.Order;
import com.egzosn.pay.common.bean.OrderParaStructure;
import com.egzosn.pay.common.bean.PayMessage;
@@ -26,8 +26,8 @@ import com.egzosn.pay.wx.v3.utils.WxConst;
*
* @author egan
* <pre>
* email egzosn@gmail.com
* date 2016-5-18 14:09:01
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class WxCombinePayService extends WxPayService {
@@ -114,9 +114,18 @@ public class WxCombinePayService extends WxPayService {
*/
@Override
public Map<String, Object> query(String transactionId, String outTradeNo) {
return getAssistService().doExecute("", WxTransactionType.COMBINE_TRANSACTION, outTradeNo);
return query(new AssistOrder(outTradeNo));
}
/**
* 交易查询接口
*
* @param assistOrder 查询条件
* @return 返回查询回来的结果集,支付方原值返回
*/
@Override
public Map<String, Object> query(AssistOrder assistOrder) {
return getAssistService().doExecute("", WxTransactionType.COMBINE_TRANSACTION, assistOrder.getOutTradeNo());
}
/**
* 交易关闭接口
@@ -133,16 +142,16 @@ public class WxCombinePayService extends WxPayService {
/**
* 交易关闭接口
*
* @param closeOrder 关闭订单
* @param assistOrder 关闭订单
* @return 返回支付方交易关闭后的结果
*/
@Override
public Map<String, Object> close(CloseOrder closeOrder) {
public Map<String, Object> close(AssistOrder assistOrder) {
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.COMBINE_APPID, payConfigStorage.getAppId())
.keyValue(WxConst.SUB_ORDERS, closeOrder.getAttr(WxConst.SUB_ORDERS))
.keyValue(WxConst.SUB_ORDERS, assistOrder.getAttr(WxConst.SUB_ORDERS))
.getAttr();
String requestBody = JSON.toJSONString(parameters, SerializerFeature.WriteMapNullValue);
return getAssistService().doExecute(requestBody, WxTransactionType.COMBINE_CLOSE, closeOrder.getOutTradeNo());
return getAssistService().doExecute(requestBody, WxTransactionType.COMBINE_CLOSE, assistOrder.getOutTradeNo());
}
/**

View File

@@ -3,8 +3,6 @@ package com.egzosn.pay.wx.v3.api;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import com.egzosn.pay.common.bean.Order;
import com.egzosn.pay.common.bean.OrderParaStructure;
@@ -56,7 +54,7 @@ public class WxParameterStructure {
public void loadSettleInfo(Map<String, Object> parameters, PayOrder order) {
Object profitSharing = order.getAttr("profit_sharing");
if (null != profitSharing) {
Map<String, Object> settleInfo = new MapGen<String, Object>("profit_sharing", profitSharing).getAttr();
Map<String, Object> settleInfo = new MapGen<>("profit_sharing", profitSharing).getAttr();
parameters.put("settle_info", settleInfo);
return;
}

View File

@@ -21,8 +21,9 @@ import static com.egzosn.pay.wx.v3.utils.WxConst.FAILURE;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.egzosn.pay.common.api.BasePayService;
import com.egzosn.pay.common.bean.AssistOrder;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.CloseOrder;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
@@ -32,6 +33,7 @@ import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.common.bean.RefundResult;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.bean.TransferOrder;
import com.egzosn.pay.common.bean.result.PayException;
@@ -66,8 +68,8 @@ import com.egzosn.pay.wx.v3.utils.WxConst;
*
* @author egan
* <pre>
* email egzosn@gmail.com
* date 2016-5-18 14:09:01
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class WxPayService extends BasePayService<WxPayConfigStorage> {
@@ -111,6 +113,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
/**
* 辅助api
*
* @return 辅助api
*/
public WxPayAssistService getAssistService() {
@@ -126,7 +129,18 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
this.assistService = assistService;
}
/**
* 初始化之后执行
*/
@Override
protected void initAfter() {
new Thread(() -> {
payConfigStorage.loadCertEnvironment();
wxParameterStructure = new WxParameterStructure(payConfigStorage);
getAssistService();
}).start();
}
/**
* 设置api服务器地址
@@ -223,8 +237,8 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
Map<String, Object> parameters = wxParameterStructure.getPublicParameters();
wxParameterStructure.initPartner(parameters);
// 商品描述
OrderParaStructure.loadParameters(parameters, "description", order.getSubject());
OrderParaStructure.loadParameters(parameters, "description", order.getBody());
OrderParaStructure.loadParameters(parameters, WxConst.DESCRIPTION, order.getSubject());
OrderParaStructure.loadParameters(parameters, WxConst.DESCRIPTION, order.getBody());
// 订单号
parameters.put(WxConst.OUT_TRADE_NO, order.getOutTradeNo());
//交易结束时间
@@ -430,7 +444,19 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
*/
@Override
public Map<String, Object> query(String transactionId, String outTradeNo) {
return query(new AssistOrder(transactionId, outTradeNo));
}
/**
* 交易查询接口
*
* @param assistOrder 查询条件
* @return 返回查询回来的结果集,支付方原值返回
*/
@Override
public Map<String, Object> query(AssistOrder assistOrder) {
String transactionId = assistOrder.getTradeNo();
String outTradeNo = assistOrder.getOutTradeNo();
String parameters = wxParameterStructure.getSpParameters();
WxTransactionType transactionType = WxTransactionType.QUERY_TRANSACTION_ID;
String uriVariable = transactionId;
@@ -438,7 +464,9 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
transactionType = WxTransactionType.QUERY_OUT_TRADE_NO;
uriVariable = outTradeNo;
}
return getAssistService().doExecute(parameters, transactionType, uriVariable);
}
@@ -451,22 +479,22 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
*/
@Override
public Map<String, Object> close(String transactionId, String outTradeNo) {
return close(new CloseOrder(outTradeNo));
return close(new AssistOrder(outTradeNo));
}
/**
* 交易关闭接口
*
* @param closeOrder 关闭订单
* @param assistOrder 关闭订单
* @return 返回支付方交易关闭后的结果
*/
@Override
public Map<String, Object> close(CloseOrder closeOrder) {
public Map<String, Object> close(AssistOrder assistOrder) {
String parameters = wxParameterStructure.getSpParameters();
return getAssistService().doExecute(parameters, WxTransactionType.CLOSE, closeOrder.getOutTradeNo());
return getAssistService().doExecute(parameters, WxTransactionType.CLOSE, assistOrder.getOutTradeNo());
}
/**
* 申请退款接口
*
@@ -474,7 +502,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
* @return 返回支付方申请退款后的结果
*/
@Override
public WxRefundResult refund(RefundOrder refundOrder) {
public RefundResult refund(RefundOrder refundOrder) {
//获取公共参数
Map<String, Object> parameters = wxParameterStructure.initSubMchId(null);
@@ -538,7 +566,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
Map<String, Object> parameters = new HashMap<>(5);
//目前只支持日账单
parameters.put("bill_date", DateUtils.formatDate(billDate, DateUtils.YYYYMMDD));
parameters.put(WxConst.BILL_DATE, DateUtils.formatDate(billDate, DateUtils.YYYY_MM_DD));
String fileType = billType.getFileType();
OrderParaStructure.loadParameters(parameters, "tar_type", fileType);
if (billType instanceof WxAccountType) {
@@ -567,7 +595,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
}
Map<String, Object> data = new HashMap<>();
data.put("file", inputStream);
return result;
return data;
}
@@ -579,7 +607,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
*/
@Override
public Map<String, Object> transfer(TransferOrder order) {
throw new PayErrorException(new WxPayError("", "等待作者实现"));
throw new PayErrorException(new WxPayError("", "V3不支持转账"));
}
@@ -596,7 +624,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
*/
@Override
public Map<String, Object> transferQuery(String outNo, String wxTransferType) {
throw new PayErrorException(new WxPayError("", "等待作者实现"));
throw new PayErrorException(new WxPayError("", "V3不支持转账查询"));
}

View File

@@ -0,0 +1,499 @@
package com.egzosn.pay.wx.v3.api;
import java.io.InputStream;
import java.security.PrivateKey;
import java.util.Date;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.egzosn.pay.common.bean.AssistOrder;
import com.egzosn.pay.common.bean.BillType;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.NoticeRequest;
import com.egzosn.pay.common.bean.OrderParaStructure;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.PayOutMessage;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.common.bean.RefundResult;
import com.egzosn.pay.common.bean.TransferOrder;
import com.egzosn.pay.common.bean.result.PayException;
import com.egzosn.pay.common.exception.PayErrorException;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.http.UriVariables;
import com.egzosn.pay.common.util.DateUtils;
import com.egzosn.pay.common.util.MapGen;
import com.egzosn.pay.common.util.sign.encrypt.RSA2;
import com.egzosn.pay.wx.bean.WxPayError;
import com.egzosn.pay.wx.bean.WxTransferType;
import com.egzosn.pay.wx.v3.bean.WxProfitSharingTransactionType;
import com.egzosn.pay.wx.v3.bean.sharing.ProfitSharingBillType;
import com.egzosn.pay.wx.v3.bean.sharing.ProfitSharingPayMessage;
import com.egzosn.pay.wx.v3.bean.sharing.WxProfitSharingReturnResult;
import com.egzosn.pay.wx.v3.utils.WxConst;
/**
* 微信分账API服务
*
* @author egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class WxProfitSharingService extends WxPayService implements ProfitSharingService {
/**
* 创建支付服务
*
* @param payConfigStorage 微信对应的支付配置
*/
public WxProfitSharingService(WxPayConfigStorage payConfigStorage) {
super(payConfigStorage);
}
/**
* 创建支付服务
*
* @param payConfigStorage 微信对应的支付配置
* @param configStorage 微信对应的网络配置包含代理配置、ssl证书配置
*/
public WxProfitSharingService(WxPayConfigStorage payConfigStorage, HttpConfigStorage configStorage) {
super(payConfigStorage, configStorage);
}
/**
* 初始化之后执行
*/
@Override
protected void initAfter() {
new Thread(() -> {
payConfigStorage.loadCertEnvironment();
getAssistService();
}).start();
}
/**
* 回调校验
*
* @param params 回调回来的参数集
* @return 签名校验 true通过
*/
@Override
public boolean verify(Map<String, Object> params) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 验签,使用微信平台证书.
*
* @param noticeParams 通知参数
* @return the boolean
*/
public boolean verify(NoticeParams noticeParams) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 微信统一下单接口
*
* @param order 支付订单集
* @return 下单结果
*/
public JSONObject unifiedOrder(PayOrder order) {
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.APPID, payConfigStorage.getAppId())
.keyValue(WxConst.TRANSACTION_ID, order.getTradeNo())
.keyValue(WxConst.OUT_ORDER_NO, order.getOutTradeNo())
.keyValue(WxConst.RECEIVERS, order.getAttr(WxConst.RECEIVERS))
.keyValue(WxConst.UNFREEZE_UNSPLIT, order.getAttr(WxConst.UNFREEZE_UNSPLIT))
.getAttr();
//以下服务商模式必填
OrderParaStructure.loadParameters(parameters, WxConst.SUB_MCH_ID, order);
OrderParaStructure.loadParameters(parameters, WxConst.SUB_APPID, order);
return getAssistService().doExecute(parameters, order);
}
/**
* 返回创建的订单信息
*
* @param order 支付订单
* @return 订单信息
* @see PayOrder 支付订单信息
*/
@Override
public Map<String, Object> orderInfo(PayOrder order) {
if (null == order.getTransactionType()) {
order.setTransactionType(WxProfitSharingTransactionType.ORDERS);
}
switch ((WxProfitSharingTransactionType) order.getTransactionType()) {
case ORDERS_UNFREEZE:
return unfreeze(order);
case RECEIVERS_ADD:
return add(order);
case RECEIVERS_DELETE:
return delete(order);
default:
return unifiedOrder(order);
}
}
/**
* 签名
*
* @param content 需要签名的内容 不包含key
* @param characterEncoding 字符编码
* @return 签名结果
*/
@Override
public String createSign(String content, String characterEncoding) {
PrivateKey privateKey = payConfigStorage.getCertEnvironment().getPrivateKey();
return RSA2.sign(content, privateKey, characterEncoding);
}
/**
* 将请求参数或者请求流转化为 Map
*
* @param parameterMap 请求参数
* @param is 请求流
* @return 获得回调的请求参数
*/
@Deprecated
@Override
public Map<String, Object> getParameter2Map(Map<String, String[]> parameterMap, InputStream is) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 将请求参数或者请求流转化为 Map
*
* @param request 通知请求
* @return 获得回调的请求参数
*/
@Override
public NoticeParams getNoticeParams(NoticeRequest request) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 获取输出消息,用户返回给支付端
*
* @param code 状态
* @param message 消息
* @return 返回输出消息
*/
@Override
public PayOutMessage getPayOutMessage(String code, String message) {
return PayOutMessage.JSON().content("code", code).content("message", message).build();
}
/**
* 获取成功输出消息,用户返回给支付端
* 主要用于拦截器中返回
*
* @param payMessage 支付回调消息
* @return 返回输出消息
*/
@Override
public PayOutMessage successPayOutMessage(PayMessage payMessage) {
return getPayOutMessage("SUCCESS", "成功");
}
/**
* 获取输出消息,用户返回给支付端, 针对于web端
*
* @param orderInfo 发起支付的订单信息
* @param method 请求方式 "post" "get",
* @return 获取输出消息,用户返回给支付端, 针对于web端
* @see MethodType 请求类型
*/
@Override
public String buildRequest(Map<String, Object> orderInfo, MethodType method) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 获取输出二维码信息,
*
* @param order 发起支付的订单信息
* @return 返回二维码信息,,支付时需要的
*/
@Override
public String getQrPay(PayOrder order) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 刷卡付,pos主动扫码付款
*
* @param order 发起支付的订单信息
* @return 返回支付结果
*/
@Override
public Map<String, Object> microPay(PayOrder order) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 查询分账结果API
* 非服务商模式使用
*
* @param transactionId 微信支付平台订单号
* @param outTradeNo 商户单号
* @return 返回查询回来的结果集,支付方原值返回
*/
@Deprecated
@Override
public Map<String, Object> query(String transactionId, String outTradeNo) {
return query(new AssistOrder(transactionId, outTradeNo));
}
/**
* 查询分账结果API
* <p>
* 发起分账请求后,可调用此接口查询分账结果
* <p>
* 注意: 发起解冻剩余资金请求后,可调用此接口查询解冻剩余资金的结果
*
* @param assistOrder 查询条件
* @return 返回查询回来的结果集,支付方原值返回
*/
@Override
public Map<String, Object> query(AssistOrder assistOrder) {
if (null == assistOrder.getTransactionType()) {
assistOrder.setTransactionType(WxProfitSharingTransactionType.ORDERS_RESULT);
}
switch ((WxProfitSharingTransactionType) assistOrder.getTransactionType()) {
case AMOUNTS:
return getAssistService().doExecute("", assistOrder.getTransactionType(), assistOrder.getTradeNo());
case MCH_CONFIG:
return getAssistService().doExecute("", assistOrder.getTransactionType(), assistOrder.getAttr(WxConst.SUB_MCH_ID));
default:
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.TRANSACTION_ID, assistOrder.getTradeNo()).getAttr();
//服务商模式使用
OrderParaStructure.loadParameters(parameters, WxConst.SUB_MCH_ID, assistOrder);
return getAssistService().doExecute(UriVariables.getMapToParameters(parameters), assistOrder.getTransactionType(), assistOrder.getOutTradeNo());
}
}
/**
* 交易关闭接口
*
* @param transactionId 支付平台订单号
* @param outTradeNo 商户单号
* @return 返回支付方交易关闭后的结果
*/
@Override
public Map<String, Object> close(String transactionId, String outTradeNo) {
return close(new AssistOrder(outTradeNo));
}
/**
* 交易关闭接口
*
* @param assistOrder 关闭订单
* @return 返回支付方交易关闭后的结果
*/
@Override
public Map<String, Object> close(AssistOrder assistOrder) {
throw new PayErrorException(new PayException("failure", "V3暂时没有提供此功能请查看V2版本功能"));
}
/**
* 申请退款接口
*
* @param refundOrder 退款订单信息
* @return 返回支付方申请退款后的结果
*/
@Override
public RefundResult refund(RefundOrder refundOrder) {
Map<String, Object> parameters = new MapGen<String, Object>("return_mchid", payConfigStorage.getMchId())
.keyValue("out_return_no", refundOrder.getRefundNo())
.keyValue("amount", refundOrder.getRefundAmount().intValue())
.keyValue(WxConst.DESCRIPTION, refundOrder.getDescription())
.getAttr();
//服务商模式使用
OrderParaStructure.loadParameters(parameters, WxConst.SUB_MCH_ID, refundOrder);
OrderParaStructure.loadParameters(parameters, "order_id", refundOrder.getTradeNo());
OrderParaStructure.loadParameters(parameters, "out_order_no", refundOrder.getOutTradeNo());
return WxProfitSharingReturnResult.create(getAssistService().doExecute(parameters, WxProfitSharingTransactionType.RETURN_ORDERS));
}
/**
* 查询退款
*
* @param refundOrder 退款订单单号信息
* @return 返回支付方查询退款后的结果
*/
@Override
public Map<String, Object> refundquery(RefundOrder refundOrder) {
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.OUT_ORDER_NO, refundOrder.getOutTradeNo()).getAttr();
//服务商模式使用
OrderParaStructure.loadParameters(parameters, WxConst.SUB_MCH_ID, refundOrder);
String requestBody = UriVariables.getMapToParameters(parameters);
return getAssistService().doExecute(requestBody, WxProfitSharingTransactionType.RETURN_ORDERS_RESULT, refundOrder.getRefundNo());
}
/**
* 下载对账单
*
* @param billDate 账单时间日账单格式为yyyy-MM-dd月账单格式为yyyy-MM。
* @param billType 账单类型 内部自动转化 {@link BillType}
* @return 返回支付方下载对账单的结果
*/
@Override
public Map<String, Object> downloadBill(Date billDate, String billType) {
BillType wxBillType = ProfitSharingBillType.valueOf(billType);
return downloadBill(billDate, wxBillType);
}
/**
* 申请分账账单
* <b>目前不支持指定子商户号查询</b>
*
* @param billDate 下载对账单的日期
* @param billType 账单类型 {@link ProfitSharingBillType}
* @return 返回支付方下载对账单的结果, 如果【账单类型】为gzip的话则返回值中key为data值为gzip的输入流
*/
public Map<String, Object> downloadBill(Date billDate, BillType billType) {
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.BILL_DATE, DateUtils.formatDate(billDate, DateUtils.YYYY_MM_DD))
.getAttr();
OrderParaStructure.loadParameters(parameters, WxConst.TAR_TYPE, billType.getType());
return getAssistService().doExecute(UriVariables.getMapToParameters(parameters), WxProfitSharingTransactionType.BILLS);
}
/**
* 转账
*
* @param order 转账订单
* @return 对应的转账结果
*/
@Override
public Map<String, Object> transfer(TransferOrder order) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 转账查询
*
* @param outNo 商户转账订单号
* @param wxTransferType 微信转账类型,.....这里没办法了只能这样写(┬_┬),请见谅 {@link WxTransferType}
* <p>
* <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3">企业付款到零钱</a>
* <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3">商户企业付款到银行卡</a>
* </p>
* @return 对应的转账订单
*/
@Override
public Map<String, Object> transferQuery(String outNo, String wxTransferType) {
throw new PayErrorException(new WxPayError("", "分账不支持方式"));
}
/**
* 创建消息
*
* @param message 支付平台返回的消息
* @return 支付消息对象
*/
@Override
public PayMessage createMessage(Map<String, Object> message) {
return ProfitSharingPayMessage.create(message);
}
/**
* 添加分账接收方
*
* @param order 添加分账
* @return 结果
*/
@Override
public Map<String, Object> add(PayOrder order) {
if (null == order.getTransactionType()) {
order.setTransactionType(WxProfitSharingTransactionType.RECEIVERS_ADD);
}
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.APPID, payConfigStorage.getAppId())
.getAttr();
OrderParaStructure.loadParameters(parameters, WxConst.TYPE, order);
OrderParaStructure.loadParameters(parameters, WxConst.ACCOUNT, order);
OrderParaStructure.loadParameters(parameters, WxConst.NAME, order);
OrderParaStructure.loadParameters(parameters, WxConst.RELATION_TYPE, order);
OrderParaStructure.loadParameters(parameters, WxConst.CUSTOM_RELATION, order);
//以下服务商模式必填
OrderParaStructure.loadParameters(parameters, WxConst.SUB_MCH_ID, order);
OrderParaStructure.loadParameters(parameters, WxConst.SUB_APPID, order);
return getAssistService().doExecute(parameters, order);
}
/**
* 删除分账接收方
*
* @param order 删除分账
* @return 结果
*/
@Override
public Map<String, Object> delete(PayOrder order) {
if (null == order.getTransactionType()) {
order.setTransactionType(WxProfitSharingTransactionType.RECEIVERS_DELETE);
}
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.APPID, payConfigStorage.getAppId())
.getAttr();
OrderParaStructure.loadParameters(parameters, WxConst.TYPE, order);
OrderParaStructure.loadParameters(parameters, WxConst.ACCOUNT, order);
//以下服务商模式必填
OrderParaStructure.loadParameters(parameters, WxConst.SUB_MCH_ID, order);
OrderParaStructure.loadParameters(parameters, WxConst.SUB_APPID, order);
return getAssistService().doExecute(parameters, order);
}
/**
* 解冻剩余资金
*
* @param order 解冻
* @return 结果
*/
@Override
public Map<String, Object> unfreeze(PayOrder order) {
if (null == order.getTransactionType()) {
order.setTransactionType(WxProfitSharingTransactionType.ORDERS_UNFREEZE);
}
Map<String, Object> parameters = new MapGen<String, Object>(WxConst.TRANSACTION_ID, order.getTradeNo())
.keyValue(WxConst.OUT_ORDER_NO, order.getOutTradeNo())
.getAttr();
// 商品描述
OrderParaStructure.loadParameters(parameters, WxConst.DESCRIPTION, order.getSubject());
OrderParaStructure.loadParameters(parameters, WxConst.DESCRIPTION, order.getBody());
OrderParaStructure.loadParameters(parameters, WxConst.DESCRIPTION, order);
//以下服务商模式必填
OrderParaStructure.loadParameters(parameters, WxConst.SUB_MCH_ID, order);
return getAssistService().doExecute(parameters, order);
}
}

View File

@@ -0,0 +1,79 @@
package com.egzosn.pay.wx.v3.bean;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.TransactionType;
/**
* 微信V3分账交易类型
*
* @author egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public enum WxProfitSharingTransactionType implements TransactionType {
/**
* 请求分账
*/
ORDERS("/v3/profitsharing/orders ", MethodType.POST),
/**
* 查询分账结果
*/
ORDERS_RESULT("/v3/profitsharing/orders/{out_order_no} ", MethodType.POST),
/**
* 请求分账回退
*/
RETURN_ORDERS("/v3/profitsharing/return-orders ", MethodType.POST),
/**
* 查询分账回退结果
*/
RETURN_ORDERS_RESULT("/v3/profitsharing/return-orders/{out_return_no}", MethodType.GET),
/**
* 解冻剩余资金
*/
ORDERS_UNFREEZE("/v3/profitsharing/orders/unfreeze ", MethodType.POST),
/**
* 查询剩余待分金额
*/
AMOUNTS("/v3/profitsharing/transactions/{transaction_id}/amounts ", MethodType.GET),
/**
* 服务商专用-查询最大分账比例
*/
MCH_CONFIG("/v3/profitsharing/merchant-configs/{sub_mchid} ", MethodType.GET),
/**
* 添加分账接收方
*/
RECEIVERS_ADD("/v3/profitsharing/receivers/add ", MethodType.POST),
/**
* 删除分账接收方
*/
RECEIVERS_DELETE("/v3/profitsharing/receivers/add", MethodType.POST),
BILLS("/v3/profitsharing/bills", MethodType.GET),
;
WxProfitSharingTransactionType(String type, MethodType method) {
this.type = type;
this.method = method;
}
private String type;
private MethodType method;
@Override
public String getType() {
return type;
}
@Override
public String getMethod() {
return this.method.name();
}
}

View File

@@ -17,9 +17,10 @@ import com.egzosn.pay.wx.v3.utils.WxConst;
* 微信V3交易类型
*
* @author egan
* <p>
* email egzosn@gmail.com
* <pre>
* email egan@egzosn.com
* date 2016/10/19 22:58
* </pre>
*/
public enum WxTransactionType implements TransactionType {
/**
@@ -127,7 +128,7 @@ public enum WxTransactionType implements TransactionType {
//-----------------------------------------------------------------
//以下为合并支付
/**
* 合单下单-APP支付API.
* 合单下单-APP支付
*/
COMBINE_APP("/v3/combine-transactions/app", MethodType.POST),
@@ -136,20 +137,20 @@ public enum WxTransactionType implements TransactionType {
*/
COMBINE_JSAPI("/v3/combine-transactions/jsapi", MethodType.POST),
/**
* 合单下单-H5支付API.
* 合单下单-H5支付
*/
COMBINE_H5("/v3/combine-transactions/h5", MethodType.POST, true),
/**
* 合单下单-Native支付API.
* 合单下单-Native支付
*/
COMBINE_NATIVE("/v3/combine-transactions/native", MethodType.POST, true),
/**
* 合单查询订单API.
* 合单查询订单
*/
COMBINE_TRANSACTION("/v3/combine-transactions/out-trade-no/{combine_out_trade_no}", MethodType.GET),
/**
* 合单关闭订单API.
* 合单关闭订单
*/
COMBINE_CLOSE("/v3/combine-transactions/out-trade-no/{combine_out_trade_no}/close", MethodType.POST),
;

View File

@@ -2,7 +2,8 @@ package com.egzosn.pay.wx.v3.bean.combine;
import java.util.List;
import com.egzosn.pay.common.bean.CloseOrder;
import com.egzosn.pay.common.bean.AssistOrder;
import com.egzosn.pay.wx.v3.utils.WxConst;
/**
@@ -13,7 +14,7 @@ import com.egzosn.pay.wx.v3.utils.WxConst;
* date 2021/10/6
* </pre>
*/
public class CombineCloseOrder extends CloseOrder {
public class CombineCloseOrder extends AssistOrder {
/**
* 子单信息必填最多50单

View File

@@ -361,7 +361,7 @@ public class WxPayMessage extends PayMessage {
this.userReceivedAccount = userReceivedAccount;
}
public static final WxPayMessage create(Map<String, Object> message) {
public static WxPayMessage create(Map<String, Object> message) {
WxPayMessage payMessage = new JSONObject(message).toJavaObject(WxPayMessage.class);
// payMessage.setPayType("");
payMessage.setPayMessage(message);

View File

@@ -48,4 +48,13 @@ public enum TradeState {
* 已接收,等待扣款
*/
ACCEPT,
/**
* 如果请求返回为处理中则商户可以通过调用回退结果查询接口获取请求的最终处理结果。如果查询到回退结果在处理中请勿变更商户回退单号使用相同的参数再次发起分账回退否则会出现资金风险。在处理中状态的回退单如果5天没有成功会因为超时被设置为已失败。
* 处理中
*/
PROCESSING,
/**
* 失败
*/
FAILED;
}

View File

@@ -0,0 +1,73 @@
package com.egzosn.pay.wx.v3.bean.sharing;
import com.egzosn.pay.common.bean.BillType;
/**
* 分账账单类型
*
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public enum ProfitSharingBillType implements BillType {
/**
* 数据流
*/
STREAM,
/**
* 返回格式为.gzip的压缩包账单
*/
GZIP("GZIP");
ProfitSharingBillType() {
}
ProfitSharingBillType(String type) {
this.type = type;
}
private String type;
/**
* 获取类型名称
*
* @return 类型
*/
@Override
public String getType() {
return type;
}
/**
* 获取类型对应的日期格式化表达式
*
* @return 日期格式化表达式
*/
@Override
public String getDatePattern() {
return null;
}
/**
* 获取文件类型
*
* @return 文件类型
*/
@Override
public String getFileType() {
return null;
}
/**
* 自定义属性
*
* @return 自定义属性
*/
@Override
public String getCustom() {
return null;
}
}

View File

@@ -0,0 +1,106 @@
package com.egzosn.pay.wx.v3.bean.sharing;
import java.util.List;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.wx.v3.utils.WxConst;
/**
* 服务商请求分账订单
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class ProfitSharingOrder extends PayOrder {
/**
* 子商户号,选填,服务商必填
*/
private String subMchid;
/**
* 子商户应用ID选填
* <p>
* 分账接收方类型包含{@code PERSONAL_SUB_OPENID}时必填
*/
private String subAppid;
/**
* 分账接收方列表,选填
* <p>
* 可以设置出资商户作为分账接受方最多可有50个分账接收方
*/
private List<Receiver> receivers;
/**
* 是否解冻剩余未分资金,必填
* <ol>
* <li>如果为{@code true},该笔订单剩余未分账的金额会解冻回分账方商户;</li>
* <li>如果为{@code false},该笔订单剩余未分账的金额不会解冻回分账方商户,可以对该笔订单再次进行分账。</li>
* </ol>
*/
private Boolean unfreezeUnsplit;
public String getSubMchid() {
return subMchid;
}
public void setSubMchid(String subMchid) {
this.subMchid = subMchid;
addAttr(WxConst.SUB_MCH_ID, subMchid);
}
public String getSubAppid() {
return subAppid;
}
public void setSubAppid(String subAppid) {
this.subAppid = subAppid;
addAttr(WxConst.SUB_APPID, subAppid);
}
/**
* 微信支付订单号
* @return 微信支付订单号
*/
public String getTransactionId() {
return getTradeNo();
}
public void setTransactionId(String transactionId) {
setTradeNo(transactionId);
}
/**
* 商户分账单号,必填
* <p>
* 商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。
* 只能是数字、大小写字母_-|*@
* @return 商户分账单号,必填
*/
public String getOutOrderNo() {
return getOutTradeNo();
}
public void setOutOrderNo(String outOrderNo) {
setOutTradeNo(outOrderNo);
}
public List<Receiver> getReceivers() {
return receivers;
}
public void setReceivers(List<Receiver> receivers) {
this.receivers = receivers;
addAttr(WxConst.RECEIVERS, receivers);
}
public Boolean getUnfreezeUnsplit() {
return unfreezeUnsplit;
}
public void setUnfreezeUnsplit(Boolean unfreezeUnsplit) {
this.unfreezeUnsplit = unfreezeUnsplit;
addAttr(WxConst.UNFREEZE_UNSPLIT, receivers);
}
}

View File

@@ -0,0 +1,119 @@
package com.egzosn.pay.wx.v3.bean.sharing;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.egzosn.pay.common.bean.PayMessage;
/**
* 分账动账通知
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/4
* </pre>
*/
public class ProfitSharingPayMessage extends PayMessage {
/**
* 直连商户号.
* <p>
* 直连模式分账发起和出资商户
*/
private String mchid;
/**
* 微信支付订单号
*/
@JSONField(name = "transaction_id")
private String transactionId;
/**
* 微信分账/回退单号.
*/
@JSONField(name = "order_id")
private String orderId;
/**
* 商户分账/回退单号.
* 分账方系统内部的分账/回退单号
*/
@JSONField(name = "out_order_no")
private String outOrderNo;
/**
* 分账接收方.
* <p>
* 分账接收方对象
*/
private List<Receiver> receivers;
/**
* 成功时间.
* <p>
* Rfc3339标准
*/
@JSONField(name = "success_time", format = "yyyy-MM-dd'T'HH:mm:ssXXX")
private Date successTime;
public String getMchid() {
return mchid;
}
public void setMchid(String mchid) {
this.mchid = mchid;
}
public String getTransactionId() {
return transactionId;
}
public void setTransactionId(String transactionId) {
this.transactionId = transactionId;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getOutOrderNo() {
return outOrderNo;
}
public void setOutOrderNo(String outOrderNo) {
this.outOrderNo = outOrderNo;
}
public List<Receiver> getReceivers() {
return receivers;
}
public void setReceivers(List<Receiver> receivers) {
this.receivers = receivers;
}
public Date getSuccessTime() {
return successTime;
}
public void setSuccessTime(Date successTime) {
this.successTime = successTime;
}
public static ProfitSharingPayMessage create(Map<String, Object> message) {
ProfitSharingPayMessage payMessage = new JSONObject(message).toJavaObject(ProfitSharingPayMessage.class);
// payMessage.setPayType("");
payMessage.setPayMessage(message);
return payMessage;
}
}

View File

@@ -0,0 +1,29 @@
package com.egzosn.pay.wx.v3.bean.sharing;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.wx.v3.utils.WxConst;
/**
* 分账回退订单
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class ProfitSharingReturnOrder extends RefundOrder {
/**
* 子商户号,选填,服务商必填
*/
private String subMchid;
public String getSubMchid() {
return subMchid;
}
public void setSubMchid(String subMchid) {
this.subMchid = subMchid;
addAttr(WxConst.SUB_MCH_ID, subMchid);
}
}

View File

@@ -0,0 +1,84 @@
package com.egzosn.pay.wx.v3.bean.sharing;
/**
* 分账接收方信息
*
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class Receiver {
/**
* 分账接收方类型,必填
*/
private ReceiverType type;
/**
* 分账接收方帐号,必填
*/
private String account;
/**
* 分账个人接收方姓名,选填
* <p>
* 在接收方类型为个人的时可选填,若有值,会检查与 name 是否实名匹配,不匹配会拒绝分账请求
* <ol>
* <li>分账接收方类型是{@code PERSONAL_OPENID},是个人姓名的密文(选传,传则校验) 此字段的加密方法详见:敏感信息加密说明</li>
* <li>使用微信支付平台证书中的公钥</li>
* <li>使用RSAES-OAEP算法进行加密</li>
* <li>将请求中HTTP头部的Wechatpay-Serial设置为证书序列号</li>
* </ol>
*/
private String name;
/**
* 分账金额,必填
* <p>
* 单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额
*/
private Integer amount;
/**
* 分账的原因描述,必填。分账账单中需要体现
*/
private String description;
public ReceiverType getType() {
return type;
}
public void setType(ReceiverType type) {
this.type = type;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View File

@@ -0,0 +1,26 @@
package com.egzosn.pay.wx.v3.bean.sharing;
/**
* 分账接收方类型
*
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public enum ReceiverType {
/**
* 商户号
*/
MERCHANT_ID,
/**
* 个人openid由父商户APPID转换得到
*/
PERSONAL_OPENID,
/**
* 个人sub_openid由子商户APPID转换得到服务商模式
*/
PERSONAL_SUB_OPENID
}

View File

@@ -0,0 +1,120 @@
package com.egzosn.pay.wx.v3.bean.sharing;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.wx.v3.utils.WxConst;
/**
* 添加分账接收方
*
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class ReceiversOrder extends PayOrder {
/**
* 子商户号,选填
*/
private String subMchid;
/**
* 子商户应用ID选填
* <p>
* 分账接收方类型包含{@code PERSONAL_SUB_OPENID}时必填
*/
private String subAppid;
/**
* 分账接收方类型,必填
*/
private ReceiverType type;
/**
* 分账接收方帐号,必填
*/
private String account;
/**
* 分账个人接收方姓名,选填
* <p>
* 分账接收方类型是{@code MERCHANT_ID}时,是商户全称(必传),当商户是小微商户或个体户时,是开户人姓名 分账接收方类型是{@code PERSONAL_OPENID}时,是个人姓名(选传,传则校验)
* <ol>
* <li>分账接收方类型是{@code PERSONAL_OPENID},是个人姓名的密文(选传,传则校验) 此字段的加密方法详见:敏感信息加密说明</li>
* <li>使用微信支付平台证书中的公钥</li>
* <li>使用RSAES-OAEP算法进行加密</li>
* <li>将请求中HTTP头部的Wechatpay-Serial设置为证书序列号</li>
* </ol>
*/
private String name;
/**
* 与分账方的关系类型,必填
*/
private RelationType relationType;
/**
* 自定义的分账关系,选填
*/
private String customRelation;
public String getSubMchid() {
return subMchid;
}
public void setSubMchid(String subMchid) {
this.subMchid = subMchid;
addAttr(WxConst.SUB_MCH_ID, subMchid);
}
public String getSubAppid() {
return subAppid;
}
public void setSubAppid(String subAppid) {
this.subAppid = subAppid;
addAttr(WxConst.SUB_APPID, subAppid);
}
public ReceiverType getType() {
return type;
}
public void setType(ReceiverType type) {
this.type = type;
addAttr(WxConst.TYPE, type);
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
addAttr(WxConst.ACCOUNT, account);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
addAttr(WxConst.NAME, name);
}
public RelationType getRelationType() {
return relationType;
}
public void setRelationType(RelationType relationType) {
this.relationType = relationType;
addAttr(WxConst.RELATION_TYPE, relationType);
}
public String getCustomRelation() {
return customRelation;
}
public void setCustomRelation(String customRelation) {
this.customRelation = customRelation;
addAttr(WxConst.CUSTOM_RELATION, customRelation);
}
}

View File

@@ -0,0 +1,53 @@
package com.egzosn.pay.wx.v3.bean.sharing;
/**
* 子商户与接收方的关系
*
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public enum RelationType {
/**
* 门店.
*/
STORE,
/**
* 员工.
*/
STAFF,
/**
* 店主.
*/
STORE_OWNER,
/**
* 合作伙伴.
*/
PARTNER,
/**
* 总部.
*/
HEADQUARTER,
/**
* 品牌方.
*/
BRAND,
/**
* 分销商.
*/
DISTRIBUTOR,
/**
* 用户.
*/
USER,
/**
* 供应商.
*/
SUPPLIER,
/**
* 自定义.
*/
CUSTOM
}

View File

@@ -0,0 +1,304 @@
package com.egzosn.pay.wx.v3.bean.sharing;
import java.math.BigDecimal;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.egzosn.pay.common.bean.BaseRefundResult;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.wx.v3.bean.response.order.TradeState;
import com.egzosn.pay.wx.v3.utils.WxConst;
/**
* 微信退款结果
*
* @author Egan
* <pre>
* email egan@egzosn.com
* date 2021/10/6
* </pre>
*/
public class WxProfitSharingReturnResult extends BaseRefundResult {
/**
* 分账回退的接收商户,对应原分账出资的分账方商户,填写微信支付分配的商户号
* 直连商户不用传二级商户号。
*/
@JSONField(name = "sub_mchid")
private String subMchid;
/**
* 微信分账单号,微信系统返回的唯一标识。
* 示例值3008450740201411110007820472
*/
@JSONField(name = "order_id")
private String orderId;
/**
* 商户分账单号
* 商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。 取值范围:[0-9a-zA-Z_*@-]
* 示例值P20150806125346
*/
@JSONField(name = WxConst.OUT_ORDER_NO)
private String outOrderNo;
/**
* 此回退单号是商户在自己后台生成的一个新的回退单号,在商户后台唯一
* 示例值R20190516001
*/
@JSONField(name = "out_return_no")
private String outReturnNo;
/**
* 微信分账回退单号,微信系统返回的唯一标识
* 示例值3008450740201411110007820472
*/
@JSONField(name = "return_id")
private String returnId;
/**
* 回退商户号
* 只能对原分账请求中成功分给商户接收方进行回退
* 示例值86693852
*/
@JSONField(name = "return_mchid")
private String returnMchid;
/**
* 回退金额
* 需要从分账接收方回退的金额,单位为分,只能为整数
* 示例值10
*/
private Integer amount;
/**
* 分账回退的原因描述
* 示例值:用户退款
*/
private String description;
/**
如果请求返回为处理中则商户可以通过调用回退结果查询接口获取请求的最终处理结果。如果查询到回退结果在处理中请勿变更商户回退单号使用相同的参数再次发起分账回退否则会出现资金风险。在处理中状态的回退单如果5天没有成功会因为超时被设置为已失败。
枚举值:
PROCESSING处理中
SUCCESS已成功
FAILED已失败
示例值SUCCESS
*/
private TradeState result;
/**
* 失败原因。包含以下枚举值:
* ACCOUNT_ABNORMAL : 分账接收方账户异常
* TIME_OUT_CLOSED : 超时关单
* 示例值TIME_OUT_CLOSED
*/
@JSONField(name = "fail_reason")
private String failReason;
/**
* 分账回退创建时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss.sss表示时分秒毫秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.120+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35.120+08:00
*/
@JSONField(name = "create_time")
private String createTime;
/**
* 分账回退完成时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss.sss表示时分秒毫秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.120+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35.120+08:00
*/
@JSONField(name = "finish_time")
private String finishTime;
/**
* 获取退款请求结果状态码
*
* @return 状态码
*/
@Override
public String getCode() {
return result.name();
}
/**
* 获取退款请求结果状态提示信息
*
* @return 提示信息
*/
@Override
public String getMsg() {
return failReason;
}
/**
* 返回业务结果状态码
*
* @return 业务结果状态码
*/
@Override
public String getResultCode() {
return result.name();
}
/**
* 返回业务结果状态提示信息
*
* @return 业务结果状态提示信息
*/
@Override
public String getResultMsg() {
return failReason;
}
/**
* 退款金额, 金额元
*
* @return 退款金额
*/
@Override
public BigDecimal getRefundFee() {
return new BigDecimal(amount);
}
/**
* 退款币种信息
*
* @return 币种信息
*/
@Override
public CurType getRefundCurrency() {
return null;
}
/**
* 支付平台交易号
* 发起支付时 支付平台(如支付宝)返回的交易订单号
*
* @return 支付平台交易号
*/
@Override
public String getTradeNo() {
return orderId;
}
/**
* 支付订单号
* 发起支付时,用户系统的订单号
*
* @return 支付订单号
*/
@Override
public String getOutTradeNo() {
return outOrderNo;
}
/**
* 商户退款单号
*
* @return 商户退款单号
*/
@Override
public String getRefundNo() {
return outReturnNo;
}
public String getSubMchid() {
return subMchid;
}
public void setSubMchid(String subMchid) {
this.subMchid = subMchid;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getOutOrderNo() {
return outOrderNo;
}
public void setOutOrderNo(String outOrderNo) {
this.outOrderNo = outOrderNo;
}
public String getOutReturnNo() {
return outReturnNo;
}
public void setOutReturnNo(String outReturnNo) {
this.outReturnNo = outReturnNo;
}
public String getReturnId() {
return returnId;
}
public void setReturnId(String returnId) {
this.returnId = returnId;
}
public String getReturnMchid() {
return returnMchid;
}
public void setReturnMchid(String returnMchid) {
this.returnMchid = returnMchid;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public TradeState getResult() {
return result;
}
public void setResult(TradeState result) {
this.result = result;
}
public String getFailReason() {
return failReason;
}
public void setFailReason(String failReason) {
this.failReason = failReason;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getFinishTime() {
return finishTime;
}
public void setFinishTime(String finishTime) {
this.finishTime = finishTime;
}
public static final WxProfitSharingReturnResult create(Map<String, Object> result) {
WxProfitSharingReturnResult refundResult = new JSONObject(result).toJavaObject(WxProfitSharingReturnResult.class);
refundResult.setAttrs(result);
return refundResult;
}
}

View File

@@ -33,6 +33,17 @@ public final class WxConst {
public static final String SANDBOXNEW = "sandboxnew/";
public static final String COMBINE = "combine_";
public static final String APPID = "appid";
public static final String SUB_APPID = "sub_appid";
public static final String TRANSACTION_ID = "transaction_id";
public static final String OUT_ORDER_NO = "out_order_no";
public static final String TYPE = "type";
public static final String ACCOUNT = "account";
public static final String NAME = "name";
public static final String RELATION_TYPE = "relationType";
public static final String CUSTOM_RELATION = "customRelation";
public static final String DESCRIPTION = "description";
public static final String BILL_DATE = "bill_date";
public static final String TAR_TYPE = "tar_type";
public static final String COMBINE_APPID = COMBINE + APPID;
public static final String MCH_ID = "mchid";
@@ -45,6 +56,8 @@ public final class WxConst {
public static final String TIME_START = "time_start";
public static final String TIME_EXPIRE = "time_expire";
public static final String SUB_ORDERS = "sub_orders";
public static final String RECEIVERS = "receivers";
public static final String UNFREEZE_UNSPLIT = "unfreeze_unsplit";
public static final String TOKEN_PATTERN = "mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\"";