package com.doumee.core.wx;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.doumee.biz.system.SystemDictDataBiz;
|
import com.doumee.core.constants.Constants;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
import com.doumee.core.utils.DateUtil;
|
import com.doumee.core.utils.ID;
|
import com.doumee.dao.business.RefundMapper;
|
import com.doumee.dao.business.TransactionsMapper;
|
import com.doumee.dao.business.model.Locks;
|
import com.doumee.dao.business.model.Refund;
|
import com.doumee.dao.business.model.Transactions;
|
import com.doumee.dao.business.web.request.RefundDTO;
|
import com.doumee.dao.system.model.SystemDictData;
|
import com.wechat.pay.java.service.refund.model.AmountReq;
|
import com.wechat.pay.java.service.refund.model.CreateRequest;
|
import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest;
|
import lombok.extern.slf4j.Slf4j;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.Response;
|
import org.apache.commons.io.FileUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.io.ByteArrayInputStream;
|
import java.io.File;
|
import java.io.InputStream;
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.Map;
|
import java.util.Objects;
|
|
/**
|
* 微信小程序-公共方法
|
*/
|
@Service
|
@Slf4j
|
public class WxMiniUtilService {
|
|
@Autowired
|
private RefundMapper refundMapper;
|
|
@Autowired
|
private TransactionsMapper transactionsMapper;
|
|
@Autowired
|
private SystemDictDataBiz systemDictDataBiz;
|
@Autowired
|
private WxPayProperties wxPayProperties;
|
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
public boolean wxRefund(RefundDTO refundDTO) {
|
// 发送退款请求
|
Refund refund = new Refund();
|
refund.setId(Constants.getUUID());
|
refund.setCreateDate(new Date());
|
refund.setMemberId(refundDTO.getMemberId());
|
refund.setMoney(refundDTO.getRefundAmount());
|
// refund.setOnlineOrderid(refNum);
|
refund.setPayWay(Constants.ZERO);
|
refund.setStatus(Constants.ZERO);
|
refund.setDoneDate(new Date());
|
refund.setCreator(refundDTO.getCreator());
|
refund.setType(refundDTO.getType());
|
refund.setObjId(refundDTO.getOrderId());
|
refund.setReason(refundDTO.getReason());
|
refund.setCanBalance(refundDTO.getCanBalance());
|
refundMapper.insert(refund);
|
|
CreateRequest request = new CreateRequest();
|
request.setOutTradeNo(refundDTO.getOrderId());
|
request.setOutRefundNo(refund.getId());
|
request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId());
|
request.setNotifyUrl(WxMiniConfig.wxProperties.getRefundNotifyUrl());
|
AmountReq amountReq = new AmountReq();
|
amountReq.setTotal(refundDTO.getTotalAmount().longValue());
|
amountReq.setRefund(refundDTO.getRefundAmount().longValue());
|
amountReq.setCurrency("CNY");
|
request.setAmount(amountReq);
|
try {
|
log.error("=============="+JSONObject.toJSONString(request));
|
com.wechat.pay.java.service.refund.model.Refund response = WxMiniConfig.refundService.create(request);
|
log.error("=============="+JSONObject.toJSONString(response));
|
if ("SUCCESS".equals(response.getStatus().name())
|
|| "PROCESSING".equals(response.getStatus().name()) ) {
|
return true;
|
}else{
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,退款申请失败哦!");
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,退款申请失败!");
|
}
|
|
}
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
public com.wechat.pay.java.service.refund.model.Refund isSuucessRefund(String outTradeNo) {
|
// 发送退款请求
|
|
QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest();
|
request.setOutRefundNo(outTradeNo);
|
request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId());
|
try {
|
log.error("=============="+JSONObject.toJSONString(request));
|
com.wechat.pay.java.service.refund.model.Refund response = WxMiniConfig.refundService.queryByOutRefundNo(request);
|
log.error("=============="+JSONObject.toJSONString(response));
|
if ("SUCCESS".equals(response.getStatus().name())
|
|| "PROCESSING".equals(response.getStatus().name()) ) {
|
return response;
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
|
}
|
return null;
|
}
|
public Refund wxRefundOld(RefundDTO refundDTO) {
|
// 发送退款请求
|
String refNum = ID.nextGUID();
|
CreateRequest request = new CreateRequest();
|
request.setOutTradeNo(refundDTO.getOrderId());
|
request.setOutRefundNo(refNum);
|
request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId());
|
request.setNotifyUrl(WxMiniConfig.wxProperties.getRefundNotifyUrl());
|
//
|
AmountReq amountReq = new AmountReq();
|
amountReq.setTotal(refundDTO.getTotalAmount().longValue());
|
amountReq.setRefund(refundDTO.getRefundAmount().longValue());
|
amountReq.setCurrency("CNY");
|
request.setAmount(amountReq);
|
System.out.println("实际总金额" + refundDTO.getTotalAmount());
|
System.out.println("实际退款金额" + refundDTO.getRefundAmount());
|
// request.setTotalFee(1);
|
// request.setRefundFee(1);
|
try {
|
com.wechat.pay.java.service.refund.model.Refund response = WxMiniConfig.refundService.create(request);
|
if ("SUCCESS".equals(response.getStatus().name()) ) {
|
//存储退款记录 与 流水记录
|
Refund refund = new Refund();
|
refund.setId(Constants.getUUID());
|
refund.setCreateDate(new Date());
|
refund.setMemberId(refundDTO.getMemberId());
|
refund.setMoney(refundDTO.getRefundAmount());
|
refund.setOnlineOrderid(refNum);
|
refund.setPayWay(Constants.ZERO);
|
refund.setStatus(Constants.TWO);
|
refund.setDoneDate(new Date());
|
refund.setCreator(refundDTO.getCreator());
|
refund.setType(refundDTO.getType());
|
refund.setObjId(refundDTO.getOrderId());
|
refund.setReason(refundDTO.getReason());
|
refund.setCanBalance(refundDTO.getCanBalance());
|
refundMapper.insert(refund);
|
//存储交易流水表
|
Transactions transactions = new Transactions();
|
transactions.setId(Constants.getUUID());
|
transactions.setMemberId(refundDTO.getMemberId());
|
transactions.setCreateDate(new Date());
|
transactions.setIsdeleted(Constants.ZERO);
|
transactions.setOrderId(refundDTO.getOrderId());
|
transactions.setMoney(refundDTO.getRefundAmount());
|
transactions.setPreOrderid(refundDTO.getOrderId());
|
transactions.setOnlineOrderid(refNum);
|
transactions.setDoneDate(new Date());
|
if(refund.getType().equals(Constants.REFUND_TYPE.PLAT_AUTO.getKey())||refund.getType().equals(Constants.REFUND_TYPE.PLAT_FORCE.getKey())){
|
//平台自动退款 或 强制退款
|
transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey());
|
transactions.setTitle(Constants.REFUND_TYPE.PLAT_AUTO.getInfo());
|
transactions.setContent(Constants.REFUND_TYPE.PLAT_AUTO.getInfo());
|
}else if(refund.getType().equals(Constants.REFUND_TYPE.NORMAL.getKey())){
|
//用户主动退款
|
transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey());
|
transactions.setTitle(Constants.REFUND_TYPE.NORMAL.getInfo());
|
transactions.setContent(Constants.REFUND_TYPE.NORMAL.getInfo());
|
}else if(refund.getType().equals(Constants.REFUND_TYPE.BACK.getKey())){
|
//结算后退款
|
transactions.setType(Constants.TRANSACTIONS_TYPE.REFUND.getKey());
|
transactions.setTitle(Constants.REFUND_TYPE.BACK.getInfo());
|
transactions.setContent(Constants.REFUND_TYPE.BACK.getInfo());
|
}
|
transactions.setBalance(BigDecimal.ZERO);
|
transactions.setObjId(refund.getId());
|
transactions.setObjType(Constants.ONE);
|
transactionsMapper.insert(transactions);
|
return refund;
|
} else{
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,退款失败!");
|
}
|
}catch (BusinessException e){
|
throw e;
|
}catch (Exception e){
|
e.printStackTrace();
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,退款失败!");
|
}
|
|
|
}
|
|
|
/**
|
* 生成小程序码
|
* https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
|
* @return
|
*/
|
public void generateWXMiniCode(Locks locks,SystemDictData systemDictData,String prePath,String path){
|
|
if(Objects.isNull(systemDictData)){
|
return;
|
}
|
//生成图片上传OSS
|
Map<String,Object> body = new HashMap<>();
|
// 场景码,与前端约定,最终是需要前端解析
|
body.put("scene", locks.getSiteId() + "/" +locks.getCode() );
|
// 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
|
body.put("env_version", "release");
|
body.put("env_version", "trial");
|
// 透明,根据你的场景自行设置body参数
|
body.put("is_hyaline", false);
|
body.put("check_path", false);
|
body.put("page","pages/index/index");
|
OkHttpClient client = new OkHttpClient().newBuilder().build();
|
okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
|
okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(mediaType, JSONObject.toJSONString(body));
|
Request request = new Request.Builder().url("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+systemDictData.getCode()).method("POST", requestBody).build();
|
try {
|
Response response = client.newCall(request).execute();
|
if (response.isSuccessful()) {
|
InputStream inputStream = new ByteArrayInputStream(response.body().bytes());
|
String nowDate = DateUtil.getNowShortDate();
|
File file = new File(prePath+path,locks.getSiteId()+"-"+locks.getCode()+"-"+nowDate+".png");
|
FileUtils.copyInputStreamToFile(inputStream,file);
|
locks.setInfo(locks.getSiteId()+"-"+locks.getCode()+"-"+nowDate+".png");
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
}
|