diff --git a/pom.xml b/pom.xml index af0151a..b6de9c6 100644 --- a/pom.xml +++ b/pom.xml @@ -390,6 +390,22 @@ geodesy 1.1.3 + + + com.icbc + icbc-api-sdk-cop + 1.0.5 + + + com.icbc + icbc-api-sdk-cop-io + 1.0.5 + + + com.icbc + icbc-hsm + 1.0.5 + diff --git a/src/main/java/com/sqx/modules/file/AliFileUploadController.java b/src/main/java/com/sqx/modules/file/AliFileUploadController.java index e690632..8b2aa50 100644 --- a/src/main/java/com/sqx/modules/file/AliFileUploadController.java +++ b/src/main/java/com/sqx/modules/file/AliFileUploadController.java @@ -12,6 +12,7 @@ import org.jaudiotagger.audio.AudioFileIO; import org.jaudiotagger.audio.mp3.MP3AudioHeader; import org.jaudiotagger.audio.mp3.MP3File; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -30,6 +31,8 @@ import java.util.*; @Slf4j public class AliFileUploadController { + @Value("${file.upload.path}") + public String filePath = ""; private final CommonInfoService commonRepository; @@ -67,7 +70,7 @@ public class AliFileUploadController { String http = commonRepository.findOne(19).getValue(); String[] split = http.split("://"); // 上传文件路径 - String filePath ="/www/wwwroot/"+split[1]+"/file/uploadPath"; +// String filePath ="/www/wwwroot/"+split[1]+"/file/uploadPath"; // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = http +fileName; @@ -109,7 +112,7 @@ public class AliFileUploadController { String http = commonRepository.findOne(19).getValue(); String[] split = http.split("://"); // 上传文件路径 - String filePath ="/www/wwwroot/"+split[1]+"/file/uploadPath"; +// String filePath ="/www/wwwroot/"+split[1]+"/file/uploadPath"; // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = http +fileName; @@ -152,7 +155,7 @@ public class AliFileUploadController { String http = commonRepository.findOne(19).getValue(); String[] split = http.split("://"); // 上传文件路径 - String filePath ="/www/wwwroot/"+split[1]+"/file/uploadPath"; +// String filePath ="/www/wwwroot/"+split[1]+"/file/uploadPath"; // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); url = http +fileName; diff --git a/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java b/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java index f3f4b97..4c7324a 100644 --- a/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java +++ b/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java @@ -14,10 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import javax.servlet.http.HttpServletResponse; +import java.io.*; import java.util.List; /** @@ -145,76 +143,100 @@ public class ApiWeiXinPayController { @PostMapping("/notifyJsApi") @ApiOperation("微信回调") - public String notifyJsApi(HttpServletRequest request) { - String resXml = ""; + public void notifyJsApi(HttpServletRequest req, HttpServletResponse resp) { + PrintWriter out = null; try { - InputStream inputStream = request.getInputStream(); - //将InputStream转换成xmlString - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - StringBuilder sb = new StringBuilder(); - String line = null; - try { - while ((line = reader.readLine()) != null) { - sb.append(line + "\n"); - } - } catch (IOException e) { - log.info(e.getMessage()); - } finally { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - resXml = sb.toString(); - String result = wxService.payBack(resXml,3); - log.info("成功"); - log.info(result); - return result; + String result = wxService.icbcPayBack(req,3); + resp.setContentType("application/json; charset=utf-8"); + out = resp.getWriter(); + out.write(result); } catch (Exception e) { - log.info("微信手机支付失败:" + e.getMessage(),e); - String result = "" + "" + "" + " "; - log.info("失败"); - log.info(result); - return result; + log.error("【工商银行】微信支付回调处理失败,请检查原因!!!,{}", e.getMessage()); + } finally { + out.flush(); + out.close(); } +// String resXml = ""; +// try { +// InputStream inputStream = request.getInputStream(); +// //将InputStream转换成xmlString +// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); +// StringBuilder sb = new StringBuilder(); +// String line = null; +// try { +// while ((line = reader.readLine()) != null) { +// sb.append(line + "\n"); +// } +// } catch (IOException e) { +// log.info(e.getMessage()); +// } finally { +// try { +// inputStream.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// resXml = sb.toString(); +// String result = wxService.payBack(resXml,3); +// log.info("成功"); +// log.info(result); +// return result; +// } catch (Exception e) { +// log.info("微信手机支付失败:" + e.getMessage(),e); +// String result = "" + "" + "" + " "; +// log.info("失败"); +// log.info(result); +// return result; +// } } @PostMapping("/notifyJsApiShop") @ApiOperation("微信回调") - public String notifyJsApiShop(HttpServletRequest request) { - String resXml = ""; + public void notifyJsApiShop(HttpServletRequest req, HttpServletResponse resp) { + PrintWriter out = null; try { - InputStream inputStream = request.getInputStream(); - //将InputStream转换成xmlString - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - StringBuilder sb = new StringBuilder(); - String line = null; - try { - while ((line = reader.readLine()) != null) { - sb.append(line + "\n"); - } - } catch (IOException e) { - log.info(e.getMessage()); - } finally { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - resXml = sb.toString(); - String result = wxService.payBack(resXml,4); - log.info("成功"); - log.info(result); - return result; + String result = wxService.icbcPayBack(req,4); + resp.setContentType("application/json; charset=utf-8"); + out = resp.getWriter(); + out.write(result); } catch (Exception e) { - log.info("微信手机支付失败:" + e.getMessage(),e); - String result = "" + "" + "" + " "; - log.info("失败"); - log.info(result); - return result; + log.error("【工商银行】微信支付回调处理失败,请检查原因!!!,{}", e.getMessage()); + } finally { + out.flush(); + out.close(); } +// String resXml = ""; +// try { +// InputStream inputStream = request.getInputStream(); +// //将InputStream转换成xmlString +// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); +// StringBuilder sb = new StringBuilder(); +// String line = null; +// try { +// while ((line = reader.readLine()) != null) { +// sb.append(line + "\n"); +// } +// } catch (IOException e) { +// log.info(e.getMessage()); +// } finally { +// try { +// inputStream.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// resXml = sb.toString(); +// String result = wxService.payBack(resXml,4); +// log.info("成功"); +// log.info(result); +// return result; +// } catch (Exception e) { +// log.info("微信手机支付失败:" + e.getMessage(),e); +// String result = "" + "" + "" + " "; +// log.info("失败"); +// log.info(result); +// return result; +// } } @PostMapping("/notifyMp") diff --git a/src/main/java/com/sqx/modules/pay/service/WxService.java b/src/main/java/com/sqx/modules/pay/service/WxService.java index e955748..5d8f217 100644 --- a/src/main/java/com/sqx/modules/pay/service/WxService.java +++ b/src/main/java/com/sqx/modules/pay/service/WxService.java @@ -26,6 +26,8 @@ public interface WxService { String payBack(String resXml,Integer type); + String icbcPayBack(HttpServletRequest request, Integer type) throws Exception; + boolean refund(String ordersNo); Result wxTicketOrder(Long userId, Long ticketsId, Integer buyNum, Integer payType,HttpServletRequest request) throws Exception; @@ -33,4 +35,5 @@ public interface WxService { Result payCoupon(Long userId, Long couponId, Integer buyNum, Integer payType, HttpServletRequest request) throws Exception; Result buyBucket(Integer num, Long userId, Integer classify,HttpServletRequest request) throws Exception; + } \ No newline at end of file diff --git a/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java b/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java index 10c334c..1a55fa8 100644 --- a/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java +++ b/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java @@ -1,12 +1,21 @@ package com.sqx.modules.pay.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.crypto.digest.DigestUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConstants; import com.github.wxpay.sdk.WXPayUtil; +import com.icbc.api.DefaultIcbcClient; +import com.icbc.api.IcbcApiException; +import com.icbc.api.IcbcConstants; +import com.icbc.api.request.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1; +import com.icbc.api.response.CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1; +import com.icbc.api.utils.IcbcSignature; +import com.icbc.api.utils.WebUtils; import com.sqx.common.utils.DateUtils; import com.sqx.common.utils.Result; import com.sqx.modules.app.dao.UserMoneyDao; @@ -55,8 +64,11 @@ import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.*; +import static org.junit.Assert.assertEquals; + /** * @author fang * @date 2020/2/26 @@ -289,6 +301,14 @@ public class WxServiceImpl implements WxService { * @throws Exception */ private Result pay(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest request, Integer shop) throws Exception { + if(classify == 3){ + return this.icbcPay(moneys, classify, userId, outTradeNo, request, shop); + }else{ + return this.defaultPay(moneys, classify, userId, outTradeNo, request, shop); + } + } + + private Result defaultPay(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest request, Integer shop) throws Exception{ //h5服务域名配置 CommonInfo oneu = commonInfoService.findOne(19); String url; @@ -643,6 +663,343 @@ public class WxServiceImpl implements WxService { return xmlBack; } + private static final String ICBC_MCH_ID = "150537540002";//商户编号 + private static final String ICBC_MER_PRTCL_NO = "150537540002";//收单产品协议编号 + private static final String ICBC_APPID = "11000000000000051225"; + private static final String MY_PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCx24qZDrnPwAOwFJDmBcdEn+gkPj3tIfDi9nptHobqIPIwwZwtsQ20FxzYTG4QCcuFw4iDGb/VL4oxY4cjkWKjlAkVe6eyFdffiA2+toXK/Nu/U/UkcknHxeNE8CGyf/iV+yEwEiiWZ7zjNvXPGcWG+6IZkk4H9iOKwh2xbk3sd50em95meIxgKDOsaKoJ3VvCJs4ajNt8ly+V6B/at7qMF20XoQG7Qtmm1FCv05QVEH3JIYLg7N4TllYEAxKrTz4Wr4/qiiQ/dVRl6pxkDodJ/8UraFfYbsuOizeGZpAaj8lgkljwD9k32ov1X3GSNbG8EZTMJ7mSH5VWGI+w1Eh7AgMBAAECggEAZQwoOEFHjCK5daaZlDYgOnrnNwAtyrYH18rVT32ShR5muxCknMkE0hZ3iuQRfAc0nDC1NFbCyGoUB29WbfzBn9IRPyVb5y/Fz/fKZ1nntaXna1JV6nkMNfXV42rSmklegEeHWXpXmOwjQqwNB7bKpJ/+Pq0CrD9JfiI/IHlcyEVShNTR3SCxpye8Vkca1/HOBcI/aRLJ0t/xkKBXfkJOpUo7QLvEwhqZN0m/Z+AE84TNNscKNDiNmWDCfntFFzuFIbjYXUrkZwWNDU+LCYtOZ6/WXLrFpp2UoeVdJACBxAHqmaNSZltgavH3swDkMswSwj/gt7lK4k/U8rpp3uw3sQKBgQDW5ddgyyXoADRLyvNiqjRNBayaekdgUZwjs3mMQ9tkAuk+hWCGPNHAM+iIkSmjP5x3ajBrLKAPpN1/iJ0aloi9CAICXCoD4B/lfANc6njZxeIWKEZjV4hUYfXsGp57EHGlgDlAKk727IxfsHJeW7gq9KX5aao1qHyT8Yo8FhyzjwKBgQDT4BQ2o4rBCF0okJDJXgF9WexI3LD+N02Tfd9Yuz8zWaM5wgPw2EDPnwp7jrlA6IcCgn/xlAWCZAHzvD/CIg33BH0bqB9LDkJHHNwmCscczw55jwa2RXJfQFDSZ2lFggAB/01ByyU0ex1Px/Q+p2ykueYbWmQV8xst7ZL03Yu2VQKBgF1417fYZQKGpDibbEXsNpeR8kO3EDjLBplYxXPHSDQ2N/Hj3dpFtg5eBbTxPyUs1Af0/l5/qJdlZJrGd19LPurKAuW35OaOpBETYfsWWb6Pngl5NzSarEfX3Dn4UhrBSk1senp4bKRmu6AbhYOZbX/xrgfQeCKiyJ0pILGGBLHtAoGBAJiHXIXpPl6w8r/dMx6EOnZPYjciCZk5nvNrTnrGcj05brSJ4+RjCmVtjVJd8Se1PlykLg9wDHdOH8mj4BKWCY+m/5oFcmHKJhSjxijs4WLv/O+t85sMa8X+uzB9md+cMv09GhUfde1OJE/nFwJz7Va5LdrLO/pBRXPO8FivlYDxAoGBAKnjcXz3rDyXIQZSG7f81P7FudPeHbX4aywI9yWHzXjcHADVwniEBLxR0oE35Wu0gAcmnGB7aJxNqBgIBrc4VU8yJA896gKaneq20JCVKBcfB6EuHJwK31MF/YCA4JnHhuqaJ91JMnOWHkn/6DJlxbvIc+VDtW7czkvhgFS73JDN"; //应用私钥 + private static final String APIGW_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMpjaWjngB4E3ATh+G1DVAmQnIpiPEFAEDqRfNGAVvvH35yDetqewKi0l7OEceTMN1C6NPym3zStvSoQayjYV+eIcZERkx31KhtFu9clZKgRTyPjdKMIth/wBtPKjL/5+PYalLdomM4ONthrPgnkN4x4R0+D4+EBpXo8gNiAFsNwIDAQAB"; + private static final String DECIVE_INFO = "qHYmicPTZyKO452IV4A2stOozmLj2aYu"; + private Result icbcPay(Double moneys, Integer classify, Long userId, String outTradeNo, HttpServletRequest httpRequest, Integer shop) throws Exception{ + UserEntity userEntity = userService.queryByUserId(userId); + + String url = "https://gw.open.icbc.com.cn/" ; //https://gw-sandbox.open.icbc.com.cn https://gw.open.icbc.com.cn + String action = "api/cardbusiness/aggregatepay/b2c/online/consumepurchase/V1"; + +// UiIcbcClient client = new UiIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, IcbcConstants.CHARSET_UTF8); + ////签名类型为RSA时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA,其他参数使用缺省值 + DefaultIcbcClient client = new DefaultIcbcClient(ICBC_APPID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY); + + CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1 request = new CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1(); + request.setServiceUrl(url + action); + CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz bizContent = new CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1.CardbusinessAggregatepayB2cOnlineConsumepurchaseRequestV1Biz(); + request.setBizContent(bizContent); + + //回调 + String notifyUrl = commonInfoService.findOne(19).getValue() + (shop != null ? "/sqx_fast/app/wxPay/notifyJsApiShop" : "/sqx_fast/app/wxPay/notifyJsApi"); + //微信商户key +// config.setKey(commonInfoService.findOne(75).getValue()); + //微信商户号mchId + String mchId = commonInfoService.findOne(76).getValue(); + //openid + String openId = shop != null ? userEntity.getShopOpenId() : userEntity.getOpenId(); + //商户appid + String mchAppid = shop != null ? commonInfoService.findOne(239).getValue() : commonInfoService.findOne(45).getValue(); + //后台服务名称 + String name = commonInfoService.findOne(12).getValue(); + //订单金额 + String money = String.valueOf(AmountCalUtils.mul(moneys, 100).intValue()); + + bizContent.setMer_id(ICBC_MCH_ID); //商户编号 + bizContent.setOut_trade_no(outTradeNo); //商户订单号 + bizContent.setPay_mode("9"); + bizContent.setAccess_type("9"); + bizContent.setMer_prtcl_no(ICBC_MER_PRTCL_NO); //收单产品协议编号 + bizContent.setOrig_date_time(DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ss")); //交易日期时间,格式为yyyy-MM-dd’T’HH:mm:ss + bizContent.setDecive_info(DECIVE_INFO); //设备号 + bizContent.setBody(name); // 微信商品描述 + bizContent.setFee_type("001"); //交易币种,目前工行只支持使用人民币(001)支付 + bizContent.setSpbill_create_ip(HttpClientUtil.getIpAddress(httpRequest)); //用户端IP + bizContent.setTotal_fee(money); //订单金额,单位为分 + bizContent.setMer_url(notifyUrl); //异步通知商户URL,端口必须为443或80 + bizContent.setShop_appid(mchAppid); + bizContent.setIcbc_appid(ICBC_APPID); + bizContent.setOpen_id(openId); +// bizContent.setMer_acct("6212880200000038618"); +// bizContent.setExpire_time("120"); +// bizContent.setAttach("{ \"id\": \"SZTX001\", \"name\": \"腾大餐厅\", \"area_code\": \"440305\", \"address\": \"科技园中一路腾讯大厦\" }"); + bizContent.setNotify_type("HS"); //通知类型 + bizContent.setResult_type("0"); //结果发送类型 无论支付成功或者失败 +// bizContent.setPay_limit("no_credit"); //10 支付方式限定 +// bizContent.setOrder_apd_inf(""); //订单附加信息 +// bizContent.setDetail(""); +// bizContent.setReturn_url(""); //支付成功回显页面,支付成功后,跳转至该页面显示 当access_type=5且pay_mode=10才有效 +// bizContent.setQuit_url(""); //用户付款中途退出返回商户网站的地址(仅对浏览器内支付时有效)当access_type=5且pay_mode=10才有效 +// bizContent.setCust_name(""); //实名认证 +// bizContent.setCust_cert_type(""); +// bizContent.setCust_cert_no(""); +// bizContent.setGoods_tag(""); //订单优惠标记 +// bizContent.setAcq_addn_data("xxx"); //订单详细信息 + + CardbusinessAggregatepayB2cOnlineConsumepurchaseResponseV1 response; + try { + response = client.execute(request); + log.info("----调用icbc支付回调:{}", JSONObject.toJSONString(response)); + if (response.getReturnCode() == 0) { + JSONObject wxDataPackage = JSONObject.parseObject(response.getWx_data_package()); + Map param = new HashMap<>(); + String appid = wxDataPackage.getString("appid"); + param.put("appid", appid); + param.put("partnerid", wxDataPackage.getString("partnerid")); + param.put("prepayid", wxDataPackage.getString("prepayid")); + param.put("noncestr", wxDataPackage.getString("noncestr")); + param.put("timestamp", wxDataPackage.getString("timestamp")); + /*param.put("sign", WXPayUtil.generateSignature(param, config.getKey(), + WXPayConstants.SignType.MD5));*/ +// String stringSignTemp = "appId=" + config.getAppID() + "&nonceStr=" + generateNonceStr + "&package=prepay_id=" + response.get("prepay_id") + "&signType=MD5&timeStamp=" + currentTimeMillis + "" + "&key=" + config.getKey(); +// String sign = MD5Util.md5Encrypt32Upper(stringSignTemp).toUpperCase(); + param.put("sign", wxDataPackage.getString("sign")); + param.put("outtradeno", outTradeNo); + param.put("package", wxDataPackage.getString("package"));//给前端返回的值 + param.put("mweb_url", wxDataPackage.getString("mweb_url")); +// param.put("trade_type", response.getTrade_type()); + param.put("return_msg", response.getReturnMsg()); + param.put("result_code", response.getReturnCode() + ""); + param.put("signType", "MD5"); + return Result.success().put("data", param); + } else { + // 失败 +// System.out.println("response:" + JSON.toJSONString(response)); +// System.out.println("ReturnCode:"+response.getReturnCode()); +// System.out.println("ReturnMsg:"+response.getReturnMsg()); + return Result.error("获取订单失败" + response.getReturnMsg()); + + } + } catch (IcbcApiException e) { + e.printStackTrace(); + } + return Result.error("获取订单失败"); + } + + @Override + public String icbcPayBack(HttpServletRequest request, Integer type) throws Exception { + log.info("工商支付回调:"); + //接收参数 + JSONObject bizContent = JSON.parseObject(request.getParameter("biz_content")); + String msgId = bizContent.getString("msg_id"); + + //应答参数 + JSONObject responseBizContent = new JSONObject(); + responseBizContent.put("msg_id", msgId); + + //我们的订单编号 + String out_trade_no = bizContent.getString("out_trade_no"); + //第三方订单流水号 + String transactionId = bizContent.getString("third_trade_no"); + + String appid = type == 3 ? commonInfoService.findOne(45).getValue() : commonInfoService.findOne(239).getValue(); + String notifyUrl = (type == 3 ? "/sqx_fast/app/wxPay/notifyJsApiShop" : "/sqx_fast/app/wxPay/notifyJsApi"); + //返回码 + String returnCode = bizContent.getString("return_code"); + if (this.icbcCheckSign(request, notifyUrl)) { + if ("0".equals(returnCode)) { +// log.error("微信支付订单号" + notifyMap.get("transaction_id")); +// String transactionId = notifyMap.get("transaction_id"); + if (out_trade_no != null) { + // 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户的订单状态从退款改成支付成功 + // 注意特殊情况:微信服务端同样的通知可能会多次发送给商户系统,所以数据持久化之前需要检查是否已经处理过了,处理了直接返回成功标志 + //业务数据持久化 + PayDetails payDetails = payDetailsDao.selectByOrderId(out_trade_no); + if (payDetails.getState() == 0) { + payDetails.setState(1); + payDetails.setPayTime(DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN)); + payDetails.setTradeNo(transactionId); + payDetailsDao.updateById(payDetails); + if (payDetails.getType() == 1) { + //设置查询条件 + QueryWrapper queryWrapper = new QueryWrapper<>(); + //根据订单编号去查询订单 + queryWrapper.eq("orders_no", out_trade_no); + //去订单表中查询到该订单 + PayOrder orders = payOrderDao.selectOne(queryWrapper); + //改变订单状态 + orders.setState(1); + orders.setPayWay(type); + //设置订单更新时间 + orders.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + payOrderDao.updateById(orders); + //调用处理接口 + userMoneyDao.updateMayMoney(1, orders.getUserId(), orders.getMoney()); + UserMoneyDetails userMoneyDetails = new UserMoneyDetails(); + userMoneyDetails.setUserId(orders.getUserId()); + userMoneyDetails.setTitle("微信充值"); + userMoneyDetails.setContent("微信充值:" + orders.getPayMoney()); + userMoneyDetails.setType(1); + userMoneyDetails.setMoney(orders.getMoney()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userMoneyDetails.setCreateTime(sdf.format(new Date())); + userMoneyDetailsService.save(userMoneyDetails); + } else if (payDetails.getType() == 2) { + Orders orders = ordersDao.selectOne(new QueryWrapper().eq("orders_no", payDetails.getOrderId())); + GoodsSku goodsSku = goodsSkuService.getById(orders.getSkuId()); + goodsSku.setStock(goodsSku.getStock() - orders.getOrderNumber()); + goodsSkuService.updateById(goodsSku); + UserEntity userEntity = userService.selectUserById(orders.getUserId()); + UserMoneyDetails userMoneyDetails = new UserMoneyDetails(); + userMoneyDetails.setMoney(orders.getPayMoney()); + userMoneyDetails.setUserId(orders.getUserId()); + userMoneyDetails.setContent("微信支付订单"); + userMoneyDetails.setTitle("下单成功,订单号:" + orders.getOrdersNo()); + userMoneyDetails.setType(2); + userMoneyDetails.setOrdersNo(orders.getOrdersNo()); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userMoneyDetails.setCreateTime(simpleDateFormat.format(new Date())); + userMoneyDetailsService.save(userMoneyDetails); + MessageInfo messageInfo = new MessageInfo(); + messageInfo.setContent("订单下单成功:" + orders.getOrdersNo()); + messageInfo.setTitle("订单通知"); + messageInfo.setState(String.valueOf(4)); + messageInfo.setUserName(userEntity.getUserName()); + messageInfo.setUserId(String.valueOf(userEntity.getUserId())); + messageInfo.setCreateAt(simpleDateFormat.format(new Date())); + messageInfo.setIsSee("0"); + messageService.saveBody(messageInfo); + if (StringUtil.isNotBlank(userEntity.getClientid())) { + userService.pushToSingle(messageInfo.getTitle(), messageInfo.getContent(), userEntity.getClientid()); + } + orders.setState("4"); + orders.setIsRemind(0); + orders.setPayWay(2); + + OrderTaking orderTaking = orderTakingService.getById(orders.getOrderTakingId()); + + ordersDao.updateById(orders); + } else if (payDetails.getType() == 3) { + HelpOrder helpOrder = JSONObject.parseObject(payDetails.getRemark(), HelpOrder.class); + UserEntity userEntity = userService.selectUserById(helpOrder.getUserId()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String date = sdf.format(new Date()); + helpOrder.setStatus(2); + helpOrder.setCreateTime(date); + helpOrder.setMoney(helpOrder.getCommission()); + CommonInfo one = commonInfoService.findOne(120); + String value = one.getValue(); + Double mul = AmountCalUtils.mul(helpOrder.getCommission().doubleValue(), Double.parseDouble(value)); + BigDecimal sub = AmountCalUtils.sub(helpOrder.getMoney(), BigDecimal.valueOf(mul)); + helpOrder.setCommission(sub); + helpOrder.setPayWay(2); + helpOrderDao.insert(helpOrder); + + UserMoneyDetails userMoneyDetails = new UserMoneyDetails(); + userMoneyDetails.setUserId(helpOrder.getUserId()); + userMoneyDetails.setTitle("万能任务"); + userMoneyDetails.setContent("万能任务微信支付扣款:" + helpOrder.getMoney()); + userMoneyDetails.setType(2); + userMoneyDetails.setMoney(helpOrder.getMoney()); + userMoneyDetails.setCreateTime(date); + userMoneyDetailsService.save(userMoneyDetails); + if (userEntity.getClientid() != null) { + userService.pushToSingle("派发订单", "您的订单已经派发成功!", userEntity.getClientid()); + } + MessageInfo messageInfo = new MessageInfo(); + messageInfo.setContent("您的订单已经派发成功!"); + messageInfo.setTitle("订单通知"); + messageInfo.setState(String.valueOf(4)); + messageInfo.setUserName(userEntity.getUserName()); + messageInfo.setUserId(String.valueOf(userEntity.getUserId())); + messageService.saveBody(messageInfo); + } else if (payDetails.getType() == 4) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + BigDecimal money = BigDecimal.valueOf(payDetails.getMoney()); + userMoneyDao.updateSafetyMoney(1, payDetails.getUserId(), money); + UserMoneyDetails userMoneyDetails = new UserMoneyDetails(); + userMoneyDetails.setClassify(4); + userMoneyDetails.setUserId(payDetails.getUserId()); + userMoneyDetails.setTitle("[保证金]缴纳保证金"); + userMoneyDetails.setContent("缴纳保证金,保证金增加:" + money); + userMoneyDetails.setType(1); + userMoneyDetails.setMoney(money); + userMoneyDetails.setCreateTime(sdf.format(new Date())); + userMoneyDetailsService.save(userMoneyDetails); + UserMoney userMoney = userMoneyService.selectUserMoneyByUserId(payDetails.getUserId()); + userMoneyService.updateSafetyMoneyWay(userMoney.getId(), 1, payDetails.getOrderId()); + UserEntity userEntity = userService.selectUserById(payDetails.getUserId()); + userEntity.setIsSafetyMoney(1); + userService.updateById(userEntity); + } else if (payDetails.getType() == 5) { + List ordersList = JSONObject.parseArray(payDetails.getRemark(), Orders.class); + for (Orders orders : ordersList) { + GoodsSku goodsSku = goodsSkuService.getById(orders.getSkuId()); + goodsSku.setStock(goodsSku.getStock() - orders.getOrderNumber()); + goodsSkuService.updateById(goodsSku); + UserEntity userEntity = userService.selectUserById(orders.getUserId()); + UserMoneyDetails userMoneyDetails = new UserMoneyDetails(); + userMoneyDetails.setMoney(orders.getPayMoney()); + userMoneyDetails.setUserId(orders.getUserId()); + userMoneyDetails.setContent("微信支付订单"); + userMoneyDetails.setTitle("下单成功,订单号:" + orders.getOrdersNo()); + userMoneyDetails.setType(2); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + userMoneyDetails.setCreateTime(simpleDateFormat.format(new Date())); + userMoneyDetailsService.save(userMoneyDetails); + MessageInfo messageInfo = new MessageInfo(); + messageInfo.setContent("订单下单成功:" + orders.getOrdersNo()); + messageInfo.setTitle("订单通知"); + messageInfo.setState(String.valueOf(4)); + messageInfo.setUserName(userEntity.getUserName()); + messageInfo.setUserId(String.valueOf(userEntity.getUserId())); + messageInfo.setCreateAt(simpleDateFormat.format(new Date())); + messageInfo.setIsSee("0"); + messageService.saveBody(messageInfo); + if (StringUtil.isNotBlank(userEntity.getClientid())) { + userService.pushToSingle(messageInfo.getTitle(), messageInfo.getContent(), userEntity.getClientid()); + } + orders.setState("4"); + orders.setIsRemind(0); + orders.setPayWay(2); + + OrderTaking orderTaking = orderTakingService.getById(orders.getOrderTakingId()); + ordersDao.updateById(orders); + } + } else if (payDetails.getType() == 6) { + ticketsService.businessCallback(2, payDetails.getUserId(), BigDecimal.valueOf(payDetails.getMoney()), payDetails.getRelationId(), payDetails.getBuyNum(), payDetails.getTradeNo()); + } else if (payDetails.getType() == 7) { + couponUserService.businessCallback(2, payDetails.getUserId(), payDetails.getRelationId(), payDetails.getBuyNum(), BigDecimal.valueOf(payDetails.getMoney())); + } else if (payDetails.getType() == 8) { + userService.bucketCallback(payDetails.getUserId(), payDetails.getBuyNum(), BigDecimal.valueOf(payDetails.getMoney()), payDetails.getClassify()); + } + } +// System.err.println("微信手机支付回调成功订单号:" + out_trade_no + ""); + } + } + responseBizContent.put("return_code", 0); + responseBizContent.put("return_msg", "success"); + }else { + responseBizContent.put("return_code", -1); + responseBizContent.put("return_msg", "icbc sign not pass."); + } + + String signStr = "\"response_biz_content\":" + responseBizContent.toJSONString() + "," + "\"sign_type\":\"RSA2\""; + String sign = IcbcSignature.sign(signStr, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY,"UTF-8",""); + + JSONObject resp = new JSONObject(); + resp.put("response_biz_content", responseBizContent); + resp.put("sign_type", "RSA2"); + resp.put("sign", sign); + + return resp.toJSONString(); + } + + private boolean icbcCheckSign(HttpServletRequest request, String path) { + Map params = new HashMap<>(); + String sign = request.getParameter("sign"); + params.put("from", request.getParameter("from")); + params.put("api", request.getParameter("api")); + params.put("app_id", request.getParameter("app_id")); + params.put("charset", request.getParameter("charset")); + params.put("format", request.getParameter("format")); + params.put("timestamp", request.getParameter("timestamp")); + params.put("biz_content", request.getParameter("biz_content")); + //目前上行网关签名暂时仅支持RSA + params.put("sign_type", request.getParameter("sign_type")); + + String signStr= WebUtils.buildOrderedSignStr(path, params); + try { + //注意:此次用的是RSA,和下单时不一样 + return IcbcSignature.verify(signStr, IcbcConstants.SIGN_TYPE_RSA, APIGW_PUBLIC_KEY, request.getParameter("charset"), sign); + } catch (IcbcApiException e) { + return false; + } + } public String getGeneralOrder() { Date date = new Date(); @@ -780,4 +1137,14 @@ public class WxServiceImpl implements WxService { return pay(money.doubleValue(), classify, payDetails.getUserId(), payDetails.getOrderId(), request, null); } + + public static void main(String[] args) { + String timestamp = DateUtil.format(DateUtil.date(), "yyyy-MM-dd HH:mm:ss"); + String rawToken = "100000002" + "2ry7EXwNHE3zOtUpEUqj1BdkFGuIna67TmKExNxG" + "1740728660"; + String hashedToken = DigestUtil.sha256Hex(rawToken); + String encodedToken = cn.hutool.core.codec.Base64.encode(hashedToken); + System.out.println(System.currentTimeMillis()/1000); + System.out.println(hashedToken); + System.out.println(encodedToken); + } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b84f5ca..c399c12 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -32,4 +32,6 @@ spring: wall: config: multi-statement-allow: true - +file: + upload: + path: /mnt/file/ diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index c0c7ded..f97f3b1 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -4,8 +4,8 @@ spring: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://${DB_URL:127.0.0.1}:3306/songshui?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT - username: ${DB_NAME} - password: ${DB_PASSWORD} + username: songshui + password: CwMi2d2eF3SLtfZ2 initial-size: 10 max-active: 100 min-idle: 10 @@ -32,4 +32,6 @@ spring: wall: config: multi-statement-allow: true - +file: + upload: + path: /mnt/file/ \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 2e8b14d..67ab515 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -32,4 +32,6 @@ spring: wall: config: multi-statement-allow: true - +file: + upload: + path: /mnt/file/