From cd82b505f25f2afbd5d87bdee36fad5211610175 Mon Sep 17 00:00:00 2001 From: hupeng Date: Sat, 18 Aug 2018 17:10:49 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=94=AF=E4=BB=98][=E4=BF=AE=E6=94=B9]:?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E4=BB=98=E5=88=86=E8=B4=A6=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/simple/common/ErrorCode.java | 6 +- .../java/com/simple/pay/WxProfitSharing.java | 4 +- .../com/simple/pay/WxProfitSharingQueryP.java | 63 ++++++++ .../service/WxProfitSharingOrderService.java | 9 +- .../impl/WxProfitSharingOrderServiceImpl.java | 148 +++++++++++++++++- 5 files changed, 216 insertions(+), 14 deletions(-) create mode 100644 mallinkService/src/main/java/com/simple/pay/WxProfitSharingQueryP.java diff --git a/mallinkService/src/main/java/com/simple/common/ErrorCode.java b/mallinkService/src/main/java/com/simple/common/ErrorCode.java index 82d4a1011..16e43c517 100644 --- a/mallinkService/src/main/java/com/simple/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/simple/common/ErrorCode.java @@ -120,10 +120,12 @@ public enum ErrorCode{ CERT_PATH_NOT_FOUND(12024, "双向证书未配置"), PROFIT_SHARING_REQUEST_FAILED(12030, "分账请求失败"), - PROFIT_SHARING_APPLY_FAILED(12031, "分账请求业务失败"), + PROFIT_SHARING_APPLY_FAILED(12031, "分账业务失败"), PROFIT_SHARING_RETURN_INVALID(12032, "分账请求返回校验失败"), PROFIT_SHARING_RECEIVER_INVALID(12033, "分账接受方查寻无效"), - + PROFIT_SHARING_QUERY_REQUEST_FAILED(12030, "分账查询请求失败"), + PROFIT_SHARING_QUERY_APPLY_FAILED(12031, "分账查询业务失败"), + PROFIT_SHARING_QUERY_RETURN_INVALID(12032, "分账查询返回校验失败"), /** * 核销 */ diff --git a/mallinkService/src/main/java/com/simple/pay/WxProfitSharing.java b/mallinkService/src/main/java/com/simple/pay/WxProfitSharing.java index a308ad0c6..f1e57a5b8 100644 --- a/mallinkService/src/main/java/com/simple/pay/WxProfitSharing.java +++ b/mallinkService/src/main/java/com/simple/pay/WxProfitSharing.java @@ -34,11 +34,11 @@ public class WxProfitSharing { /** * 分账查询 - * @param params 请求参数 + * @param params * @return */ public static String queryOrder(Map params) { - return doPost(PROFIT_SHARING_URL, params); + return doPost(PROFIT_SHARING_QUERY_URL, params); } diff --git a/mallinkService/src/main/java/com/simple/pay/WxProfitSharingQueryP.java b/mallinkService/src/main/java/com/simple/pay/WxProfitSharingQueryP.java new file mode 100644 index 000000000..71f163397 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/pay/WxProfitSharingQueryP.java @@ -0,0 +1,63 @@ +package com.simple.pay; + +import java.io.Serializable; + +/** + * Created by Peng on 2018/8/10. + */ +public class WxProfitSharingQueryP implements Serializable { + private static final long serialVersionUID = 1L; + + private String mch_id; // 商户号 + private String sub_mch_id; // 子商户号 + private String nonce_str; // 随机字符串 + private String sign; // 签名 + private String transaction_id ; // 支付订单号 + private String out_trade_no; // 商户分账单号 + + + public String getMch_id() { + return mch_id; + } + + public void setMch_id(String mch_id) { + this.mch_id = mch_id; + } + + public String getSub_mch_id() { return sub_mch_id; } + + public void setSub_mch_id(String sub_mch_id) { + this.sub_mch_id = sub_mch_id; + } + + public String getNonce_str() { + return nonce_str; + } + + public void setNonce_str(String nonce_str) { + this.nonce_str = nonce_str; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getTransaction_id() { + return transaction_id; + } + + public void setTransaction_id(String transaction_id) { + this.transaction_id = transaction_id; + } + + public String getOut_trade_no() { return out_trade_no; } + + public void setOut_trade_no(String out_trade_no) { + this.out_trade_no = out_trade_no; + } + +} diff --git a/mallinkService/src/main/java/com/simple/service/WxProfitSharingOrderService.java b/mallinkService/src/main/java/com/simple/service/WxProfitSharingOrderService.java index 256ef1b31..764ad0b97 100644 --- a/mallinkService/src/main/java/com/simple/service/WxProfitSharingOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxProfitSharingOrderService.java @@ -50,9 +50,12 @@ public interface WxProfitSharingOrderService { /** * 创建分账订单 */ - public ResultData createSharingOrder(WxAppinfo appInfo, WxPayOrder wxPayOrder); - - + public ResultData createSharingOrder(WxPayOrder wxPayOrder); + + /** + * 查询分账订单 + */ + public ResultData querySharingOrder(WxPayOrder wxPayOrder); } diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxProfitSharingOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxProfitSharingOrderServiceImpl.java index ac475f67f..25b3917b2 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxProfitSharingOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxProfitSharingOrderServiceImpl.java @@ -18,6 +18,7 @@ import com.simple.mapper.*; import com.simple.pay.WxPayment; import com.simple.pay.WxProfitSharing; import com.simple.pay.WxProfitSharingP; +import com.simple.pay.WxProfitSharingQueryP; import com.simple.service.WxProfitSharingOrderService; import com.simple.utils.BeanUtils; import com.simple.utils.Utility; @@ -48,6 +49,8 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ @Autowired WxProfitSharingResultMapper wxProfitSharingResultMapper; + @Autowired + WxCUserMapper wxCUserMapper; final JSONObject errorMap = JSON.parseObject( @@ -63,6 +66,27 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ "\"NOAUTH \":{\"detail\":\"无分账权限\",\"reason\":\"未开通分账权限\",\"resolution\":\"请先开通分账权限\"}," + "\"NOT_SHARE_ORDER\":{\"detail\":\"非分账订单\t\",\"reason\":\"不是分账订单,无法分账\",\"resolution\":\"下单时请用合适的参数\"}}"); + final JSONObject errorMapQuery = JSON.parseObject( + "{\"SYSTEMERROR\":{\"detail\":\"接口返回错误\",\"reason\":\"系统超时\",\"resolution\":\"系统异常,请用相同参数重新调用\"}," + + "\"INVALID_TRANSACTIONID\":{\"detail\":\"无效的微信支付订单号\",\"reason\":\"请求参数未按指引进行填写\",\"resolution\":\"检查原交易单号是否存在\"}," + + "\"PARAM_ERROR\":{\"detail\":\"参数错误\t\",\"reason\":\"请求参数未按指引进行填写\",\"resolution\":\"请求参数错误,请重新检查再调用分账接口\"}," + + "\"INVALID_REQUEST\":{\"detail\":\"请求不合法\",\"reason\":\"参数中APPID或MCHID不存在等 \",\"resolution\":\"请重新检查再调用分账接口\"}," + + "\"ORDERNOTEXIST\":{\"detail\":\"分账单不存在\",\"reason\":\"订单号错误或分账单号错误\",\"resolution\":\"请检查订单号或分账单号是否有错误\"}" ); + + + final JSONObject statusMap = JSON.parseObject( + "{\"ACCEPTED\":3," + + "\"PROCESSING\":4" + + "\"FINISHED\":5" + + "\"CLOSED\":6}"); + + final JSONObject resultStatusMap = JSON.parseObject( + "{\"PENDING\":1," + + "\"SUCCESS\":2" + + "\"ADJUST\":3" + + "\"RETURNED\":4" + + "\"CLOSED\":5}"); + @Override public PageInfo listAsPage(WxProfitSharingOrder record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxProfitSharingOrderMapper.findList(record)); @@ -95,17 +119,37 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ @Override public void test() { - createSharingOrder(wxAppinfoMapper.selectByPrimaryKey(new Long(1L)),wxPayOrderMapper.selectByPrimaryKey(new Long(190403470006681600L))); + createSharingOrder(wxPayOrderMapper.selectByPrimaryKey(new Long(190403470006681600L))); + } + + private WxAppinfo getAppinfo(WxPayOrder wxPayOrder) { + WxAppinfo wxAppinfo; + + WxCUser wxCUser = wxCUserMapper.selectByPrimaryKey(wxPayOrder.getCUserId()); + if (wxCUser == null) + throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), ErrorCode.USER_IS_EMPTY.getMessage()); + wxAppinfo = wxAppinfoMapper.selectByPrimaryKey(wxCUser.getAppId()); + if (wxAppinfo == null) + throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND.getCode(), ErrorCode.APP_ID_NOT_FOUND.getMessage()); + + return wxAppinfo; } @Override - public ResultData createSharingOrder(WxAppinfo subAppInfo, WxPayOrder wxPayOrder) { + public ResultData createSharingOrder(WxPayOrder wxPayOrder) { final IdWorker idworker = IdWorker.get(); - WxProfitSharingOrder record = new WxProfitSharingOrder(); try { + + WxAppinfo subAppInfo = getAppinfo(wxPayOrder); + WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(subAppInfo.getPayId()); + //WxPayAccount mainPayAccount = wxPayAccountMapper.selectByPrimaryKey(new Long(EnumPayDomain.PAY_DOMAIN_MASTER_ACCOUNT_ID.getCode())); + //WxAppinfo mainAppInfo = wxAppinfoMapper.selectByPrimaryKey(new Long(EnumPayDomain.PAY_DOMAIN_MASTER_APPINFO_ID.getCode())); + WxOrder wxOrder = wxOrderMapper.selectByPrimaryKey(wxPayOrder.getOrderId()); + //是否已创建分账订单 + WxProfitSharingOrder record = new WxProfitSharingOrder(); record.setOrderId(wxPayOrder.getId().toString()); record = wxProfitSharingOrderMapper.selectOne(record); if (record == null) { @@ -126,10 +170,6 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ wxProfitSharingOrderMapper.insertSelective(record); } - WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(subAppInfo.getPayId()); - //WxPayAccount mainPayAccount = wxPayAccountMapper.selectByPrimaryKey(new Long(EnumPayDomain.PAY_DOMAIN_MASTER_ACCOUNT_ID.getCode())); - //WxAppinfo mainAppInfo = wxAppinfoMapper.selectByPrimaryKey(new Long(EnumPayDomain.PAY_DOMAIN_MASTER_APPINFO_ID.getCode())); - //分账提交 WxProfitSharingP wxProfitSharingP = new WxProfitSharingP(); //wxProfitSharingP.setAppid(mainAppInfo.getAppId()); @@ -211,4 +251,98 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); } } + + @Override + public ResultData querySharingOrder(WxPayOrder wxPayOrder) { + + WxProfitSharingOrder record = new WxProfitSharingOrder(); + try { + WxAppinfo subAppInfo = getAppinfo(wxPayOrder); + WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(subAppInfo.getPayId()); + //WxPayAccount mainPayAccount = wxPayAccountMapper.selectByPrimaryKey(new Long(EnumPayDomain.PAY_DOMAIN_MASTER_ACCOUNT_ID.getCode())); + + WxOrder wxOrder = wxOrderMapper.selectByPrimaryKey(wxPayOrder.getOrderId()); + + //是否已创建分账订单 + record.setOrderId(wxPayOrder.getId().toString()); + record = wxProfitSharingOrderMapper.selectOne(record); + if (record == null) + throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND.getCode(), ErrorCode.ORDER_IS_NOT_FIND.getMessage()); + + //分账提交 + WxProfitSharingQueryP wxProfitSharingQueryP = new WxProfitSharingQueryP(); + //wxProfitSharingP.setMch_id(mainPayAccount.getMchId()); + wxProfitSharingQueryP.setMch_id(payAccount.getMchId()); + wxProfitSharingQueryP.setSub_mch_id(payAccount.getMchId()); + wxProfitSharingQueryP.setNonce_str(Utility.generate32UUID()); + wxProfitSharingQueryP.setTransaction_id(wxPayOrder.getTransactionId()); + wxProfitSharingQueryP.setOut_trade_no(record.getId().toString()); + + wxProfitSharingQueryP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxProfitSharingQueryP), payAccount.getApiKey())); + String response = WxProfitSharing.pushOrder(BeanUtils.toStringMap(wxProfitSharingQueryP)); + + Map 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.verifyNotify(returnMap,payAccount.getApiKey())){ + return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_RETURN_INVALID.getCode(), ErrorCode.PROFIT_SHARING_RETURN_INVALID.getMessage()); + } + + String out_order_no = returnMap.get("out_order_no"); + if (!out_order_no.equals(record.getId().toString())){ + return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_RETURN_INVALID.getCode(), ErrorCode.PROFIT_SHARING_RETURN_INVALID.getMessage()); + } + + String result_code = returnMap.get("result_code"); + if (!"SUCCESS".equals(result_code)) { + return new ResultData(ErrorCode.PROFIT_SHARING_QUERY_APPLY_FAILED.getCode(), returnMap.get("result_msg")); + } + + record.setSharingStatus((Integer) statusMap.get(returnMap.get("status"))); + record.setUpdateTime(new Date()); + wxProfitSharingOrderMapper.updateByPrimaryKey(record); + + String receivers = returnMap.get("receivers"); + JSONArray jReceivers = JSONArray.parseArray(receivers); + + WxProfitSharingResult result = new WxProfitSharingResult(); + result.setSharingOrderId(record.getId().toString()); + List wxProfitSharingResultList = wxProfitSharingResultMapper.findList(result); + + + WxProfitSharingReceiver wxProfitSharingReceiver; + WxProfitSharingResult wxProfitSharingResult; + + for(int i=0; i