package com.java110.acct.cmd.alipay; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradeCreateRequest; import com.alipay.api.response.AlipayTradeCreateResponse; import com.java110.core.annotation.Java110Cmd; import com.java110.core.context.ICmdDataFlowContext; import com.java110.core.event.cmd.Cmd; import com.java110.core.event.cmd.CmdEvent; import com.java110.core.factory.CommunitySettingFactory; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.fee.FeeDto; import com.java110.dto.ownerCarOpenUser.OwnerCarOpenUserDto; import com.java110.dto.parking.ParkingAreaDto; import com.java110.dto.smallWeChat.SmallWeChatDto; import com.java110.intf.community.IParkingAreaV1InnerServiceSMO; import com.java110.intf.fee.ITempCarFeeCreateOrderV1InnerServiceSMO; import com.java110.intf.store.ISmallWechatV1InnerServiceSMO; import com.java110.intf.user.IOwnerCarOpenUserV1InnerServiceSMO; import com.java110.po.ownerCarOpenUser.OwnerCarOpenUserPo; import com.java110.utils.cache.CommonCache; import com.java110.utils.cache.MappingCache; import com.java110.utils.exception.CmdException; import com.java110.utils.util.Assert; import com.java110.utils.util.DateUtil; import com.java110.vo.ResultVo; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import java.text.ParseException; import java.util.ArrayList; import java.util.List; @Java110Cmd(serviceCode = "alipay.payTempCarFee") public class PayTempCarFeeCmd extends Cmd { @Autowired private IOwnerCarOpenUserV1InnerServiceSMO ownerCarOpenUserV1InnerServiceSMOImpl; @Autowired private IParkingAreaV1InnerServiceSMO parkingAreaV1InnerServiceSMOImpl; @Autowired private ISmallWechatV1InnerServiceSMO smallWechatV1InnerServiceSMOImpl; @Autowired private ITempCarFeeCreateOrderV1InnerServiceSMO tempCarFeeCreateOrderV1InnerServiceSMOImpl; @Override public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { Assert.jsonObjectHaveKey(reqJson, "carNum", "请求报文中未包含房屋信息节点"); Assert.jsonObjectHaveKey(reqJson, "appId", "请求报文中未包含appId节点"); Assert.jsonObjectHaveKey(reqJson, "openId", "请求报文中未包含openId节点"); Assert.jsonObjectHaveKey(reqJson, "paId", "请求报文中未包含paId节点"); Assert.jsonObjectHaveKey(reqJson, "inoutId", "请求报文中未包含inoutId节点"); Assert.jsonObjectHaveKey(reqJson, "couponList", "请求报文中未包含couponList节点"); } @Override public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { ResponseEntity responseEntity = null; //根据paId 查询communityId ParkingAreaDto parkingAreaDto = new ParkingAreaDto(); parkingAreaDto.setPaId(reqJson.getString("paId")); List parkingAreaDtos = parkingAreaV1InnerServiceSMOImpl.queryParkingAreas(parkingAreaDto); Assert.listOnlyOne(parkingAreaDtos, "停车场不存在"); reqJson.put("communityId", parkingAreaDtos.get(0).getCommunityId()); JSONArray couponList = reqJson.getJSONArray("couponList"); List couponIds = new ArrayList(); if (couponList != null && couponList.size() > 0) { for (int couponIndex = 0; couponIndex < couponList.size(); couponIndex++) { couponIds.add(couponList.getJSONObject(couponIndex).getString("couponId")); } } //查询用户ID reqJson.put("userId", "-1"); JSONObject paramIn = new JSONObject(); paramIn.put("paId", reqJson.getString("paId")); paramIn.put("carNum", reqJson.getString("carNum")); paramIn.put("machineId", reqJson.getString("machineId")); paramIn.put("couponIds", StringUtils.join(couponIds, ",")); responseEntity = tempCarFeeCreateOrderV1InnerServiceSMOImpl.createOrder(paramIn); if (responseEntity.getStatusCode() != HttpStatus.OK) { context.setResponseEntity(responseEntity); return; } JSONObject orderInfo = JSONObject.parseObject(responseEntity.getBody().toString()); if (orderInfo.getIntValue("code") != 0) { throw new IllegalArgumentException("缴费失败"); } JSONObject fee = orderInfo.getJSONObject("data"); double money = fee.getDouble("receivedAmount"); String orderId = fee.getString("oId"); //需要判断金额是否 == 0 等于0 直接掉缴费通知接口 if (money <= 0) { JSONObject paramOut = new JSONObject(); paramOut.put("oId", orderId); responseEntity = tempCarFeeCreateOrderV1InnerServiceSMOImpl.notifyOrder(paramIn); JSONObject param = new JSONObject(); if (responseEntity.getStatusCode() != HttpStatus.OK) { param.put("code", "101"); param.put("msg", "扣费为0回调失败"); context.setResponseEntity(new ResponseEntity(JSONObject.toJSONString(param), HttpStatus.OK)); return; } param.put("code", "100"); param.put("msg", "扣费为0回调成功"); context.setResponseEntity(new ResponseEntity(JSONObject.toJSONString(param), HttpStatus.OK)); return; } String openId = reqJson.getString("openId"); ResultVo result = doAlipay(reqJson, paramIn.getString("feeName"), orderId, money, openId); responseEntity = new ResponseEntity(JSONObject.toJSONString(result), HttpStatus.OK); context.setResponseEntity(responseEntity); if (!"0".equals(result.getCode())) { return; } JSONObject saveFees = new JSONObject(); saveFees.put("orderId", paramIn.getString("inoutId")); saveFees.put("carNum", paramIn.getString("carNum")); saveFees.put("amount", money); saveFees.put("paId", paramIn.getString("paId")); saveFees.put("payTime", DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); saveFees.put("payType", "2"); CommonCache.setValue(FeeDto.REDIS_PAY_TEMP_CAR_FEE + orderId, saveFees.toJSONString(), CommonCache.PAY_DEFAULT_EXPIRE_TIME); CommonCache.setValue(FeeDto.REDIS_PAY_TEMP_CAR_FEE_COMMUNITY + orderId, reqJson.getString("communityId"), CommonCache.PAY_DEFAULT_EXPIRE_TIME); //记录openId 和车辆关系 以免每次 输入 车牌号麻烦 OwnerCarOpenUserPo ownerCarOpenUserPo = new OwnerCarOpenUserPo(); ownerCarOpenUserPo.setCarNum(reqJson.getString("carNum")); ownerCarOpenUserPo.setNickname("未获取"); ownerCarOpenUserPo.setHeadimgurl("为获取"); ownerCarOpenUserPo.setOpenId(openId); ownerCarOpenUserPo.setOpenType(OwnerCarOpenUserDto.OPEN_TYPE_ALIPAY); ownerCarOpenUserPo.setOpenUserId(GenerateCodeFactory.getGeneratorId("10")); ownerCarOpenUserV1InnerServiceSMOImpl.saveOwnerCarOpenUser(ownerCarOpenUserPo); } private ResultVo doAlipay(JSONObject reqJson, String feeName, String orderId, double money, String openId) { AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", CommunitySettingFactory.getValue(reqJson.getString("communityId"), "APP_ID"), CommunitySettingFactory.getRemark(reqJson.getString("communityId"), "APP_PRIVATE_KEY"), "json", "UTF-8", CommunitySettingFactory.getRemark(reqJson.getString("communityId"), "ALIPAY_PUBLIC_KEY"), "RSA2"); AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); request.setNotifyUrl(MappingCache.getValue("ALIPAY", "temp")); JSONObject bizContent = new JSONObject(); bizContent.put("out_trade_no", orderId); bizContent.put("total_amount", money); bizContent.put("subject", feeName); bizContent.put("buyer_id", openId); bizContent.put("timeout_express", "10m"); request.setBizContent(bizContent.toString()); AlipayTradeCreateResponse response = null; try { response = alipayClient.execute(request); if (response.isSuccess()) { return new ResultVo(ResultVo.CODE_OK, ResultVo.MSG_OK,orderId); } else { return new ResultVo(ResultVo.CODE_ERROR, response.getMsg()); } } catch (AlipayApiException e) { throw new CmdException("支付宝下单失败" + e); } } private SmallWeChatDto getSmallWechat(JSONObject paramIn) { SmallWeChatDto smallWeChatDto = new SmallWeChatDto(); smallWeChatDto.setAppId(paramIn.getString("appId")); smallWeChatDto.setObjId(paramIn.getString("communityId")); smallWeChatDto.setRow(1); smallWeChatDto.setPage(1); List smallWeChatDtos = smallWechatV1InnerServiceSMOImpl.querySmallWechats(smallWeChatDto); if (smallWeChatDtos == null || smallWeChatDtos.size() < 1) { return null; } return smallWeChatDtos.get(0); } }