diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java index b62635202..312b7ed5f 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCarController.java @@ -14,6 +14,7 @@ import com.iformall.service.park.entity.ParkCreatePayOrder; import com.iformall.service.park.entity.ParkStopFee; import com.iformall.service.park.impl.etcp.EtcpHelper; import com.iformall.service.park.impl.util.ParkHelper; +import com.iformall.service.park.pay.WxParkPayService; import com.iformall.service.park.utils.ParkCacheUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -67,6 +68,9 @@ public class WxCarController extends BaseController { @Autowired WxCUserBasicInfoService wxCUserBasicInfoService; + @Autowired + WxParkPayService wxParkPayService; + @Autowired ParkFactory parkFactory; @@ -421,8 +425,27 @@ public class WxCarController extends BaseController { if (StringUtils.isBlank(carNumber)) { return new ResultData(Result.ERROR,"无车牌参数."); } + if (EnumYesOrNo.YES.getCode() != park.getSupportPay()) { + return new ResultData(Result.ERROR,"当前车场配置WxPark不支持支付."); + } + CUser user = getCUser(); + if (!user.basicInfoIs()) { + logger.error("暂未成为会员,请授权手机号"); + return new ResultData(ErrorCode.USER_IS_NOT_MEMBER.getCode(), "暂未成为会员,请授权手机号"); + } + + try { + //创建车场支付订单 ParkCreatePayOrder payOrder = parkFactory.getParkService(park.getVendorType()).createPayOrder(paramMap, park,carNumber); + if (null == payOrder || StringUtils.isBlank(payOrder.getParkOrderNumber())) { + return new ResultData(Result.ERROR,"创建车场订单错误."); + } + + //查询当前停车商户的收款账号 + String mchId = ""; + //创建微信支付订单 + wxParkPayService.createWxPayOrder(user.getOpenId(), user.getAppId(), carNumber, carNumber, carNumber, carNumber, null, carNumber, carNumber, carNumber, null); return new ResultData(payOrder); } catch (Exception e) { logger.error("park getCarStopFee error",e); diff --git a/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayService.java b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayService.java new file mode 100644 index 000000000..c3b611849 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayService.java @@ -0,0 +1,15 @@ +package com.iformall.service.park.pay; + +import java.util.Date; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxCarPayOrder; +import com.iformall.service.pay.service.pay.entity.PayAdapterResult; + +public interface WxParkPayService { + + public PageInfo listPayOrderAsPage(WxCarPayOrder record, Integer pageIndex, Integer pageSize); + + public PayAdapterResult createWxPayOrder(String openId,String appId,String mchId,String productName,String attach,String payOrderNo, + Integer fee,String ip,String notifyUrl,String apiKey,Date currentDate) throws Exception; +} diff --git a/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayServiceImpl.java new file mode 100644 index 000000000..a04015719 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/park/pay/WxParkPayServiceImpl.java @@ -0,0 +1,46 @@ +package com.iformall.service.park.pay; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxCarPayOrder; +import com.iformall.mapper.WxCarPayOrderMapper; +import com.iformall.service.ExcelService; +import com.iformall.service.pay.service.pay.entity.PayAdapterResult; +import com.iformall.service.pay.service.pay.wx.v2.miniApp.appPay.WxMiniAppPayAdapterService; + +import java.util.Date; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +public class WxParkPayServiceImpl implements WxParkPayService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + ExcelService excelService; + + @Autowired + WxCarPayOrderMapper wxCarPayOrderMapper; + + @Autowired + WxMiniAppPayAdapterService wxMiniAppPayAdapterService; + + @Override + public PageInfo listPayOrderAsPage(WxCarPayOrder record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCarPayOrderMapper.findList(record)); + } + + @Override + public PayAdapterResult createWxPayOrder(String openId,String appId,String mchId,String productName,String attach,String payOrderNo, + Integer fee,String ip,String notifyUrl,String apiKey,Date currentDate) throws Exception { + return wxMiniAppPayAdapterService.pay(openId, appId, mchId, productName, attach, payOrderNo, fee, ip, notifyUrl, apiKey, currentDate); + } + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/appPay/WxMiniAppPayAdapterService.java b/mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/appPay/WxMiniAppPayAdapterService.java index 0438b5b62..a2c8331cc 100644 --- a/mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/appPay/WxMiniAppPayAdapterService.java +++ b/mallinkService/src/main/java/com/iformall/service/pay/service/pay/wx/v2/miniApp/appPay/WxMiniAppPayAdapterService.java @@ -2,6 +2,7 @@ package com.iformall.service.pay.service.pay.wx.v2.miniApp.appPay; import java.io.File; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -58,6 +59,30 @@ public class WxMiniAppPayAdapterService extends BaseWxPayV2AdapterService implem "\"POST_DATA_EMPTY\":{\"detail\":\"post数据为空\",\"reason\":\"post数据不能为空\",\"resolution\":\"请检查post数据是否为空\"}," + "\"NOT_UTF8\":{\"detail\":\"编码格式错误\",\"reason\":\"未使用指定编码格式\",\"resolution\":\"请使用UTF-8编码格式\"}}"); + private WxPayOrderP generateWxPayOrderP(String openId,String appId,String mchId,String productName,String attach,String payOrderNo,Integer fee,String ip,String notifyUrl,String apiKey,Date currentDate)throws Exception { + // 统一下单 普通商户模式 + String noncestr = Utility.generate32UUID(); + WxPayOrderP wxPayOrderP = new WxPayOrderP(); + wxPayOrderP.setOpenid(openId); + wxPayOrderP.setAppid(appId); + wxPayOrderP.setMch_id(mchId); + wxPayOrderP.setNonce_str(noncestr); + wxPayOrderP.setBody(productName); + wxPayOrderP.setAttach(attach); + wxPayOrderP.setOut_trade_no(payOrderNo); + wxPayOrderP.setTotal_fee(fee); + wxPayOrderP.setSpbill_create_ip(ip); // 终端IP + wxPayOrderP.setGoods_tag(productName); + wxPayOrderP.setNotify_url(notifyUrl); + wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型 + 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, apiKey)); + return wxPayOrderP; + } private WxPayOrderP generateWxPayOrderP(WxPayAccount payAccount,WxComposeOrder composeOrder,String productName, WxPayOrder record,String openId,String appId,Date currentDate) throws Exception { // 统一下单 普通商户模式 @@ -132,6 +157,42 @@ public class WxMiniAppPayAdapterService extends BaseWxPayV2AdapterService implem return par; } + private PayAdapterResult getOrderPResult(Map returnMap,String noncestr,String apiKey) { + PayAdapterResult par = new PayAdapterResult(); + String result_code = returnMap.get("result_code"); + if ("SUCCESS".equals(result_code)) { + par.setSuccess(true); + par.setMsg("success."); + par.setData(returnMap); + String prepay_id = returnMap.get("prepay_id"); + 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, apiKey); + 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()); + } else { + String errMsg = ""; + JSONObject errObj = errorMap.getJSONObject(result_code); + if (errObj != null) { + errMsg = errObj.toJSONString(); + } else { + errMsg = returnMap.get("return_msg"); + } + par.setSuccess(false); + par.setMsg(errMsg); + par.setData(returnMap); + } + return par; + } + private WxPayOrderSP generateWxPayOrderSP(WxPayAccount payAccount, WxComposeOrder composeOrder,String productName,WxPayOrder record,WxAppinfo appInfo,String openId,String appId,Date currentDate,EnumPayShare isShare) throws Exception { @@ -247,6 +308,14 @@ public class WxMiniAppPayAdapterService extends BaseWxPayV2AdapterService implem return getOrderSPResult(returnMap,record,payAccount,appInfo,wxPayOrderSP.getNonce_str()); } } + + public PayAdapterResult pay(String openId,String appId,String mchId,String productName,String attach,String payOrderNo,Integer fee,String ip,String notifyUrl,String apiKey,Date currentDate) throws Exception { + WxPayOrderP wxPayOrderP = generateWxPayOrderP(openId, appId, mchId, productName, attach, payOrderNo, fee, ip, notifyUrl, apiKey, currentDate); + String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP)); + log.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString()); + Map returnMap = WxPayment.xmlToMap(response); + return getOrderPResult(returnMap,wxPayOrderP.getNonce_str(),apiKey); + } @Override public PayQueryAdapterResult queryPayStatus(WxPayOrder oldRecord, WxAppinfo appInfo,