package com.szwl.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.szwl.model.bo.JoinpayConstant;
import com.szwl.model.entity.TOrder;
import com.szwl.mapper.TOrderMapper;
import com.szwl.model.utils.Constant;
import com.szwl.model.utils.HttpClientUtils;
import com.szwl.service.TOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.message.BasicNameValuePair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* 服务实现类
*
*
* @author wuhs
* @since 2022-04-23
*/
@Slf4j
@Service
public class TOrderServiceImpl extends ServiceImpl implements TOrderService {
@Autowired
private TOrderMapper tOrderMapper;
@Override
public Double getAreaPrice(Map params) {
return tOrderMapper.getAreaPrice(params);
}
@Override
@Transactional
public synchronized String initSn(Long equipmentId) {
StringBuilder number = new StringBuilder();
if (equipmentId != null) {
Random random = new Random();
/**
* 6位随机
*/
for (int i = 0; i < 6; i++) {
number.append(String.valueOf(random.nextInt(10)));
}
/**
* 设备id
*/
number.append(equipmentId.toString());
/**
* 日期
*/
number.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
}
return number.toString();
}
@Override
public Object initRefundSn(Long equipmentId, int refundNumber) {
StringBuilder number = new StringBuilder();
if (equipmentId != null) {
Random random = new Random();
/**
* 6位随机
*/
for (int i = 0; i < 6; i++) {
number.append(String.valueOf(random.nextInt(10)));
}
/**
* 设备id
*/
number.append(equipmentId.toString());
/**
* 日期
*/
number.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
/**
* 退款数量
*/
number.append(refundNumber);
}
return "r" + number.toString();
}
@Override
public String refund(String sn , Object refundSn , BigDecimal refundAmount , BigDecimal p8_MarketRefAmount , String refundReason , String notifyUrl , String altRefInfo ) {
String url = "https://www.joinpay.com/trade/refund.action";
List data = new ArrayList();
data.add(new BasicNameValuePair("p1_MerchantNo", JoinpayConstant.mch_no));
data.add(new BasicNameValuePair("p2_OrderNo", sn));
data.add(new BasicNameValuePair("p3_RefundOrderNo", refundSn.toString()));
data.add(new BasicNameValuePair("p4_RefundAmount", refundAmount.setScale(2, RoundingMode.HALF_DOWN).toString()));
data.add(new BasicNameValuePair("p5_RefundReason", refundReason));
data.add(new BasicNameValuePair("p6_NotifyUrl", notifyUrl));
data.add(new BasicNameValuePair("p7_AltRefInfo", altRefInfo==null?null:altRefInfo.toString()));
if(p8_MarketRefAmount!=null){
data.add(new BasicNameValuePair("p8_MarketRefAmount", p8_MarketRefAmount.toString()));
}
// TODO: 2019-04-01 空值不参与签名!!!!!!!!!!!!!!!!!!
String hmac = null;
try {
hmac = createHmacSign(data, JoinpayConstant.key);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
data.add(new BasicNameValuePair("hmac", hmac));
String result = HttpClientUtils.postKeyValue(url, data);
JSONObject resultJson = JSONObject.parseObject(result);
log.info("汇聚返回参数:{}", resultJson);
System.out.println(result);
return resultJson.getString("rc_CodeMsg");
}
/**
* 签名算法sign , hmac 签名
*
* @param data
* @return
*/
public static String createHmacSign( List data , String key) throws UnsupportedEncodingException {
StringBuffer sb = new StringBuffer();
Iterator es = data.iterator();
while (es.hasNext()) {
BasicNameValuePair entry = (BasicNameValuePair) es.next();
String k = (String) entry.getName();
String v = (String) entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(URLDecoder.decode(String.valueOf(v), "utf-8"));
}
}
sb.append(key);
String sign = DigestUtils.md5Hex(sb.toString());
return sign;
}
}