package com.pj.api.jh.service; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.hutool.log.StaticLog; import com.pj.api.jh.utils.JhHttpUtils; import com.pj.api.jh.utils.MerchantApiUtil; import com.pj.api.jh.bo.JhNotifyBO; import com.pj.api.wx.bo.Attach; import com.pj.api.wx.bo.NotifyBO; import com.pj.api.wx.service.WxService; import com.pj.current.config.JhConfig; import com.pj.current.config.MyConfig; import com.pj.current.config.PartConfig; import com.pj.project.tb_order.TbOrder; import com.pj.project.tb_order.TbOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @Auther: lzm * @Date: 2022/04/19/17:38 */ @Service @Transactional @Slf4j public class JhService { @Resource MyConfig myConfig; @Resource JhConfig jhConfig; @Resource PartConfig partConfig; @Resource WxService wxService; @Resource JhHttpUtils jhHttpUtils; @Resource private TbOrderService tbOrderService; public JSONObject initPay(HttpServletRequest request) throws Exception { String money = request.getParameter("money"); String openid = request.getParameter("openid"); String desc = request.getParameter("desc"); String businessId = request.getParameter("b"); String c = request.getParameter("c"); String a = request.getParameter("a"); Attach atchMap = new Attach(); atchMap.setC(c).setB(businessId).setA(a); String out_trade_no = RandomUtil.randomString(30); StaticLog.info("outTradeNo:{}", out_trade_no); Map params = new HashMap<>(); params.put("attach", JSONUtil.toJsonStr(atchMap)); params.put("productType", jhConfig.getProductType()); params.put("businessMerchantNo", jhConfig.getBusinessMerchantNo()); params.put("openId", openid); params.put("merchantNo", jhConfig.getBusinessMerchantNo()); params.put("tradeType", jhConfig.getTradeType()); params.put("subTradeType", ""); String total_free = partConfig.isTestEnv() ? "0.01" : money + ""; log.info("order price:{}", total_free); params.put("orderPrice", total_free); params.put("outTradeNo", out_trade_no); params.put("productName", desc); params.put("orderIp", WxService.getIpAddress(request)); String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); params.put("orderTime", now); params.put("returnUrl", ""); params.put("notifyUrl", myConfig.getDomain() + "/jh/notify"); params.put("remark", desc); String paySecrit = jhConfig.getPaySecret(); String sign = MerchantApiUtil.getSign(params, paySecrit); params.put("sign", sign); String jsonParam = JSONUtil.toJsonStr(params); String initPayUrl = jhConfig.getServerUrl() + "/uaps-web-gateway/cnpPay/initPay"; String result = jhHttpUtils.postJson(initPayUrl, jsonParam); StaticLog.info("调用聚合支付返回:{}", result); JSONObject jsonResult = JSONUtil.parseObj(result); if (StrUtil.equals("0000", jsonResult.getStr("resultCode"))) { JSONObject payMessage = JSONUtil.parseObj(jsonResult.getStr("payMessage")); String p = payMessage.getStr("package"); Map r = wxService.getPayP(payMessage.getStr("timeStamp"), payMessage.getStr("nonceStr"), openid, p); StaticLog.info("re:{}", JSONUtil.toJsonStr(r)); JSONObject object = JSONUtil.parseObj(payMessage); object.set("outTradeNo", out_trade_no); TbOrder tbOrder = new TbOrder(); tbOrder.setAttach(JSONUtil.toJsonStr(atchMap)) .setOpenid(openid) .setOrderTime(new Date()) .setOutTradeNo(out_trade_no).setPrice(money); tbOrderService.save(tbOrder); return object; } throw new Exception("支付信息有误"); } public Map buildCheckParams(String outTradeNo) { Map params = new HashMap<>(); params.put("businessMerchantNo", jhConfig.getBusinessMerchantNo()); params.put("outTradeNo", outTradeNo); String paySecrit = jhConfig.getPaySecret(); String sign = MerchantApiUtil.getSign(params, paySecrit); params.put("sign", sign); return params; } public JSONObject checkPayResult(String outTradeNo) { String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder"; Map params = buildCheckParams(outTradeNo); String result = jhHttpUtils.postForm(url, params); return JSONUtil.parseObj(result); } @Async public void notifyResult(JhNotifyBO bo) { if (!"SUCCESS".equals(bo.getTradeStatus().toUpperCase()) && !"FINISH".equals(bo.getTradeStatus().toUpperCase())) { return; } NotifyBO notifyBO = new NotifyBO(); notifyBO.setOutTradeNo(bo.getOutTradeNo()) .setAttach(bo.getAttach()) .setTransactionId(bo.getBankTrxNo()) .setTotalFee(NumberUtil.mul(bo.getOrderPrice(), 100 + "").toString()); wxService.WxNotify(notifyBO); } }