diff --git a/hai-cweb/src/main/java/com/cweb/controller/OutRechargeOrderController.java b/hai-cweb/src/main/java/com/cweb/controller/OutRechargeOrderController.java index d20c2b11..89816fe7 100644 --- a/hai-cweb/src/main/java/com/cweb/controller/OutRechargeOrderController.java +++ b/hai-cweb/src/main/java/com/cweb/controller/OutRechargeOrderController.java @@ -13,6 +13,7 @@ import com.hai.common.pay.util.HttpReqUtil; import com.hai.common.pay.util.MD5Util; import com.hai.common.pay.util.XmlUtil; import com.hai.common.pay.util.sdk.WXPayConstants; +import com.hai.common.security.AESEncodeUtil; import com.hai.common.security.SessionObject; import com.hai.common.security.UserCenter; import com.hai.common.utils.*; @@ -79,6 +80,12 @@ public class OutRechargeOrderController { @Resource private SecConfigService secConfigService; + @Resource + private HighUserPayPasswordService highUserPayPasswordService; + + @Resource + private HighUserCardService highUserCardService; + @RequestMapping(value="/addOrder",method = RequestMethod.POST) @ResponseBody @@ -243,8 +250,8 @@ public class OutRechargeOrderController { map.put("orderNo", order.getOrderNo()); map.put("payPrice", order.getPayPrice()); map.put("orderScene", "RECHARGE_ORDER"); - map.put("body","购买产品"); - map.put("subject","购买产品"); + map.put("body","充值话费"); + map.put("subject","充值话费"); //微信支付 String nonce_str = MD5Util.MD5Encode(String.valueOf(ThreadLocalRandom.current().nextInt(10000)), "UTF-8"); @@ -280,6 +287,69 @@ public class OutRechargeOrderController { } } + + @RequestMapping(value="/hltUnionCardPay",method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "工会卡支付") + public ResponseData hltUnionCardPay(@RequestBody JSONObject body,HttpServletRequest request) { + try { + // 用户 + SessionObject sessionObject = userCenter.getSessionObject(request); + HighUserModel userInfoModel = (HighUserModel) sessionObject.getObject(); + + if (body == null + || body.getLong("orderId") == null + || StringUtils.isBlank(body.getString("cardNo")) + ) { + log.error("orderToPay error!", "参数错误"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, ""); + } + + // 查询用户支付密码 + HighUserPayPassword userPayPassword = highUserPayPasswordService.getDetailByUser(userInfoModel.getHighUser().getId()); + if (userPayPassword == null) { + log.error("orderToPay error!", "未设置支付密码"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_SET_USER_PAY_PWD, ""); + } + if (StringUtils.isBlank(body.getString("password"))) { + log.error("hltUnionCardPay error!", "未输入支付密码"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_ENTER_USER_PAY_PWD, ""); + } + // 校验支付密码是否一直 + if (!AESEncodeUtil.aesEncrypt(body.getString("password")).equals(userPayPassword.getPassword())) { + log.error("hltUnionCardPay error!", ""); + throw ErrorHelp.genException(SysCode.System, ErrorCode.USER_PAY_PWD_ERROR, ""); + } + + // 查询用户与卡号的关系 + HighUserCard userCard = highUserCardService.getDetailByUserCardNo(userInfoModel.getHighUser().getId(), body.getString("cardNo")); + if (userCard == null) { + log.error("hltUnionCardPay() ERROR", "未绑定卡号"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未绑定卡号"); + } + + // 订单 + OutRechargeOrder order = outRechargeOrderService.findByOrderId(body.getLong("orderId")); + if (order == null) { + log.error("hltUnionCardPay error!", "未找到订单信息"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到订单信息"); + } + + // 订单状态 : 1.待支付 2.已支付 3.已完成 4.已退款 5.已取消 + if (order.getStatus() != 1) { + log.error("hltUnionCardPay error!", "无法支付,订单不处于待支付状态"); + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "无法支付,订单不处于待支付状态"); + } + + outRechargeOrderService.hltUnionCardPay(userCard.getId(), order.getId()); + + return ResponseMsgUtil.success(outRechargeOrderService.findByOrderId(body.getLong("orderId"))); + } catch (Exception e) { + log.error("hltUnionCardPay error!", e); + return ResponseMsgUtil.exception(e); + } + } + @RequestMapping(value = "/orderToRefund", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "订单退款") diff --git a/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java b/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java index 5caad269..e92b2393 100644 --- a/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java +++ b/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java @@ -97,6 +97,7 @@ public class HuiLianTongUnionCardConfig { * @param cardNo 卡号 * @param tranAmount 支付金额 * @param businessType 业务类型 1.卖中石化加油券的,固定填sinopec_oil_code 2.其他商品或服务的,固定填hisen_consume + * @param instCode 消费终端号 * @param goodsDesc 商品描述 * @param tranDesc 交易描述 * @return diff --git a/hai-service/src/main/java/com/hai/service/OutRechargeOrderService.java b/hai-service/src/main/java/com/hai/service/OutRechargeOrderService.java index cadce2fe..b29ec158 100644 --- a/hai-service/src/main/java/com/hai/service/OutRechargeOrderService.java +++ b/hai-service/src/main/java/com/hai/service/OutRechargeOrderService.java @@ -108,4 +108,9 @@ public interface OutRechargeOrderService { **/ List getUserCountList(Map map) throws Exception; + /** + * 汇联通支付 + * @param orderId + */ + void hltUnionCardPay(Long userCardId, Long orderId); } diff --git a/hai-service/src/main/java/com/hai/service/impl/OutRechargeOrderServiceImpl.java b/hai-service/src/main/java/com/hai/service/impl/OutRechargeOrderServiceImpl.java index b6e7fd77..e63a610a 100644 --- a/hai-service/src/main/java/com/hai/service/impl/OutRechargeOrderServiceImpl.java +++ b/hai-service/src/main/java/com/hai/service/impl/OutRechargeOrderServiceImpl.java @@ -1,12 +1,21 @@ package com.hai.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hai.common.exception.ErrorCode; +import com.hai.common.exception.ErrorHelp; +import com.hai.common.exception.SysCode; import com.hai.common.utils.DateUtil; +import com.hai.config.HuiLianTongUnionCardConfig; +import com.hai.dao.HighGasOrderPushMapper; import com.hai.dao.OutRechargeOrderMapper; import com.hai.dao.OutRechargeOrderMapperExt; import com.hai.entity.*; +import com.hai.enum_type.OrderPushType; import com.hai.model.OutOrderModel; import com.hai.model.OutRechargeOrderModel; import com.hai.model.OutUserOrderModel; +import com.hai.service.HighUserCardService; import com.hai.service.OutRechargeOrderService; import io.swagger.models.auth.In; import org.apache.commons.collections4.MapUtils; @@ -18,10 +27,7 @@ import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; @Service("outRechargeOrderService") public class OutRechargeOrderServiceImpl implements OutRechargeOrderService { @@ -32,6 +38,12 @@ public class OutRechargeOrderServiceImpl implements OutRechargeOrderService { @Resource private OutRechargeOrderMapperExt outRechargeOrderMapperExt; + @Resource + private HighUserCardService highUserCardService; + + @Resource + private HighGasOrderPushMapper highGasOrderPushMapper; + @Override public List getListRechargeOrder(Map map) { OutRechargeOrderExample example = new OutRechargeOrderExample(); @@ -231,4 +243,63 @@ public class OutRechargeOrderServiceImpl implements OutRechargeOrderService { } return outRechargeOrderMapperExt.getListUserCount(fTimeS , fTimeE); } + + @Override + public void hltUnionCardPay(Long userCardId, Long orderId) { + try { + HighUserCard userCard = highUserCardService.getDetailById(userCardId); + if(userCard == null) { + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到用户绑定的卡号信息"); + } + OutRechargeOrder order = findByOrderId(orderId); + if (order == null) { + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到订单信息"); + } + + String goodsDesc = "充值话费"; + String tranDesc = order.getRechargeContent() + "充值" + order.getPayPrice() +"元话费"; + String instCode = "11101290"; + String businessType = "hisen_consume"; + + // 工会卡支付 + JSONObject consumption = HuiLianTongUnionCardConfig.consumption(order.getOrderNo(), userCard.getCardNo(), order.getPayPrice(), businessType, instCode, goodsDesc, tranDesc); + System.out.println("工会卡支付响应参数" + consumption.toJSONString()); + + Map dataMap = new HashMap<>(); + dataMap.put("orderNo", order.getOrderNo()); + dataMap.put("cardType", "ghk"); + dataMap.put("cardNo", userCard.getCardNo()); + dataMap.put("checkPassword", "N"); + dataMap.put("tranAmount", order.getPayPrice()); + dataMap.put("tranChannel", "HiSen"); + dataMap.put("businessType", businessType); + dataMap.put("instCode", instCode); + dataMap.put("goodsDesc", goodsDesc); + dataMap.put("tranDesc", tranDesc); + HighGasOrderPush payPush = new HighGasOrderPush(); + payPush.setType(OrderPushType.type5.getType()); + payPush.setOrderNo(userCard.getCardNo()); + payPush.setCreateTime(new Date()); + payPush.setCode(consumption.getString("respCode")); + payPush.setRequestContent(JSON.toJSONString(dataMap)); + payPush.setReturnContent(consumption.toJSONString()); + highGasOrderPushMapper.insert(payPush); + + if(!consumption.getString("respCode").equals("0000")) { + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, consumption.getString("respMessage")); + } + JSONObject consumptionResult = HuiLianTongUnionCardConfig.resolveResponse(consumption.getString("data")); + if (consumptionResult.getBoolean("success") != true) { + throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "交易失败!"+consumptionResult.getString("message")); + } + order.setPaySerialNo(consumptionResult.getString("orderId")); // 支付流水号 + order.setPayRealPrice(order.getPayPrice()); // 实付金额 + order.setStatus(2); + order.setPayType(2); + order.setPayTime(new Date()); // 支付时间 + updateOrder(order); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/hai-service/src/main/java/com/hai/service/pay/impl/RechargeOrderServiceImpl.java b/hai-service/src/main/java/com/hai/service/pay/impl/RechargeOrderServiceImpl.java index 3df47705..6e452805 100644 --- a/hai-service/src/main/java/com/hai/service/pay/impl/RechargeOrderServiceImpl.java +++ b/hai-service/src/main/java/com/hai/service/pay/impl/RechargeOrderServiceImpl.java @@ -11,6 +11,7 @@ import com.hai.config.CommonSysConst; import com.hai.config.TelConfig; import com.hai.dao.HighGasOrderPushMapper; import com.hai.entity.*; +import com.hai.enum_type.OrderPushType; import com.hai.model.ResultProfitSharing; import com.hai.service.*; import com.hai.service.pay.PayService; @@ -69,149 +70,13 @@ public class RechargeOrderServiceImpl implements PayService { if (payType.equals("WechatPay")) { // 查询订单信息 OutRechargeOrder order = outRechargeOrderService.findByOrderNo(map.get("out_trade_no")); - if (order == null) { - throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_ORDER, ""); - } - if (order.getStatus() == 1) { + if (order != null && order.getStatus() == 1) { order.setPaySerialNo(map.get("transaction_id")); // 支付流水号 order.setPayRealPrice(new BigDecimal(map.get("total_fee")).divide(new BigDecimal("100"))); // 实付金额 order.setPayTime(new Date()); // 支付时间 order.setStatus(2); // 订单状态 : 1.待支付 2.已支付 3.已完成 4.已取消 5.已退款 outRechargeOrderService.updateOrder(order); - - OutRechargePrice outRechargePrice = outRechargePriceService.findById(order.getObjectId()); - - Map mapOrder = new HashMap<>(); - mapOrder.put("cardPhone", order.getRechargeContent()); -// mapOrder.put("channel", outRechargePrice.getChannel()); -// mapOrder.put("goodsId", outRechargePrice.getGoodsId()); - mapOrder.put("orderAmount", order.getOrderPrice()); - mapOrder.put("orderNumber", order.getOrderNo()); - mapOrder.put("callbackUrl", CommonSysConst.getSysConfig().getCzOrderNotify()); - mapOrder.put("orderTime", order.getCreateTimed()); - mapOrder.put("paymentAmount", order.getPayPrice()); - - JSONObject data = TelConfig.order(mapOrder); - - // 推送订单记录 - HighGasOrderPush highGasOrderPush = new HighGasOrderPush(); - highGasOrderPush.setCreateTime(new Date()); - highGasOrderPush.setCode(data.getString("code")); - highGasOrderPush.setRequestContent(JSONObject.toJSONString(mapOrder)); - highGasOrderPush.setReturnContent(data.toJSONString()); - highGasOrderPushMapper.insert(highGasOrderPush); - } - - new Thread(() -> { - try { - Thread.sleep(60*1000); - BigDecimal rake = new BigDecimal("0.01"); - - // 计算微信收取的手续费 支付金额 * 0.002 注:如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 - BigDecimal wxHandlingFee = order.getPayRealPrice().multiply(new BigDecimal("0.002")).setScale(2,BigDecimal.ROUND_HALF_DOWN); - BigDecimal price = order.getPayRealPrice().subtract(wxHandlingFee); - - // 计算分账金额 手续费后的价格 * 0.01 注:如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 - BigDecimal profitSharingAmount = price.multiply(rake).setScale(2,BigDecimal.ROUND_DOWN); - this.wxProfitsharing(order.getPaySerialNo(),order.getOrderNo(),profitSharingAmount); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }).start(); - } - } - - - public void wxProfitsharing(String transaction_id,String out_order_no, BigDecimal amount) { - try { - Map param = new LinkedHashMap<>(); - param.put("appid", "wx637bd6f7314daa46"); - param.put("mch_id", "1289663601"); - param.put("sub_mch_id" , "1607303848"); // 九龙坡区烨歌百货经营部 - param.put("transaction_id" , transaction_id); - param.put("out_order_no" , out_order_no); - param.put("nonce_str" , WxUtils.makeNonStr()); - - // 分账金额 - BigDecimal porofitSharingAmount = amount; - - List> receiversList = new ArrayList<>(); - Map receiversMap = new LinkedHashMap<>(); - receiversMap.put("type", "MERCHANT_ID"); - receiversMap.put("account", "1611202250"); - receiversMap.put("amount", porofitSharingAmount.multiply(new BigDecimal("100")).intValue()); - receiversMap.put("description", "分给商户【重庆众卡汇电子商务有限公司】"); - receiversList.add(receiversMap); - param.put("receivers" , JSONObject.toJSONString(receiversList)); - String signStr = WxUtils.generateSignature(param, "Skufk5oi85wDFGl888i6wsRSTkdd5df5" , WXPayConstants.SignType.HMACSHA256); - param.put("sign" , signStr); - String resultXmL = this.doRefundRequest(param.get("mch_id"),null, WxUtils.mapToXml(param)); - - // 请求分账返回的结果 - ResultProfitSharing resultProfitSharing = XmlUtil.getObjectFromXML(resultXmL, ResultProfitSharing.class); - - HighProfitSharingRecord sharingRecord = new HighProfitSharingRecord(); - sharingRecord.setOutOrderNo(resultProfitSharing.getOut_order_no()); - sharingRecord.setTransactionId(resultProfitSharing.getTransaction_id()); - sharingRecord.setOrderId(resultProfitSharing.getOrder_id()); - sharingRecord.setStatus(resultProfitSharing.getResult_code()); - sharingRecord.setPrice(amount); - sharingRecord.setCreateTime(new Date()); - sharingRecord.setContent(resultXmL); - highProfitSharingRecordService.insert(sharingRecord); - - } catch (Exception e) { - log.error("CmsContentController --> getCorporateAdvertising() error!", e); - } - } - - - public CloseableHttpClient readCertificate(String mchId) throws Exception{ - /** - * 注意PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的 - */ - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - //P12文件目录 证书路径,这里需要你自己修改,linux下还是windows下的根路径 - FileInputStream instream = new FileInputStream("/home/project/wx_cert/1289663601_apiclient_cert.p12"); - // FileInputStream instream = new FileInputStream("G:\\hurui-project/hai-parent/hai-service/src/main/java/privatekey/1289663601_apiclient_cert.p12"); - try { - keyStore.load(instream, "1289663601".toCharArray());//这里写密码..默认是你的MCHID - } finally { - instream.close(); - } - SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "1289663601".toCharArray()).build();//这里也是写密码的 - SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.getDefaultHostnameVerifier()); - // Allow TLSv1 protocol only - return HttpClients.custom().setSSLSocketFactory(sslsf).build(); - } - - public String doRefundRequest(String mchId, String url, String data) throws Exception { - - //小程序退款需要调用双向证书的认证 - CloseableHttpClient httpClient = readCertificate(mchId); - try { - HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/profitsharing"); // 设置响应头信息 - httpost.addHeader("Connection", "keep-alive"); - httpost.addHeader("Accept", "*/*"); - httpost.addHeader("Content-Type", "text/xml"); - httpost.addHeader("Host", "api.mch.weixin.qq.com"); - httpost.addHeader("X-Requested-With", "XMLHttpRequest"); - httpost.addHeader("Cache-Control", "max-age=0"); - httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); - httpost.setEntity(new StringEntity(data, "UTF-8")); - CloseableHttpResponse response = httpClient.execute(httpost); - try { - HttpEntity entity = response.getEntity(); - String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); - EntityUtils.consume(entity); - return jsonStr; - } finally { - response.close(); } - } catch (Exception e){ - throw new RuntimeException(e); - } finally { - httpClient.close(); } }