|
|
@@ -45,6 +45,8 @@ import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
|
|
|
import com.fs.course.service.IFsCourseRedPacketLogService;
|
|
|
import com.fs.course.service.IFsUserCourseOrderService;
|
|
|
import com.fs.course.service.IFsUserVipOrderService;
|
|
|
+import com.fs.his.config.AppRedPacketConfig;
|
|
|
+import com.fs.his.config.IntegralConfig;
|
|
|
import com.fs.his.domain.*;
|
|
|
import com.fs.his.enums.PaymentMethodEnum;
|
|
|
import com.fs.his.mapper.*;
|
|
|
@@ -1910,5 +1912,166 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
|
|
|
return R.error("支付失败!");
|
|
|
|
|
|
}
|
|
|
+ @Override
|
|
|
+ public String integralV3TransferNotify(String notifyData, HttpServletRequest request) {
|
|
|
+ logger.info("zyp \n【收到转账回调V3】:{}",notifyData);
|
|
|
+ try {
|
|
|
+ String json = configService.selectConfigByKey("his.integral");
|
|
|
+ IntegralConfig config = JSONUtil.toBean(json, IntegralConfig.class);
|
|
|
+ //创建微信订单
|
|
|
+ WxPayConfig payConfig = new WxPayConfig();
|
|
|
+ BeanUtils.copyProperties(config,payConfig);
|
|
|
+ WxPayService wxPayService = new WxPayServiceImpl();
|
|
|
+ wxPayService.setConfig(payConfig);
|
|
|
+ SignatureHeader signatureHeader = new SignatureHeader();
|
|
|
+ signatureHeader.setTimeStamp(request.getHeader("Wechatpay-Timestamp"));
|
|
|
+ signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce"));
|
|
|
+ signatureHeader.setSerial(request.getHeader("Wechatpay-Serial"));
|
|
|
+ signatureHeader.setSignature(request.getHeader("Wechatpay-Signature"));
|
|
|
+ TransferBillsNotifyResult result = wxPayService.parseTransferBillsNotifyV3Result(notifyData,signatureHeader);
|
|
|
+ if (result.getResult().getState().equals("SUCCESS")) {
|
|
|
+ return WxPayNotifyResponse.success("处理成功");
|
|
|
+ }else {
|
|
|
+ return WxPayNotifyResponse.fail("");
|
|
|
+ }
|
|
|
+ } catch (WxPayException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ logger.error("zyp \n【转账回调异常】:{}", e.getReturnMsg());
|
|
|
+ return WxPayNotifyResponse.fail(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public R sendAppRedPacket(WxSendRedPacketParam param) {
|
|
|
+ //组合返回参数
|
|
|
+ R result = new R();
|
|
|
+ String json = configService.selectConfigByKey("his.AppRedPacket");
|
|
|
+ AppRedPacketConfig config = JSONUtil.toBean(json, AppRedPacketConfig.class);
|
|
|
+ if (config.getIsNew() != null && config.getIsNew() == 1) {
|
|
|
+ result = sendRedPacketV3(param, config);
|
|
|
+ } else {
|
|
|
+ result= sendRedPacketLegacy(param, config);
|
|
|
+ }
|
|
|
+
|
|
|
+ result.put("mchId", config.getMchId());
|
|
|
+ result.put("isNew",config.getIsNew());
|
|
|
+ logger.info("App提现返回:{}",result);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 内部方法:处理新版本的发红包逻辑
|
|
|
+ private R sendRedPacketV3(WxSendRedPacketParam param,AppRedPacketConfig config) {
|
|
|
+
|
|
|
+ WxPayConfig payConfig = new WxPayConfig();
|
|
|
+ BeanUtils.copyProperties(config, payConfig);
|
|
|
+ WxPayService wxPayService = new WxPayServiceImpl();
|
|
|
+ wxPayService.setConfig(payConfig);
|
|
|
+ TransferService transferService = wxPayService.getTransferService();
|
|
|
+
|
|
|
+ TransferBillsRequest request = new TransferBillsRequest();
|
|
|
+ request.setAppid(param.getAppId());
|
|
|
+ request.setOpenid(param.getOpenId());
|
|
|
+
|
|
|
+ String code = OrderCodeUtils.getOrderSn();
|
|
|
+ if(StringUtils.isEmpty(code)){
|
|
|
+ return R.error("订单生成失败,请重试");
|
|
|
+ }
|
|
|
+// String code = String.valueOf(IdUtil.getSnowflake(0, 0).nextId());
|
|
|
+ request.setOutBillNo("fsAppRed" + code);
|
|
|
+ if (param.getAmount() == null) {
|
|
|
+ return R.error();
|
|
|
+ }
|
|
|
+ Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount().toString());
|
|
|
+ request.setTransferAmount(amount);
|
|
|
+ request.setTransferRemark("积分提现");
|
|
|
+ request.setUserRecvPerception("活动奖励");
|
|
|
+ request.setNotifyUrl(config.getNotifyUrl());
|
|
|
+ request.setTransferSceneId("1000");
|
|
|
+
|
|
|
+ // 设置场景信息
|
|
|
+ List<TransferBillsRequest.TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<>();
|
|
|
+ TransferBillsRequest.TransferSceneReportInfo info1 = new TransferBillsRequest.TransferSceneReportInfo();
|
|
|
+ info1.setInfoType("活动名称");
|
|
|
+ info1.setInfoContent("积分提现");
|
|
|
+ transferSceneReportInfos.add(info1);
|
|
|
+
|
|
|
+ TransferBillsRequest.TransferSceneReportInfo info2 = new TransferBillsRequest.TransferSceneReportInfo();
|
|
|
+ info2.setInfoType("奖励说明");
|
|
|
+ info2.setInfoContent("积分提现");
|
|
|
+ transferSceneReportInfos.add(info2);
|
|
|
+ request.setTransferSceneReportInfos(transferSceneReportInfos);
|
|
|
+
|
|
|
+
|
|
|
+ try {
|
|
|
+ TransferBillsResult transferBillsResult = transferService.transferBills(request);
|
|
|
+ logger.info("商家转账支付完成:[msg:{}]", transferBillsResult);
|
|
|
+ return R.ok("发送红包成功").put("data", transferBillsResult).put("mchId", config.getMchId())
|
|
|
+ .put("package",transferBillsResult.getPackageInfo())
|
|
|
+ .put("appId",param.getAppId())
|
|
|
+ .put("orderCode",request.getOutBillNo());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("商家转账支付失败:参数: {} :原因: {}", com.alibaba.fastjson.JSON.toJSONString(param), e.getMessage(),e);
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private R sendRedPacketLegacy(WxSendRedPacketParam param, AppRedPacketConfig config) {
|
|
|
+ //如果服务号的配置存在,小程序红包接口可以使用服务号来发红包,重新赋值
|
|
|
+ //仅老商户支持
|
|
|
+ if (param.getOpenId()!=null && StringUtils.isNotEmpty(param.getAppId())){
|
|
|
+// config.setAppId(param.getAppId());
|
|
|
+ param.setOpenId(param.getOpenId());
|
|
|
+ }
|
|
|
+ WxPayConfig payConfig = new WxPayConfig();
|
|
|
+ BeanUtils.copyProperties(config, payConfig);
|
|
|
+ WxPayService wxPayService = new WxPayServiceImpl();
|
|
|
+ wxPayService.setConfig(payConfig);
|
|
|
+ TransferService transferService = wxPayService.getTransferService();
|
|
|
+
|
|
|
+ TransferBatchesRequest request = new TransferBatchesRequest();
|
|
|
+// request.setAppid(config.getAppId());
|
|
|
+
|
|
|
+
|
|
|
+ // todo 如果未配置负载均衡请还原原本的单号方式
|
|
|
+// String code = IdUtil.getSnowflake(0, 0).nextIdStr();
|
|
|
+ String code = OrderCodeUtils.getOrderSn();
|
|
|
+ if(StringUtils.isEmpty(code)){
|
|
|
+ return R.error("红包单号生成失败,请重试");
|
|
|
+ }
|
|
|
+ request.setOutBatchNo("fsIntegral" + code);
|
|
|
+ request.setBatchRemark("积分提现");
|
|
|
+ request.setBatchName("积分提现");
|
|
|
+ Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount().toString());
|
|
|
+ request.setTotalAmount(amount);
|
|
|
+ request.setTotalNum(1);
|
|
|
+ request.setNotifyUrl(config.getNotifyUrl());
|
|
|
+
|
|
|
+ ArrayList<TransferBatchesRequest.TransferDetail> transferDetailList = new ArrayList<>();
|
|
|
+ TransferBatchesRequest.TransferDetail transferDetail = new TransferBatchesRequest.TransferDetail();
|
|
|
+ transferDetail.setOpenid(param.getOpenId());
|
|
|
+ String code1 = IdUtil.getSnowflake(0, 0).nextIdStr();
|
|
|
+ transferDetail.setOutDetailNo("fsCourse" + code1);
|
|
|
+ transferDetail.setTransferAmount(amount);
|
|
|
+ transferDetail.setTransferRemark("积分提现成功!");
|
|
|
+ transferDetailList.add(transferDetail);
|
|
|
+ request.setTransferDetailList(transferDetailList);
|
|
|
+
|
|
|
+ try {
|
|
|
+ TransferBatchesResult transferBatchesResult = transferService.transferBatches(request);
|
|
|
+ return R.ok("积分提现成功").put("orderCode", transferBatchesResult.getOutBatchNo()).put("batchId", transferBatchesResult.getBatchId()).put("mchId", config.getMchId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("商家转账支付失败:参数: {} :原因: {}", com.alibaba.fastjson.JSON.toJSONString(param), e.getMessage(),e);
|
|
|
+ if (e instanceof WxPayException) {
|
|
|
+// if (e instanceof WxPayException && "济南联志健康".equals(signProjectName)) {
|
|
|
+ WxPayException wxPayException = (WxPayException) e;
|
|
|
+ String customErrorMsg = wxPayException.getCustomErrorMsg();
|
|
|
+ if (null != customErrorMsg && customErrorMsg.startsWith("商户运营账户资金不足")) {
|
|
|
+ return R.error("[积分提现] 账户余额不足,请联系管理员!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|