| | |
| | | |
| | | import cn.hutool.core.net.NetUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import cn.stylefeng.guns.modular.business.dto.request.OrderPayRequest; |
| | | import cn.stylefeng.guns.modular.business.entity.CounsellingOrder; |
| | | import cn.stylefeng.guns.modular.business.entity.CourseOrder; |
| | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.*; |
| | | |
| | | @Slf4j |
| | |
| | | @ResponseBody |
| | | public ResponseData appPay(@RequestBody @Validated WxAppPayRequest req) { |
| | | // 支付金额 |
| | | String totalAmount = ""; |
| | | BigDecimal totalAmount = BigDecimal.valueOf(0); |
| | | |
| | | // 订单编号判断订单类型 |
| | | if (req.getOrderNo().contains(OrderTypeEnum.MENTAL_TEST.getCode())) { |
| | | // 心理测试订单 |
| | | OrderMentalTest order = orderMentalTestService.getOrderByNo(req.getOrderNo()); |
| | | totalAmount = order.getPayAmount().toString(); |
| | | totalAmount = order.getPayAmount(); |
| | | } else if (req.getOrderNo().contains(OrderTypeEnum.CONSULT_ONE.getCode())) { |
| | | // 心理咨询1V1订单 |
| | | OrderConsultOne order = orderConsultOneService.getOrderByNo(req.getOrderNo()); |
| | | totalAmount = order.getPayAmount().toString(); |
| | | totalAmount = order.getPayAmount(); |
| | | }else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())){ |
| | | CourseOrder courseOrder = this.courseOrderService.getCourseOrderByNo(req.getOrderNo()); |
| | | totalAmount = courseOrder.getPayAmount().toString(); |
| | | totalAmount = courseOrder.getPayAmount(); |
| | | } else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { |
| | | CounsellingOrder counsellingOrder = this.counsellingOrderService.getCounsellingOrderByNo(req.getOrderNo()); |
| | | totalAmount = counsellingOrder.getPayAmount().toString(); |
| | | totalAmount = counsellingOrder.getPayAmount(); |
| | | } |
| | | |
| | | |
| | | // 判断转换后的BigDecimal是否为0 |
| | | if (totalAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | | if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) { |
| | | // 心理测试订单 |
| | | orderMentalTestService.paySuccess(req.getOrderNo(), req.getOrderNo(), String.valueOf(totalAmount), PayTypeEnum.ALIPAY.getCode()); |
| | | } else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) { |
| | | // 心理咨询1V1订单 |
| | | mentalTestOrderBizService.paySuccessOrderConsultOne(req.getOrderNo(), req.getOrderNo(), String.valueOf(totalAmount), PayTypeEnum.ALIPAY.getCode()); |
| | | } else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) { |
| | | //课程订单 |
| | | OrderPayRequest orderPayRequest = new OrderPayRequest(); |
| | | orderPayRequest.setOrderNo(req.getOrderNo()); |
| | | orderPayRequest.setTransactionNo(req.getOrderNo()); |
| | | orderPayRequest.setPayType("2"); |
| | | orderPayRequest.setOrderType(1); |
| | | courseOrderService.payCourseOrder(orderPayRequest); |
| | | } else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) { |
| | | //咨询订单 |
| | | OrderPayRequest orderPayRequest = new OrderPayRequest(); |
| | | orderPayRequest.setOrderNo(req.getOrderNo()); |
| | | orderPayRequest.setTransactionNo(req.getOrderNo()); |
| | | orderPayRequest.setPayType("2"); |
| | | orderPayRequest.setOrderType(2); |
| | | counsellingOrderService.payCounsellingOrder(orderPayRequest); |
| | | } |
| | | return new SuccessResponseData("支付成功"); |
| | | } |
| | | |
| | | // 设置支付配置 |
| | |
| | | // 获取微信支付配置 |
| | | WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig(); |
| | | |
| | | // 支付金额X100求整 |
| | | String totalFee = totalAmount.multiply(BigDecimal.valueOf(100)) |
| | | .setScale(0, RoundingMode.HALF_UP) |
| | | .toPlainString(); |
| | | // 组装支付参数 |
| | | Map<String, String> params = UnifiedOrderModel |
| | | .builder() |
| | |
| | | .nonce_str(WxPayKit.generateStr()) |
| | | .body(req.getSubject()) |
| | | .attach(req.getSubject()) |
| | | //.out_trade_no(WxPayKit.generateStr()) |
| | | .out_trade_no(req.getOrderNo()) |
| | | .total_fee(totalAmount) |
| | | .out_trade_no(WxPayKit.generateStr()) |
| | | // .out_trade_no(req.getOrderNo()) |
| | | .total_fee(totalFee) |
| | | .spbill_create_ip(ip) |
| | | .notify_url(notifyUrl) |
| | | .trade_type(TradeType.APP.getTradeType()) |
| | | .trade_type(TradeType.APP.getTradeType()).attach(req.getOrderNo()) |
| | | .build() |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | log.debug("微信APP支付请求params:{}", JSONUtil.toJsonStr(params)); |
| | | String xmlResult = WxPayApi.pushOrder(false, params); |
| | | log.info("微信APP支付结果xml:{}", xmlResult); |
| | | log.debug("微信APP支付结果xml:{}", xmlResult); |
| | | |
| | | Map<String, String> result = WxPayKit.xmlToMap(xmlResult); |
| | | String returnCode = result.get("return_code"); |
| | | String resultCode = result.get("result_code"); |
| | | String returnMsg = result.get("return_msg"); |
| | | if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) { |
| | | log.error("微信APP支付异常!{}", returnMsg); |
| | | log.error("微信APP支付异常!{}", result); |
| | | return new ErrorResponseData(returnMsg); |
| | | } |
| | | |
| | | // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回 |
| | | String prepayId = result.get("prepay_id"); |
| | | |
| | | Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | |
| | | String jsonStr = JSON.toJSONString(packageParams); |
| | | log.info("微信APP支付返回参数:{}", jsonStr); |
| | | return new SuccessResponseData(jsonStr); |
| | | log.info("微信APP支付返回参数:{}", JSONUtil.toJsonStr(packageParams)); |
| | | return new SuccessResponseData(packageParams); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态 |
| | | // 注意此处签名方式需与统一下单的签名类型一致 |
| | | if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) { |
| | | if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.MD5)) { |
| | | if (WxPayKit.codeIsOk(returnCode)) { |
| | | // 参数文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8 |
| | | String totalFee = params.get("total_fee"); |
| | | String totalFee = new BigDecimal(params.get("total_fee")).divide(BigDecimal.valueOf(100)).toString(); |
| | | String transactionId = params.get("transaction_id"); |
| | | // 获取订单号 |
| | | String orderNo = params.get("out_trade_no"); |
| | | // String orderNo = params.get("out_trade_no"); |
| | | String orderNo = params.get("attach"); |
| | | // 订单编号判断订单类型 |
| | | if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) { |
| | | // 心理测试订单 |
| | |
| | | .trade_type(TradeType.MWEB.getTradeType()) |
| | | .scene_info(JSON.toJSONString(sceneInfo)) |
| | | .build() |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | |
| | | String xmlResult = WxPayApi.pushOrder(false, params); |
| | | log.info(xmlResult); |
| | |
| | | .trade_type(TradeType.JSAPI.getTradeType()) |
| | | .openid(openId) |
| | | .build() |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | |
| | | String xmlResult = WxPayApi.pushOrder(false, params); |
| | | log.info(xmlResult); |
| | |
| | | String prepayId = resultMap.get("prepay_id"); |
| | | |
| | | Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId, wxPayApiConfig.getAppId(), |
| | | wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | |
| | | String jsonStr = JSON.toJSONString(packageParams); |
| | | return new SuccessResponseData(jsonStr); |
| | |
| | | .trade_type(TradeType.NATIVE.getTradeType()) |
| | | .openid(openId) |
| | | .build() |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | String xmlResult = WxPayApi.pushOrder(false, params); |
| | | log.info("统一下单:" + xmlResult); |
| | | /** |
| | |
| | | //result_code为FAIL时,添加该键值对,value值是微信告诉客户的信息 |
| | | prepayParams.put("err_code_des", "订单失效"); |
| | | } |
| | | prepaySign = WxPayKit.createSign(prepayParams, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | prepaySign = WxPayKit.createSign(prepayParams, wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | prepayParams.put("sign", prepaySign); |
| | | String xml = WxPayKit.toXml(prepayParams); |
| | | log.error(xml); |
| | |
| | | .notify_url(notifyUrl) |
| | | .trade_type(TradeType.NATIVE.getTradeType()) |
| | | .build() |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | |
| | | String xmlResult = WxPayApi.pushOrder(false, params); |
| | | log.info("统一下单:" + xmlResult); |
| | |
| | | .spbill_create_ip(ip) |
| | | .auth_code(authCode) |
| | | .build() |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | |
| | | String xmlResult = WxPayApi.microPay(false, params); |
| | | //同步返回结果 |
| | |
| | | .trade_type(TradeType.JSAPI.getTradeType()) |
| | | .openid(openId) |
| | | .build() |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | |
| | | String xmlResult = WxPayApi.pushOrder(false, params); |
| | | |
| | |
| | | // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回 |
| | | String prepayId = result.get("prepay_id"); |
| | | Map<String, String> packageParams = WxPayKit.miniAppPrepayIdCreateSign(wxPayApiConfig.getAppId(), prepayId, |
| | | wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256); |
| | | wxPayApiConfig.getPartnerKey(), SignType.MD5); |
| | | String jsonStr = JSON.toJSONString(packageParams); |
| | | log.info("小程序支付的参数:" + jsonStr); |
| | | return new SuccessResponseData(jsonStr); |
| | |
| | | params.put("bank_code", "1001"); |
| | | params.put("amount", "1"); |
| | | params.put("desc", "IJPay 让支付触手可及-付款到银行卡"); |
| | | params.put("sign", WxPayKit.createSign(params, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256)); |
| | | params.put("sign", WxPayKit.createSign(params, wxPayApiConfig.getPartnerKey(), SignType.MD5)); |
| | | return WxPayApi.payBank(params, wxPayApiConfig.getCertPath(), wxPayApiConfig.getMchId()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | .nonce_str(WxPayKit.generateStr()) |
| | | .receiver(JSON.toJSONString(receiver)) |
| | | .build() |
| | | .createSign(wxPayBean.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayBean.getPartnerKey(), SignType.MD5); |
| | | log.info("请求参数:{}", WxPayKit.toXml(params)); |
| | | String result = WxPayApi.profitSharingAddReceiver(params); |
| | | log.info("请求结果:{}", result); |
| | |
| | | .out_order_no(WxPayKit.generateStr()) |
| | | .receivers(JSON.toJSONString(list)) |
| | | .build() |
| | | .createSign(wxPayBean.getPartnerKey(), SignType.HMACSHA256); |
| | | .createSign(wxPayBean.getPartnerKey(), SignType.MD5); |
| | | |
| | | log.info("请求参数:{}", WxPayKit.toXml(params)); |
| | | String result = WxPayApi.profitSharing(params, wxPayBean.getCertPath(), wxPayBean.getMchId()); |