From 964ee948cd680ae08ed51fe18a1dfbaad7febbb2 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Tue, 28 Jul 2020 17:43:01 +0800 Subject: [PATCH 1/3] update --- .../com/iformall/controller/WxPayOrderController.java | 9 ++++++++- .../java/com/iformall/service/WxPayOrderService.java | 4 ++-- .../com/iformall/service/impl/WxPayOrderServiceImpl.java | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java index 3e64b4306..9160fb11b 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java @@ -78,7 +78,14 @@ public class WxPayOrderController extends BaseController { } WxCUser user = getUser(); - WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(user.getId()); + if(!user.isBasicInfo()) { + return new ResultData(ErrorCode.USER_IS_NOT_MEMBER); + } + WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(user.getUserId()); + if ( null == wxCUserBasicInfo) { + logger.error("会员用户不存在."+user.getUserId()); + return new ResultData(ErrorCode.USER_IS_EMPTY.getCode(),"会员用户不存在."+user.getUserId()); + } if (null != wxCUserBasicInfo && EnumCreditLockedStatus.CLOSE.getCode().equals(wxCUserBasicInfo.getStatus())) { return new ResultData(ErrorCode.MEMBER_IS_LOCKED); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java index ec51b4910..bb315ccec 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java @@ -6,7 +6,7 @@ import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.po.WxAppinfo; -import com.iformall.domain.po.WxCUser; +import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxMerchantBUser; import com.iformall.domain.po.WxOrder; @@ -27,7 +27,7 @@ public interface WxPayOrderService { * @param payWay * @return */ - ResultData createPayOrder(WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay); + ResultData createPayOrder(WxAppinfo appInfo, WxCUserBasicInfo user, WxPayOrder record, EnumPayWay payWay); /** * 刷卡支付订单 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 3521a6fa6..54735c2ea 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -218,7 +218,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Override - public ResultData createPayOrder(WxAppinfo appInfo, WxCUser user, WxPayOrder record, EnumPayWay payWay) { + public ResultData createPayOrder(WxAppinfo appInfo, WxCUserBasicInfo user, WxPayOrder record, EnumPayWay payWay) { IdWorker idworker = IdWorker.get(); EnumPayShare isShare = EnumPayShare.NO; From a9d98341f2899beaca6e1a2ea6630a24cc296192 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Tue, 28 Jul 2020 19:17:57 +0800 Subject: [PATCH 2/3] update --- .../com/iformall/enums/EnumPayAdapter.java | 30 +++ .../service/impl/WxPayOrderServiceImpl.java | 156 +-------------- .../service/pay/PayAdapterResult.java | 28 +++ .../service/pay/PayAdapterService.java | 10 + .../service/pay/PayServiceFactory.java | 31 +++ .../service/pay/impl/WxPayAdapterService.java | 186 ++++++++++++++++++ 6 files changed, 287 insertions(+), 154 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/PayAdapterResult.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/PayAdapterService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java create mode 100644 mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java b/mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java new file mode 100644 index 000000000..5e1ed6bd3 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java @@ -0,0 +1,30 @@ +package com.iformall.enums; + +public enum EnumPayAdapter { + + WX_PAY(1,"微信支付"); + + private int type; + private String name; + + EnumPayAdapter(int type, String name) { + this.type = type; + this.name = name; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 54735c2ea..e5621d2f9 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -18,6 +18,7 @@ import com.iformall.mapper.*; import com.iformall.pay.*; import com.iformall.service.*; import com.iformall.service.helper.WxPayOrderServiceHelper; +import com.iformall.service.pay.PayServiceFactory; import com.iformall.utils.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -407,160 +408,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } - if (payAccount.getType() == EnumPayMode.MCH.getCode()) { - // 统一下单 普通商户模式 - String noncestr = Utility.generate32UUID(); - WxPayOrderP wxPayOrderP = new WxPayOrderP(); - wxPayOrderP.setOpenid(user.getOpenId()); - wxPayOrderP.setAppid(user.getAppId()); - wxPayOrderP.setMch_id(payAccount.getMchId()); - wxPayOrderP.setNonce_str(noncestr); - wxPayOrderP.setBody(order.getDetail()); - wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); - wxPayOrderP.setTotal_fee(order.getPayment()); - wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP - wxPayOrderP.setGoods_tag(String.valueOf(order.getProductId())); - wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); - wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 - wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID - wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); - Date futureDate = new Date(); - futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); - wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 - Map payOrderMap = BeanUtils.toStringMap(wxPayOrderP); - wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey())); - String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); - logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); - Map returnMap = WxPayment.xmlToMap(response); - returnMap.put("payOrderId", String.valueOf(record.getId())); - String result_code = returnMap.get("result_code"); - if ("SUCCESS".equals(result_code)) { - String prepay_id = returnMap.get("prepay_id"); - // update payOrder with prepay_id - record.setPrepayId(prepay_id); - record.setUpdateTime(new Date()); - try { - wxPayOrderMapper.updateById(record); - } catch (Exception e) { - logger.error("pay order update error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); - } - - String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); - Map sighMap = MapUtil.getOrderMap(); - sighMap.put("appId", returnMap.get("appid")); - sighMap.put("timeStamp", timestamp); - sighMap.put("nonceStr", noncestr); - sighMap.put("package", "prepay_id=" + prepay_id); - sighMap.put("signType", "MD5"); - String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); - returnMap.put("timeStamp", timestamp); - returnMap.put("nonceStr", noncestr); - returnMap.put("package", "prepay_id=" + prepay_id); - returnMap.put("paySign", signAgent); - logger.info("back to UI: " + returnMap.toString()); - return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); - } else { - String errMsg = ""; - JSONObject errObj = errorMap.getJSONObject(result_code); - if (errObj != null) { - errMsg = errObj.toJSONString(); - record.setFailReason(errMsg); - } else { - errMsg = returnMap.get("return_msg"); - record.setFailReason(errMsg); - } - record.setUpdateTime(new Date()); - try { - wxPayOrderMapper.updateById(record); - } catch (Exception e) { - logger.error("pay order update error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); - } - return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); - } - } else { - // 统一下单 // 服务商模式 - String noncestr = Utility.generate32UUID(); - WxPayOrderSP wxPayOrderSP = new WxPayOrderSP(); - wxPayOrderSP.setSub_openid(user.getOpenId()); - wxPayOrderSP.setAppid(appInfo.getParentAppId()); - wxPayOrderSP.setMch_id(payAccount.getMchId()); - wxPayOrderSP.setSub_appid(user.getAppId()); - wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId()); - wxPayOrderSP.setNonce_str(noncestr); - wxPayOrderSP.setBody(order.getDetail()); - wxPayOrderSP.setOut_trade_no(record.getPayOrderNo()); - wxPayOrderSP.setTotal_fee(order.getPayment().toString()); - wxPayOrderSP.setSpbill_create_ip(record.getIp()); // 终端IP - wxPayOrderSP.setGoods_tag(String.valueOf(order.getProductId())); // 券ID - wxPayOrderSP.setNotify_url(payAccount.getPayNotifyUrl()); - wxPayOrderSP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 - wxPayOrderSP.setProduct_id(String.valueOf(order.getProductId())); // 券ID - wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); - Date futureDate = new Date(); - futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); - wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 - wxPayOrderSP.setSign_type("HMAC-SHA256"); - wxPayOrderSP.setProfit_sharing(null); - if (isShare == EnumPayShare.YES) { - wxPayOrderSP.setProfit_sharing("Y"); - } - Map payOrderMap = BeanUtils.toStringMap(wxPayOrderSP); - - wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey())); - String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderSP)); - logger.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString()); - Map returnMap = WxPayment.xmlToMap(response); - returnMap.put("payOrderId", String.valueOf(record.getId())); - String result_code = returnMap.get("result_code"); - if ("SUCCESS".equals(result_code)) { - String prepay_id = returnMap.get("prepay_id"); - // update payOrder with prepay_id - record.setPrepayId(prepay_id); - record.setUpdateTime(new Date()); - try { - wxPayOrderMapper.updateById(record); - } catch (Exception e) { - logger.error("pay order update error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); - } - - String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); - Map sighMap = MapUtil.getOrderMap(); - sighMap.put("appId", appInfo.getAppId()); - sighMap.put("timeStamp", timestamp); - sighMap.put("nonceStr", noncestr); - sighMap.put("package", "prepay_id=" + prepay_id); - sighMap.put("signType", "HMAC-SHA256"); - String signAgent = WxPayment.createSignHMAC(sighMap, payAccount.getApiKey()); - returnMap.put("timeStamp", timestamp); - returnMap.put("nonceStr", noncestr); - returnMap.put("package", "prepay_id=" + prepay_id); - returnMap.put("paySign", signAgent); - returnMap.put("signType", "HMAC-SHA256"); - logger.info("back to UI: " + returnMap.toString()); - return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); - } else { - String errMsg = ""; - JSONObject errObj = errorMap.getJSONObject(result_code); - if (errObj != null) { - errMsg = errObj.toJSONString(); - record.setFailReason(errMsg); - } else { - errMsg = returnMap.get("return_msg"); - record.setFailReason(errMsg); - } - record.setUpdateTime(new Date()); - try { - wxPayOrderMapper.updateById(record); - } catch (Exception e) { - logger.error("pay order update error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); - } - return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); - } - } + PayServiceFactory.getPayAdapterService(1).pay(payAccount, order, oldRecord, params); } catch (RuntimeException e) { logger.error("createwxpayorder error:",e); throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); diff --git a/mallinkService/src/main/java/com/iformall/service/pay/PayAdapterResult.java b/mallinkService/src/main/java/com/iformall/service/pay/PayAdapterResult.java new file mode 100644 index 000000000..ed895d407 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/PayAdapterResult.java @@ -0,0 +1,28 @@ +package com.iformall.service.pay; + +import java.io.Serializable; + +public class PayAdapterResult implements Serializable{ + private static final long serialVersionUID = -6647306162758854293L; + private boolean isSuccess; + private String msg; + private Object data; + public boolean isSuccess() { + return isSuccess; + } + public void setSuccess(boolean isSuccess) { + this.isSuccess = isSuccess; + } + public String getMsg() { + return msg; + } + public void setMsg(String msg) { + this.msg = msg; + } + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/PayAdapterService.java b/mallinkService/src/main/java/com/iformall/service/pay/PayAdapterService.java new file mode 100644 index 000000000..c4c62d5db --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/PayAdapterService.java @@ -0,0 +1,10 @@ +package com.iformall.service.pay; + +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; + +public interface PayAdapterService { + + public PayAdapterResult pay(WxPayAccount payAccount,WxOrder order,WxPayOrder record , Object... params); +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java new file mode 100644 index 000000000..7530beaa8 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java @@ -0,0 +1,31 @@ +package com.iformall.service.pay; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.iformall.enums.EnumPayAdapter; +import com.iformall.service.pay.impl.WxPayAdapterService; + +/** + * 支付方式工厂 + * @author alascor + */ +public class PayServiceFactory { + + private static Map serviceMap = new ConcurrentHashMap(); + + public static PayAdapterService getPayAdapterService(int type) { + if (serviceMap.containsKey(type)) { + return serviceMap.get(type); + }else { + PayAdapterService payService = null; + if(EnumPayAdapter.WX_PAY.getType()==type) { + payService = new WxPayAdapterService(); + }else { + //other pay + } + serviceMap.put(type, payService); + } + return serviceMap.get(type); + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java b/mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java new file mode 100644 index 000000000..07a6a2a6d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java @@ -0,0 +1,186 @@ +package com.iformall.service.pay.impl; + +import java.util.Date; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.po.WxPayOrder; +import com.iformall.enums.EnumPayMode; +import com.iformall.enums.EnumPayShare; +import com.iformall.exception.MallinkException; +import com.iformall.pay.WxPay; +import com.iformall.pay.WxPayOrderP; +import com.iformall.pay.WxPayOrderSP; +import com.iformall.pay.WxPayment; +import com.iformall.service.pay.PayAdapterResult; +import com.iformall.service.pay.PayAdapterService; +import com.iformall.utils.BeanUtils; +import com.iformall.utils.MapUtil; +import com.iformall.utils.Utility; + +public class WxPayAdapterService implements PayAdapterService{ + + @Override + public PayAdapterResult pay(WxPayAccount payAccount, WxOrder order, WxPayOrder record, Object... params) { + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { + // 统一下单 普通商户模式 + String noncestr = Utility.generate32UUID(); + WxPayOrderP wxPayOrderP = new WxPayOrderP(); + wxPayOrderP.setOpenid(user.getOpenId()); + wxPayOrderP.setAppid(user.getAppId()); + wxPayOrderP.setMch_id(payAccount.getMchId()); + wxPayOrderP.setNonce_str(noncestr); + wxPayOrderP.setBody(order.getDetail()); + wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderP.setTotal_fee(order.getPayment()); + wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderP.setGoods_tag(String.valueOf(order.getProductId())); + wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID + wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); + wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + Map payOrderMap = BeanUtils.toStringMap(wxPayOrderP); + wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey())); + String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); + logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + returnMap.put("payOrderId", String.valueOf(record.getId())); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + String prepay_id = returnMap.get("prepay_id"); + // update payOrder with prepay_id + record.setPrepayId(prepay_id); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateById(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + + String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", returnMap.get("appid")); + sighMap.put("timeStamp", timestamp); + sighMap.put("nonceStr", noncestr); + sighMap.put("package", "prepay_id=" + prepay_id); + sighMap.put("signType", "MD5"); + String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); + returnMap.put("timeStamp", timestamp); + returnMap.put("nonceStr", noncestr); + returnMap.put("package", "prepay_id=" + prepay_id); + returnMap.put("paySign", signAgent); + logger.info("back to UI: " + returnMap.toString()); + return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); + } else { + String errMsg = ""; + JSONObject errObj = errorMap.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + record.setFailReason(errMsg); + } else { + errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + } + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateById(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); + } + } else { + // 统一下单 // 服务商模式 + String noncestr = Utility.generate32UUID(); + WxPayOrderSP wxPayOrderSP = new WxPayOrderSP(); + wxPayOrderSP.setSub_openid(user.getOpenId()); + wxPayOrderSP.setAppid(appInfo.getParentAppId()); + wxPayOrderSP.setMch_id(payAccount.getMchId()); + wxPayOrderSP.setSub_appid(user.getAppId()); + wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId()); + wxPayOrderSP.setNonce_str(noncestr); + wxPayOrderSP.setBody(order.getDetail()); + wxPayOrderSP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderSP.setTotal_fee(order.getPayment().toString()); + wxPayOrderSP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderSP.setGoods_tag(String.valueOf(order.getProductId())); // 券ID + wxPayOrderSP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderSP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderSP.setProduct_id(String.valueOf(order.getProductId())); // 券ID + wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); + wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + wxPayOrderSP.setSign_type("HMAC-SHA256"); + wxPayOrderSP.setProfit_sharing(null); + if (isShare == EnumPayShare.YES) { + wxPayOrderSP.setProfit_sharing("Y"); + } + Map payOrderMap = BeanUtils.toStringMap(wxPayOrderSP); + + wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey())); + String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderSP)); + logger.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + returnMap.put("payOrderId", String.valueOf(record.getId())); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + String prepay_id = returnMap.get("prepay_id"); + // update payOrder with prepay_id + record.setPrepayId(prepay_id); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateById(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + + String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", appInfo.getAppId()); + sighMap.put("timeStamp", timestamp); + sighMap.put("nonceStr", noncestr); + sighMap.put("package", "prepay_id=" + prepay_id); + sighMap.put("signType", "HMAC-SHA256"); + String signAgent = WxPayment.createSignHMAC(sighMap, payAccount.getApiKey()); + returnMap.put("timeStamp", timestamp); + returnMap.put("nonceStr", noncestr); + returnMap.put("package", "prepay_id=" + prepay_id); + returnMap.put("paySign", signAgent); + returnMap.put("signType", "HMAC-SHA256"); + logger.info("back to UI: " + returnMap.toString()); + return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); + } else { + String errMsg = ""; + JSONObject errObj = errorMap.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + record.setFailReason(errMsg); + } else { + errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + } + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateById(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); + } + } + } + +} From 2ed6058e42c072d89024c8b3937d5e1e73aadf6d Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Tue, 28 Jul 2020 20:00:10 +0800 Subject: [PATCH 3/3] update --- .../com/iformall/enums/EnumPayAdapter.java | 30 --- .../service/impl/WxPayOrderServiceImpl.java | 19 +- .../service/pay/PayServiceFactory.java | 6 +- .../service/pay/impl/WxPayAdapterService.java | 249 +++++++++++------- 4 files changed, 155 insertions(+), 149 deletions(-) delete mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java b/mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java deleted file mode 100644 index 5e1ed6bd3..000000000 --- a/mallinkService/src/main/java/com/iformall/enums/EnumPayAdapter.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.iformall.enums; - -public enum EnumPayAdapter { - - WX_PAY(1,"微信支付"); - - private int type; - private String name; - - EnumPayAdapter(int type, String name) { - this.type = type; - this.name = name; - } - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index e5621d2f9..7df6c0a52 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -90,23 +90,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Autowired PosCouponOrderVerifyMapper posCouponOrderVerifyMapper; - JSONObject errorMap = JSON.parseObject("{" + - "\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + - "\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"用户帐号余额不足\",\"resolution\":\"用户帐号余额不足,请用户充值或更换支付卡后再支付\"}," + - "\"ORDERPAID\":{\"detail\":\"商户订单已支付\",\"reason\":\"商户订单已支付,无需重复操作\",\"resolution\":\"商户订单已支付,无需更多操作\"}," + - "\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"当前订单已关闭,无法支付\",\"resolution\":\"当前订单已关闭,请重新下单\"}," + - "\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"系统超时\",\"resolution\":\"系统异常,请用相同参数重新调用\"}," + - "\"APPID_NOT_EXIST\":{\"detail\":\"APPID不存在\",\"reason\":\"参数中缺少APPID\",\"resolution\":\"请检查APPID是否正确\"}," + - "\"MCHID_NOT_EXIST\":{\"detail\":\"MCHID不存在\",\"reason\":\"参数中缺少MCHID\",\"resolution\":\"请检查MCHID是否正确\"}," + - "\"APPID_MCHID_NOT_MATCH\":{\"detail\":\"appid和mch_id不匹配\",\"reason\":\"appid和mch_id不匹配\",\"resolution\":\"请确认appid和mch_id是否匹配\"}," + - "\"LACK_PARAMS\":{\"detail\":\"缺少参数\t\",\"reason\":\"缺少必要的请求参数\",\"resolution\":\"请检查参数是否齐全\"}," + - "\"OUT_TRADE_NO_USED\":{\"detail\":\"商户订单号重复\",\"reason\":\"同一笔交易不能多次提交\",\"resolution\":\"请核实商户订单号是否重复提交\"}," + - "\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," + - "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"resolution\":\"请检查XML参数格式是否正确\"}," + - "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + - "\"POST_DATA_EMPTY\":{\"detail\":\"post数据为空\",\"reason\":\"post数据不能为空\",\"resolution\":\"请检查post数据是否为空\"}," + - "\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}"); - JSONObject errorMapQuery = JSON.parseObject("{" + "\"ORDERNOTEXIST\":{\"detail\":\"此交易订单号不存在\",\"reason\":\"查询系统中不存在此交易订单号\",\"resolution\":\"该API只能查提交支付交易返回成功的订单,请商户检查需要查询的订单号是否正确\"},\n" + "\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"后台系统返回错误\",\"resolution\":\"系统异常,请再调用发起查询\"}}"); @@ -408,7 +391,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { } } - PayServiceFactory.getPayAdapterService(1).pay(payAccount, order, oldRecord, params); + PayServiceFactory.getPayAdapterService(payWay.getCode()).pay(payAccount, order, oldRecord, params); } catch (RuntimeException e) { logger.error("createwxpayorder error:",e); throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); diff --git a/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java index 7530beaa8..79abf1325 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/PayServiceFactory.java @@ -3,7 +3,7 @@ package com.iformall.service.pay; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import com.iformall.enums.EnumPayAdapter; +import com.iformall.enums.EnumPayWay; import com.iformall.service.pay.impl.WxPayAdapterService; /** @@ -14,12 +14,12 @@ public class PayServiceFactory { private static Map serviceMap = new ConcurrentHashMap(); - public static PayAdapterService getPayAdapterService(int type) { + public static PayAdapterService getPayAdapterService(Integer type) { if (serviceMap.containsKey(type)) { return serviceMap.get(type); }else { PayAdapterService payService = null; - if(EnumPayAdapter.WX_PAY.getType()==type) { + if(EnumPayWay.PAY_WAY_WECHAT.getCode().intValue()==type.intValue()) { payService = new WxPayAdapterService(); }else { //other pay diff --git a/mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java b/mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java index 07a6a2a6d..473974539 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/impl/WxPayAdapterService.java @@ -3,10 +3,12 @@ package com.iformall.service.pay.impl; import java.util.Date; import java.util.Map; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; +import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.WxPayOrder; @@ -23,114 +25,165 @@ import com.iformall.utils.BeanUtils; import com.iformall.utils.MapUtil; import com.iformall.utils.Utility; +import lombok.extern.slf4j.Slf4j; + +@Slf4j public class WxPayAdapterService implements PayAdapterService{ + + JSONObject errorMap = JSON.parseObject("{" + + "\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + + "\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"用户帐号余额不足\",\"resolution\":\"用户帐号余额不足,请用户充值或更换支付卡后再支付\"}," + + "\"ORDERPAID\":{\"detail\":\"商户订单已支付\",\"reason\":\"商户订单已支付,无需重复操作\",\"resolution\":\"商户订单已支付,无需更多操作\"}," + + "\"ORDERCLOSED\":{\"detail\":\"订单已关闭\",\"reason\":\"当前订单已关闭,无法支付\",\"resolution\":\"当前订单已关闭,请重新下单\"}," + + "\"SYSTEMERROR\":{\"detail\":\"系统错误\t\",\"reason\":\"系统超时\",\"resolution\":\"系统异常,请用相同参数重新调用\"}," + + "\"APPID_NOT_EXIST\":{\"detail\":\"APPID不存在\",\"reason\":\"参数中缺少APPID\",\"resolution\":\"请检查APPID是否正确\"}," + + "\"MCHID_NOT_EXIST\":{\"detail\":\"MCHID不存在\",\"reason\":\"参数中缺少MCHID\",\"resolution\":\"请检查MCHID是否正确\"}," + + "\"APPID_MCHID_NOT_MATCH\":{\"detail\":\"appid和mch_id不匹配\",\"reason\":\"appid和mch_id不匹配\",\"resolution\":\"请确认appid和mch_id是否匹配\"}," + + "\"LACK_PARAMS\":{\"detail\":\"缺少参数\t\",\"reason\":\"缺少必要的请求参数\",\"resolution\":\"请检查参数是否齐全\"}," + + "\"OUT_TRADE_NO_USED\":{\"detail\":\"商户订单号重复\",\"reason\":\"同一笔交易不能多次提交\",\"resolution\":\"请核实商户订单号是否重复提交\"}," + + "\"SIGNERROR\":{\"detail\":\"签名错误\",\"reason\":\"参数签名结果不正确\",\"resolution\":\"请检查签名参数和方法是否都符合签名算法要求\"}," + + "\"XML_FORMAT_ERROR\":{\"detail\":\"XML格式错误\t\",\"reason\":\"XML格式错误\",\"resolution\":\"请检查XML参数格式是否正确\"}," + + "\"REQUIRE_POST_METHOD\":{\"detail\":\"请使用post方法\",\"reason\":\"未使用post传递参数\",\"resolution\":\"请检查请求参数是否通过post方法提交\"}," + + "\"POST_DATA_EMPTY\":{\"detail\":\"post数据为空\",\"reason\":\"post数据不能为空\",\"resolution\":\"请检查post数据是否为空\"}," + + "\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}"); + + + private WxPayOrderP generateWxPayOrderP(WxPayAccount payAccount, WxOrder order, WxPayOrder record,String openId,String appId,Date currentDate) throws Exception { + // 统一下单 普通商户模式 + String noncestr = Utility.generate32UUID(); + WxPayOrderP wxPayOrderP = new WxPayOrderP(); + wxPayOrderP.setOpenid(openId); + wxPayOrderP.setAppid(appId); + wxPayOrderP.setMch_id(payAccount.getMchId()); + wxPayOrderP.setNonce_str(noncestr); + wxPayOrderP.setBody(order.getDetail()); + wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderP.setTotal_fee(order.getPayment()); + wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderP.setGoods_tag(String.valueOf(order.getProductId())); + wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID + wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); + wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + Map payOrderMap = BeanUtils.toStringMap(wxPayOrderP); + wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey())); + return wxPayOrderP; + } + + private PayAdapterResult getOrderPResult(Map returnMap,WxPayOrder record,String noncestr) { + returnMap.put("payOrderId", String.valueOf(record.getId())); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + String prepay_id = returnMap.get("prepay_id"); + // update payOrder with prepay_id + record.setPrepayId(prepay_id); + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateById(record); + } catch (Exception e) { + log.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + + String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); + Map sighMap = MapUtil.getOrderMap(); + sighMap.put("appId", returnMap.get("appid")); + sighMap.put("timeStamp", timestamp); + sighMap.put("nonceStr", noncestr); + sighMap.put("package", "prepay_id=" + prepay_id); + sighMap.put("signType", "MD5"); + String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); + returnMap.put("timeStamp", timestamp); + returnMap.put("nonceStr", noncestr); + returnMap.put("package", "prepay_id=" + prepay_id); + returnMap.put("paySign", signAgent); + log.info("back to UI: " + returnMap.toString()); + return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); + } else { + String errMsg = ""; + JSONObject errObj = errorMap.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + record.setFailReason(errMsg); + } else { + errMsg = returnMap.get("return_msg"); + record.setFailReason(errMsg); + } + record.setUpdateTime(new Date()); + try { + wxPayOrderMapper.updateById(record); + } catch (Exception e) { + logger.error("pay order update error: " + record.toString()); + throw new MallinkException(ErrorCode.DB_FAIL); + } + return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); + } + } + + + + private WxPayOrderSP generateWxPayOrderSP(WxPayAccount payAccount, WxOrder order, WxPayOrder record,WxAppinfo appInfo,String openId,String parentAppId,String appId,Date currentDate,EnumPayShare isShare) throws Exception { + String noncestr = Utility.generate32UUID(); + WxPayOrderSP wxPayOrderSP = new WxPayOrderSP(); + wxPayOrderSP.setSub_openid(openId); + wxPayOrderSP.setAppid(appInfo.getParentAppId()); + wxPayOrderSP.setMch_id(payAccount.getMchId()); + wxPayOrderSP.setSub_appid(appId); + wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId()); + wxPayOrderSP.setNonce_str(noncestr); + wxPayOrderSP.setBody(order.getDetail()); + wxPayOrderSP.setOut_trade_no(record.getPayOrderNo()); + wxPayOrderSP.setTotal_fee(order.getPayment().toString()); + wxPayOrderSP.setSpbill_create_ip(record.getIp()); // 终端IP + wxPayOrderSP.setGoods_tag(String.valueOf(order.getProductId())); // 券ID + wxPayOrderSP.setNotify_url(payAccount.getPayNotifyUrl()); + wxPayOrderSP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + wxPayOrderSP.setProduct_id(String.valueOf(order.getProductId())); // 券ID + wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); + Date futureDate = new Date(); + futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); + wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 + wxPayOrderSP.setSign_type("HMAC-SHA256"); + wxPayOrderSP.setProfit_sharing(null); + if (isShare == EnumPayShare.YES) { + wxPayOrderSP.setProfit_sharing("Y"); + } + Map payOrderMap = BeanUtils.toStringMap(wxPayOrderSP); + wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey())); + return wxPayOrderSP; + } + + + + @Override public PayAdapterResult pay(WxPayAccount payAccount, WxOrder order, WxPayOrder record, Object... params) { + WxAppinfo appInfo = (WxAppinfo) params[01]; + String openId = (String) params[1]; + String appId = (String) params[2]; + Date currentDate = (Date) params[3]; + EnumPayShare isShare = (EnumPayShare) params[4]; + + + if (payAccount.getType() == EnumPayMode.MCH.getCode()) { - // 统一下单 普通商户模式 - String noncestr = Utility.generate32UUID(); - WxPayOrderP wxPayOrderP = new WxPayOrderP(); - wxPayOrderP.setOpenid(user.getOpenId()); - wxPayOrderP.setAppid(user.getAppId()); - wxPayOrderP.setMch_id(payAccount.getMchId()); - wxPayOrderP.setNonce_str(noncestr); - wxPayOrderP.setBody(order.getDetail()); - wxPayOrderP.setOut_trade_no(record.getPayOrderNo()); - wxPayOrderP.setTotal_fee(order.getPayment()); - wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP - wxPayOrderP.setGoods_tag(String.valueOf(order.getProductId())); - wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl()); - wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 - wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID - wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); - Date futureDate = new Date(); - futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); - wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 - Map payOrderMap = BeanUtils.toStringMap(wxPayOrderP); - wxPayOrderP.setSign(WxPayment.createSign(payOrderMap, payAccount.getApiKey())); + WxPayOrderP wxPayOrderP = generateWxPayOrderP(payAccount,order,record,openId,appId,currentDate); String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); - logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); + log.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); - returnMap.put("payOrderId", String.valueOf(record.getId())); - String result_code = returnMap.get("result_code"); - if ("SUCCESS".equals(result_code)) { - String prepay_id = returnMap.get("prepay_id"); - // update payOrder with prepay_id - record.setPrepayId(prepay_id); - record.setUpdateTime(new Date()); - try { - wxPayOrderMapper.updateById(record); - } catch (Exception e) { - logger.error("pay order update error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); - } - - String timestamp = String.valueOf(Utility.getCurrentTimeStamp()); - Map sighMap = MapUtil.getOrderMap(); - sighMap.put("appId", returnMap.get("appid")); - sighMap.put("timeStamp", timestamp); - sighMap.put("nonceStr", noncestr); - sighMap.put("package", "prepay_id=" + prepay_id); - sighMap.put("signType", "MD5"); - String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey()); - returnMap.put("timeStamp", timestamp); - returnMap.put("nonceStr", noncestr); - returnMap.put("package", "prepay_id=" + prepay_id); - returnMap.put("paySign", signAgent); - logger.info("back to UI: " + returnMap.toString()); - return new ResultData(Result.SUCCESS, "创建支付订单成功", returnMap); - } else { - String errMsg = ""; - JSONObject errObj = errorMap.getJSONObject(result_code); - if (errObj != null) { - errMsg = errObj.toJSONString(); - record.setFailReason(errMsg); - } else { - errMsg = returnMap.get("return_msg"); - record.setFailReason(errMsg); - } - record.setUpdateTime(new Date()); - try { - wxPayOrderMapper.updateById(record); - } catch (Exception e) { - logger.error("pay order update error: " + record.toString()); - throw new MallinkException(ErrorCode.DB_FAIL); - } - return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errMsg, returnMap); - } + + } else { // 统一下单 // 服务商模式 - String noncestr = Utility.generate32UUID(); - WxPayOrderSP wxPayOrderSP = new WxPayOrderSP(); - wxPayOrderSP.setSub_openid(user.getOpenId()); - wxPayOrderSP.setAppid(appInfo.getParentAppId()); - wxPayOrderSP.setMch_id(payAccount.getMchId()); - wxPayOrderSP.setSub_appid(user.getAppId()); - wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId()); - wxPayOrderSP.setNonce_str(noncestr); - wxPayOrderSP.setBody(order.getDetail()); - wxPayOrderSP.setOut_trade_no(record.getPayOrderNo()); - wxPayOrderSP.setTotal_fee(order.getPayment().toString()); - wxPayOrderSP.setSpbill_create_ip(record.getIp()); // 终端IP - wxPayOrderSP.setGoods_tag(String.valueOf(order.getProductId())); // 券ID - wxPayOrderSP.setNotify_url(payAccount.getPayNotifyUrl()); - wxPayOrderSP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 - wxPayOrderSP.setProduct_id(String.valueOf(order.getProductId())); // 券ID - wxPayOrderSP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentDate)); - Date futureDate = new Date(); - futureDate.setTime(currentDate.getTime() + 15 * 60 * 1000); - wxPayOrderSP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(futureDate)); // 15分钟后结束 - wxPayOrderSP.setSign_type("HMAC-SHA256"); - wxPayOrderSP.setProfit_sharing(null); - if (isShare == EnumPayShare.YES) { - wxPayOrderSP.setProfit_sharing("Y"); - } - Map payOrderMap = BeanUtils.toStringMap(wxPayOrderSP); - - wxPayOrderSP.setSign(WxPayment.createSignHMAC(payOrderMap, payAccount.getApiKey())); + WxPayOrderSP wxPayOrderSP = generateWxPayOrderSP(payAccount,order,record,openId,parentAppId,appId,currentDate,isShare); String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderSP)); - logger.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString()); + log.info("pay order, wechat pushOrder, " + wxPayOrderSP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); returnMap.put("payOrderId", String.valueOf(record.getId())); String result_code = returnMap.get("result_code");