package com.szwl.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huifu.bspay.sdk.opps.core.utils.DateTools;
import com.huifu.bspay.sdk.opps.core.utils.OkHttpClientTools;
import com.szwl.common.HuifuBaseCommon;
import com.szwl.config.OppsMerchantConfig;
import com.szwl.constant.HuifuConstant;
import com.szwl.feign.bean.SzwlFeign;
import com.szwl.mapper.THuifuMchMapper;
import com.szwl.model.bo.R;
import com.szwl.model.entity.*;
import com.szwl.service.*;
import com.szwl.utils.HuifuUtils;
import com.szwl.utils.IDGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
*
* 服务实现类
*
*
* @author wuhs
* @since 2023-07-17
*/
@Slf4j
@Service
public class THuifuMchServiceImpl extends ServiceImpl implements THuifuMchService {
@Autowired
private THuifuTempOrderService huifuTempOrderService;
@Autowired
TOrderService orderService;
@Autowired
private TOrderDetailsService orderDetailsService;
@Autowired
SzwlFeign szwlFeign;
@Autowired
WechatPayInfoService wechatPayInfoService;
@Override
public String uniPay(String orderNo, BigDecimal amount, String productName,
String productDesc, String notifyUrl, String frpCode,
String openId, String appid, JSONObject acctSplitBunch,
String companyType) throws Exception {
String url = "https://api.huifu.com/v2/trade/payment/jspay";
HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
JSONObject request = new JSONObject();
request.put("req_seq_id", orderNo);
request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
} else {
request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
}
if (frpCode.equals("ALIPAY_NATIVE")) {
request.put("trade_type", "A_NATIVE");
}
if (frpCode.equals("WEIXIN_XCX")) {
request.put("trade_type", "T_MINIAPP");
JSONObject wxData = new JSONObject();
wxData.put("sub_appid", appid);
wxData.put("open_id", openId);
request.put("wx_data", wxData);
}
request.put("trans_amt", amount);
request.put("goods_desc", productName);
request.put("notify_url", HuifuConstant.Notify_Url);
// 分账明细
request.put("acct_split_bunch", acctSplitBunch.toJSONString());
// 签名:sign
String s = JSON.toJSONString(request);
String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
// 公共参数
JSONObject requestData = new JSONObject();
requestData.put("sys_id", HuifuConstant.SYS_ID);
requestData.put("product_id", HuifuConstant.PRODUCT_ID);
requestData.put("sign", sign);
requestData.put("data", request);
System.out.println("请求体:" + requestData);
String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
JSONObject result = JSONObject.parseObject(success);
JSONObject data = result.getJSONObject("data");
String qrCode = data.getString("qr_code");
String payInfo = data.getString("pay_info");
if (frpCode.equals("ALIPAY_NATIVE")) {
return qrCode;
}
if (frpCode.equals("WEIXIN_XCX")) {
return payInfo;
}
return null;
}
@Override
public String wetchatPay(THuifuTempOrder huifuTempOrder, String openid) throws Exception {
String url = "https://api.huifu.com/v2/trade/payment/jspay";
HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
JSONObject request = new JSONObject();
String sn = HuifuUtils.initReqSeqId();
request.put("req_seq_id", sn);
request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
String companyType = huifuTempOrder.getCompanyType();
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
} else {
request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
}
request.put("trade_type", "T_JSAPI");
request.put("trans_amt", huifuTempOrder.getPrice());
String clientId = huifuTempOrder.getClientId();
String productName = huifuTempOrder.getProductName();
TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
String client6 = clientId.substring(clientId.length() - 6);
String productName1 = "";
if (huifuTempOrder.getProductNumber() > 1) {
if (equipment.getMachineType() == null || equipment.getMachineType().equals("0")) {
productName1 = "棉花糖-" + equipment.getName() + "-" + client6;
} else {
productName1 = "爆米花-" + equipment.getName() + "-" + client6;
}
} else {
productName1 = productName + "-" + equipment.getName() + "-" + client6;
}
request.put("goods_desc", productName1);
request.put("notify_url", HuifuConstant.Notify_Url);
request.put("remark", huifuTempOrder.getId());
// 分账明细
request.put("acct_split_bunch", huifuTempOrder.getAcctSplitBunch());
// 微信支付配置
JSONObject wxData = new JSONObject();
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
wxData.put("sub_appid", HuifuConstant.SC_WX_SUB_APP_ID);
} else {
wxData.put("sub_appid", HuifuConstant.SZ_WX_SUB_APP_ID);
}
wxData.put("open_id", openid);
request.put("wx_data", wxData);
// 签名:sign
String s = JSON.toJSONString(request);
String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
// 公共参数
JSONObject requestData = new JSONObject();
requestData.put("sys_id", HuifuConstant.SYS_ID);
requestData.put("product_id", HuifuConstant.PRODUCT_ID);
requestData.put("sign", sign);
requestData.put("data", request);
System.out.println("请求体:" + requestData);
String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
// 拿到返回参数
JSONObject result = JSONObject.parseObject(success);
log.info("汇付返回参数:{}", result);
JSONObject data = result.getJSONObject("data");
String payInfo = data.getString("pay_info");
JSONObject payInfoJson = JSONObject.parseObject(payInfo);
// 获取timeStamp的值
String timeStamp = payInfoJson.getString("timeStamp");
// 获取nonceStr的值
String nonceStr = payInfoJson.getString("nonceStr");
// 获取package的值
String packageValue = payInfoJson.getString("package");
// 获取paySign的值
String paySign = payInfoJson.getString("paySign");
// 测试链接:http://szwltest.sunzee.com.cn/shenze
String resultUrl = "";
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
resultUrl = HuifuConstant.SC_JUMP_URL + "/#/popPayment?" +
"sn=" + sn +
"&timeStamp=" + timeStamp +
"&nonceStr=" + nonceStr +
"&package=" + packageValue +
"&paySign=" + paySign;
} else {
resultUrl = HuifuConstant.SZ_JUMP_URL + "/#/popPayment?" +
"sn=" + sn +
"&timeStamp=" + timeStamp +
"&nonceStr=" + nonceStr +
"&package=" + packageValue +
"&paySign=" + paySign;
}
log.info("微信支付链接:{}", resultUrl);
// 保存订单到数据库
TOrder tOrder = new TOrder();
String[] ignoreProperties = {"id", "createDate", "sn"};
BeanUtil.copyProperties(huifuTempOrder, tOrder, ignoreProperties);
tOrder.setId(IDGenerator.orderID());
tOrder.setSn(sn);
tOrder.setCreateDate(new Date());
tOrder.setModifyDate(new Date());
// 保存订单明细
TOrderDetails orderDetails = new TOrderDetails();
orderDetails.setAdminId(huifuTempOrder.getAdminId());
orderDetails.setCreateDate(new Date());
orderDetails.setOrderSn(sn);
orderDetails.setCompanyType(huifuTempOrder.getCompanyType());
orderDetails.setRefundStatus("0");
orderDetails.setEquipmentId(huifuTempOrder.getEquipmentId());
orderDetails.setMachineType(huifuTempOrder.getMachineType());
if (huifuTempOrder.getProductNumber() != null && huifuTempOrder.getProductNumber() > 1) {
Map map = new HashMap<>();
String[] products = huifuTempOrder.getNote().split(",");
for (String product : products) {
String[] parts = product.split(":");
// 商品名称-商品编号
String key = parts[0];
// 商品单价-商品数量
String value = parts[1];
map.put(key, value);
}
for (String key : map.keySet()) {
// key:"玫瑰精灵-A01",value:"0.50-1"
String value = map.get(key);
String[] GoodsInfo = key.split("-");
String[] GoodsValue = value.split("-");
orderDetails.setId(HuifuUtils.initDetailsId());
orderDetails.setProductName(GoodsInfo[0]);
orderDetails.setProductNo(GoodsInfo[1]);
orderDetails.setPrice(new BigDecimal(GoodsValue[0]).divide(new BigDecimal(GoodsValue[1])).setScale(2));
orderDetails.setProductNumber(Integer.valueOf(GoodsValue[1]));
orderDetails.setAmount(new BigDecimal(GoodsValue[0]).setScale(2));
orderDetailsService.save(orderDetails);
}
log.info("插入成功");
} else {
// 订单明细表
orderDetails.setId(HuifuUtils.initDetailsId());
orderDetails.setPrice(huifuTempOrder.getPrice());
orderDetails.setProductName(huifuTempOrder.getProductName());
orderDetails.setProductNo(huifuTempOrder.getProductNo());
orderDetails.setProductNumber(huifuTempOrder.getProductNumber());
orderDetails.setAmount(huifuTempOrder.getPrice());
orderDetailsService.save(orderDetails);
}
orderService.save(tOrder);
return resultUrl;
}
@Override
public String cardPay(String orderNo, BigDecimal amount, String productName,
String notifyUrl, String authCode, JSONObject acctSplitBunch,
String companyType) throws Exception {
String url = "https://api.huifu.com/v2/trade/payment/micropay";
HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
JSONObject request = new JSONObject();
request.put("req_seq_id", orderNo);
request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
} else {
request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
}
request.put("auth_code", authCode);
request.put("trans_amt", amount);
request.put("goods_desc", productName);
request.put("notify_url", HuifuConstant.Notify_Url);
// 分账明细
request.put("acct_split_bunch", acctSplitBunch.toJSONString());
// 安全信息
JSONObject riskCheckData = new JSONObject();
riskCheckData.put("ip_addr", "47.112.127.131");
request.put("risk_check_data", riskCheckData);
// 签名:sign
String s = JSON.toJSONString(request);
String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
// 公共参数
JSONObject requestData = new JSONObject();
requestData.put("sys_id", HuifuConstant.SYS_ID);
requestData.put("product_id", HuifuConstant.PRODUCT_ID);
requestData.put("sign", sign);
requestData.put("data", request);
System.out.println("请求体:" + requestData);
log.info("请求体:{}", requestData);
String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
JSONObject result = JSONObject.parseObject(success);
JSONObject data = result.getJSONObject("data");
String transStat = data.getString("trans_stat");
String respDesc = data.getString("resp_desc");
if (transStat.equals(HuifuConstant.TRANS_STAT_S) || transStat.equals(HuifuConstant.TRANS_STAT_P)) {
return HuifuConstant.RESP_CODE_0;
} else {
return respDesc;
}
}
@Override
public JSONObject payWechat(TOrder order, String openid) throws Exception {
String url = "https://api.huifu.com/v2/trade/payment/jspay";
HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
JSONObject request = new JSONObject();
String sn = order.getSn();
request.put("req_seq_id", sn);
request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
String companyType = order.getCompanyType();
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
} else {
request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
}
request.put("trade_type", "T_JSAPI");
request.put("trans_amt", order.getPrice());
String clientId = order.getClientId();
String productName = order.getProductName();
TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
String client6 = clientId.substring(clientId.length() - 6);
String goodsDesc = "";
if (order.getProductNumber() > 1) {
if (equipment.getMachineType() == null || equipment.getMachineType().equals("0")) {
goodsDesc = "棉花糖-" + equipment.getName() + "-" + client6;
} else if (equipment.getMachineType().equals("1")) {
goodsDesc = "爆米花-" + equipment.getName() + "-" + client6;
} else if (equipment.getMachineType().equals("2")) {
goodsDesc = "雪糕-" + equipment.getName() + "-" + client6;
}
} else {
goodsDesc = productName + "-" + equipment.getName() + "-" + client6;
}
request.put("goods_desc", goodsDesc);
request.put("notify_url", HuifuConstant.Notify_Url);
// 分账明细
request.put("acct_split_bunch", order.getAcctSplitBunch());
// 微信支付配置
JSONObject wxData = new JSONObject();
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
wxData.put("sub_appid", HuifuConstant.SC_WX_SUB_APP_ID);
} else {
wxData.put("sub_appid", HuifuConstant.SZ_WX_SUB_APP_ID);
}
wxData.put("open_id", openid);
request.put("wx_data", wxData);
// 签名:sign
String s = JSON.toJSONString(request);
String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
// 公共参数
JSONObject requestData = new JSONObject();
requestData.put("sys_id", HuifuConstant.SYS_ID);
requestData.put("product_id", HuifuConstant.PRODUCT_ID);
requestData.put("sign", sign);
requestData.put("data", request);
String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
// 拿到返回参数
JSONObject result = JSONObject.parseObject(success);
JSONObject data = result.getJSONObject("data");
String hfSeqId = data.getString("hf_seq_id");
String payInfo = data.getString("pay_info");
JSONObject payInfoJson = JSONObject.parseObject(payInfo);
// 获取timeStamp的值
String appId = payInfoJson.getString("appId");
// 获取timeStamp的值
String timeStamp = payInfoJson.getString("timeStamp");
// 获取nonceStr的值
String nonceStr = payInfoJson.getString("nonceStr");
// 获取package的值
String packageValue = payInfoJson.getString("package");
// 获取paySign的值
String paySign = payInfoJson.getString("paySign");
// 保存到数据库
WechatPayInfo wechatPayInfo = new WechatPayInfo();
wechatPayInfo.setSn(sn);
wechatPayInfo.setHfSeqId(hfSeqId);
wechatPayInfo.setAppId(appId);
wechatPayInfo.setTimeStamp(timeStamp);
wechatPayInfo.setNonceStr(nonceStr);
wechatPayInfo.setPackageValue(packageValue);
wechatPayInfo.setPaySign(paySign);
wechatPayInfoService.save(wechatPayInfo);
return data;
}
@Override
public JSONObject payQuery(String queryId, String sn,String companyType) throws Exception {
String url = "https://api.huifu.com/v2/trade/payment/scanpay/query";
HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
JSONObject request = new JSONObject();
if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
} else {
request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
}
request.put("org_req_date", DateTools.getCurrentDateYYYYMMDD());
if (StrUtil.isNotEmpty(queryId)) {
request.put("org_hf_seq_id", queryId);
}
if (StrUtil.isNotEmpty(sn)) {
request.put("org_req_seq_id", sn);
}
// 签名:sign
String s = JSON.toJSONString(request);
String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
// 公共参数
JSONObject requestData = new JSONObject();
requestData.put("sys_id", HuifuConstant.SYS_ID);
requestData.put("product_id", HuifuConstant.PRODUCT_ID);
requestData.put("sign", sign);
requestData.put("data", request);
String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
// 拿到返回参数
JSONObject result = JSONObject.parseObject(success);
JSONObject data = result.getJSONObject("data");
return data;
}
}