@@ -9,6 +9,7 @@ import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.IdWorker;
import com.iformall.common.ResultData;
import com.iformall.domain.dto.WxProfitShareAppInoDto;
import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.po.*;
import com.iformall.domain.po.base.TenantEntity;
@@ -21,6 +22,7 @@ import com.iformall.mapper.*;
import com.iformall.pay.*;
import com.iformall.service.WxProfitSharingOrderService;
import com.iformall.service.pay.PayServiceFactory;
import com.iformall.service.pay.service.share.entity.PayShareQueryResult;
import com.iformall.service.pay.service.share.entity.PayShareResult;
import com.iformall.utils.BeanUtils;
import com.iformall.utils.DateUtils;
@@ -93,11 +95,7 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
"\"ORDERNOTEXIST\":{\"detail\":\"分账单不存在\",\"reason\":\"订单号错误或分账单号错误\",\"resolution\":\"请检查订单号或分账单号是否有错误\"}}");
final JSONObject statusMap = JSON.parseObject(
"{\"ACCEPTED\":3," +
"\"PROCESSING\": 4," +
"\"FINISHED\": 5," +
"\"CLOSED\": 6}");
final JSONObject resultStatusMap = JSON.parseObject(
"{\"PENDING\": 1," +
@@ -120,6 +118,32 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
return wxAppinfo;
}
private WxProfitShareAppInoDto getAppinfo(WxProfitSharingOrder wxProfitSharingOrder) {
WxAppinfo appinfo;
Integer payWay;
if (wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode())
||wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE_FINISH.getCode())){
WxPayOrder wxPayOrder = wxPayOrderMapper.selectById(wxProfitSharingOrder.getOrderId());
if (wxPayOrder == null)
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND.getCode(),"wxProfitSharingOrder["+wxProfitSharingOrder.getId()+"] 没有payOrder信息.");
appinfo = getAppinfo(wxPayOrder.getTenantId(),wxPayOrder.getPayVendor());
payWay = wxPayOrder.getPayVendor();
} else if(wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_MULTI.getCode())
||wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_MULTI_FINISH.getCode())){
WxCardSpend wxCardSpend = wxCardSpendMapper.selectById(wxProfitSharingOrder.getOrderId());
if (wxCardSpend == null)
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND.getCode(),"wxProfitSharingOrder["+wxProfitSharingOrder.getId()+"] 没有WxCardSpend信息.");
appinfo = getAppinfo(wxCardSpend.getTenantId(),EnumCardSpendFrom.getPayWay(wxCardSpend.getPayFrom()).getCode());
payWay = EnumCardSpendFrom.getPayWay(wxCardSpend.getPayFrom()).getCode();
} else {
throw new MallinkException(ErrorCode.PROFIT_SHARING_QUERY_UNKNOWN_TYPE);
}
WxProfitShareAppInoDto rt = new WxProfitShareAppInoDto();
rt.setAppinfo(appinfo);
rt.setPayWay(payWay);
return rt;
}
@Override
@Transactional(isolation=Isolation.SERIALIZABLE, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
@@ -131,8 +155,8 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
}
WxPayOrder payOrder = wxPayOrderMapper.selectById(sharingOrder.getOrderId() );
WxAppinfo appInfo = getAppinfo(payOrder.getTenantId(),payOrder.getPayVendor() );
WxProfitShareAppInoDto dto = getAppinfo(sharingOrder );
WxAppinfo appInfo = dto. getAppinfo();
WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId());
List<JSONObject> receivers;
@@ -166,66 +190,18 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
return new ResultData(ErrorCode.PROFIT_SHARING_RECEIVER_INVALID);
}
//分账提交
WxProfitSharingP psCmd = new WxProfitSharingP();
psCmd.setMch_id(payAccount.getMchId());
psCmd.setSub_mch_id(payAccount.getSubMchId());
psCmd.setAppid(appInfo.getParentAppId());
psCmd.setSub_appid(appInfo.getAppId());
psCmd.setNonce_str(Utility.generate32UUID());
psCmd.setTransaction_id(sharingOrder.getTransactionId());
psCmd.setOut_order_no(sharingOrder.getId().toString());
psCmd.setSign_type("HMAC-SHA256");
psCmd.setReceivers(sharingOrder.getReceivers());
String response;
try {
psCmd.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(psCmd), payAccount.getApiKey()));
logger.info("request:" + psCmd.toString());
if(sharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode())) {
response = WxProfitSharing.pushOrder(BeanUtils.toStringMap(psCmd), payAccount.getCertPath(), payAccount.getMchId());
} else if(sharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_MULTI.getCode())) {
response = WxProfitSharing.pushMultiOrder(BeanUtils.toStringMap(psCmd), payAccount.getCertPath(), payAccount.getMchId());
} else {
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR);
}
} catch (Exception e) {
sharingOrder.setSharingStatus(EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode());
sharingOrder.setErrorMsg("REDO:"+ErrorCode.PROFIT_SHARING_REQUEST_FAILED.getMessage());
sharingOrder.setUpdateTime(new Date());
wxProfitSharingOrderMapper.updateById(sharingOrder);
return new ResultData(ErrorCode.PROFIT_SHARING_REQUEST_FAILED);
}
logger.info("response: " + response);
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
if (!"SUCCESS".equals(return_code)) {
sharingOrder.setSharingStatus(EnumProfitSharingOrderStatus.PROFIT_SHARING_REQ_FAILED.getCode());
sharingOrder.setErrorMsg("REDO:"+returnMap.get("return_msg"));
sharingOrder.setUpdateTime(new Date());
wxProfitSharingOrderMapper.updateById(sharingOrder);
return new ResultData(ErrorCode.PROFIT_SHARING_REQUEST_FAILED.getCode(), returnMap.get("return_msg"));
}
if (!WxPayment.verifyNotifyHMAC(returnMap,payAccount.getApiKey())){
sharingOrder.setErrorMsg("REDO:"+ErrorCode.PROFIT_SHARING_RETURN_INVALID.getMessage());
sharingOrder.setUpdateTime(new Date());
wxProfitSharingOrderMapper.updateById(sharingOrder);
return new ResultData(ErrorCode.PROFIT_SHARING_RETURN_INVALID.getCode());
}
String result_code = returnMap.get("result_code");
if (!"SUCCESS".equals(result_code)) {
sharingOrder.setSharingStatus(EnumProfitSharingOrderStatus.PROFIT_SHARING_APPLY_FAILED.getCode());
sharingOrder.setUpdateTime(new Date());
sharingOrder.setErrorMsg("REDO:"+returnMap.get("err_code_des"));
PayShareResult shareResult = payServiceFactory.getPayShareAdapterService(dto.getPayWay()).haveReciversShare(appInfo, payAccount, frecord,
sharingOrder.getTransactionId(), JSONArray.parseArray(JSON.toJSONString(receivers)), EnumProfitSharingOrderType.getEnum(sharingOrder.getType()));
if (!shareResult.isSuccess()) {
sharingOrder.setSharingStatus(shareResult.getCode());
sharingOrder.setErrorMsg("REDO:"+shareResult.getMsg());
sharingOrder.setUpdateTime(new Date());
wxProfitSharingOrderMapper.updateById(sharingOrder);
return new ResultData(ErrorCode.PROFIT_SHARING_APPLY_FAILED.getCode(), returnMap.get("err_code_des" ));
return new ResultData(ErrorCode.PROFIT_SHARING_REQUEST_FAILED.getCode(),sharingOrder.getErrorMsg());
}
sharingOrder.setSharingOrderNo(returnMap.get("order_id" ));
sharingOrder.setSharingOrderNo(shareResult.getShareOrderNo());
sharingOrder.setSharingStatus(EnumProfitSharingOrderStatus.PROFIT_SHARING_ACCEPTED.getCode());
sharingOrder.setErrorMsg("REDO:重试分账成功");
sharingOrder.setUpdateTime(new Date());
@@ -233,8 +209,7 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
for (WxProfitSharingResult result:resultList) {
wxProfitSharingResultMapper.insert(result);
}
return new ResultData(returnMap);
return new ResultData(shareResult.getData());
}
@@ -380,22 +355,8 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
WxProfitSharingOrder record = new WxProfitSharingOrder();
WxAppinfo appInfo;
if (wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode())
||wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE_FINISH.getCode())){
WxPayOrder wxPayOrder = wxPayOrderMapper.selectById(wxProfitSharingOrder.getOrderId());
if (wxPayOrder == null)
return new ResultData(ErrorCode.ORDER_IS_NOT_FIND);
appInfo = getAppinfo(wxPayOrder.getTenantId(),wxPayOrder.getPayVendor());
} else if(wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_MULTI.getCode())
||wxProfitSharingOrder.getType().equals(EnumProfitSharingOrderType.PROFIT_SHARING_MULTI_FINISH.getCode())){
WxCardSpend wxCardSpend = wxCardSpendMapper.selectById(wxProfitSharingOrder.getOrderId());
if (wxCardSpend == null)
return new ResultData(ErrorCode.ORDER_IS_NOT_FIND);
appInfo = getAppinfo(wxCardSpend.getTenantId(),EnumCardSpendFrom.getPayWay(wxCardSpend.getPayFrom()).getCode());
} else {
return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_UNKNOWN_TYPE);
}
WxProfitShareAppInoDto dto = getAppinfo(wxProfitSharingOrder);
WxAppinfo appInfo = dto.getAppinfo();
WxPayAccount payAccount = wxPayAccountMapper.selectById(appInfo.getPayId());
//是否已创建分账订单
@@ -404,46 +365,16 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
if (record == null)
return new ResultData(ErrorCode.ORDER_IS_NOT_FIND);
//分账查询提交
WxProfitSharingQueryP wxProfitSharingQueryP = new WxProfitSharingQueryP();;
wxProfitSharingQueryP.setMch_id(payAccount.getMchId());
wxProfitSharingQueryP.setSub_mch_id(payAccount.getSubMchId());
wxProfitSharingQueryP.setNonce_str(Utility.generate32UUID());
wxProfitSharingQueryP.setTransaction_id(wxProfitSharingOrder.getTransactionId());
wxProfitSharingQueryP.setOut_order_no(record.getId().toString());
wxProfitSharingQueryP.setSign_type("HMAC-SHA256");
String response;
try {
wxProfitSharingQueryP.setSign(WxPayment.createSignHMAC(BeanUtils.toStringMap(wxProfitSharingQueryP),payAccount.getApiKey()));
response = WxProfitSharing.queryOrder(BeanUtils.toStringMap(wxProfitSharingQueryP), payAccount.getCertPath(), payAccount.getMchId());
}catch (Exception e){
return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_REQUEST_FAILED.getCode(), ErrorCode.PROFIT_SHARING_QUERY_REQUEST_FAILED.getMessage()+e.getMessage());
}
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
if (!"SUCCESS".equals(return_code)) {
return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_REQUEST_FAILED.getCode(), returnMap.get("return_msg"));
}
if (!WxPayment.verifyNotifyHMAC(returnMap,payAccount.getApiKey())){
return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_RETURN_INVALID);
}
String result_code = returnMap.get("result_code");
if (!"SUCCESS".equals(result_code)) {
return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_APPLY_FAILED.getCode(), returnMap.get("err_code_des"));
}
String out_order_no = returnMap.get("out_order_no");
if (StringUtils.isBlank(out_order_no) || !out_order_no.equals(record.getId().toString())){
return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_RETURN_INVALID);
PayShareQueryResult shareResult = payServiceFactory.getPayShareAdapterService(dto.getPayWay()).shareQuery(appInfo, payAccount, record);
if (!shareResult.isSuccess()) {
throw new MallinkException(shareResult.getCode(),shareResult.getMsg());
}
record.setSharingStatus((Integer) statusMap.get(returnMap.get("status") ));
record.setSharingStatus(shareResult.getCode());
record.setUpdateTime(new Date());
wxProfitSharingOrderMapper.updateById(record);
String receivers = returnMap.get("receivers" );
String receivers = shareResult.getReceivers();
if (receivers != null) {
JSONArray jReceivers = JSONArray.parseArray(receivers);
@@ -509,7 +440,7 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ
}
}
}
return new ResultData(returnMap );
return new ResultData(shareResult.getData() );
}
// 分账完结