添加新版开放平台支付

This commit is contained in:
韩鹏辉 2024-05-15 15:16:17 +08:00
parent 264867cd11
commit 5f88c35dc7
17 changed files with 1091 additions and 520 deletions

View File

@ -17,6 +17,10 @@ import com.chaozhanggui.system.cashierservice.redis.RedisUtil;
import com.chaozhanggui.system.cashierservice.sign.CodeEnum;
import com.chaozhanggui.system.cashierservice.sign.Result;
import com.chaozhanggui.system.cashierservice.socket.AppWebSocketServer;
import com.chaozhanggui.system.cashierservice.thirdpay.resp.OrderStatusQueryResp;
import com.chaozhanggui.system.cashierservice.thirdpay.resp.PublicResp;
import com.chaozhanggui.system.cashierservice.thirdpay.resp.WxScanPayResp;
import com.chaozhanggui.system.cashierservice.thirdpay.service.ThirdPayService;
import com.chaozhanggui.system.cashierservice.util.BeanUtil;
import com.chaozhanggui.system.cashierservice.util.MD5Util;
import com.chaozhanggui.system.cashierservice.util.N;
@ -101,47 +105,66 @@ public class PayService {
@Autowired
TbShopUserFlowMapper tbShopUserFlowMapper;
@Resource
private TbGroupOrderInfoMapper tbGroupOrderInfoMapper;
@Value("${thirdPay.payType}")
private String thirdPayType;
@Value("${thirdPay.url}")
private String thirdUrl;
@Value("${thirdPay.callBack}")
private String callBack;
@Autowired
private TbProductMapper tbProductMapper;
@Resource
private GroupOrderCouponService orderCouponService;
ThirdPayService thirdPayService;
@Transactional(rollbackFor = Exception.class)
public Result payOrder(String openId, String orderId,String payType, String ip) throws Exception {
TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId));
public Result payOrder(String openId,String orderId,String ip) throws Exception {
TbOrderInfo orderInfo= tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId));
if (!"unpaid".equals(orderInfo.getStatus()) && !"paying".equals(orderInfo.getStatus())) {
if(!"unpaid".equals(orderInfo.getStatus())&&!"paying".equals(orderInfo.getStatus())){
return Result.fail("订单状态异常,不允许支付");
}
if (ObjectUtil.isNull(orderInfo.getMerchantId()) || ObjectUtil.isEmpty(orderInfo.getMerchantId())) {
if(ObjectUtil.isNull(orderInfo.getMerchantId())||ObjectUtil.isEmpty(orderInfo.getMerchantId())){
return Result.fail("没有对应的商户");
}
TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId()));
List<TbCashierCart> cashierCarts= tbCashierCartMapper.selectByOrderId(orderId,"create");
if(ObjectUtil.isEmpty(cashierCarts)||ObjectUtil.isNull(cashierCarts)){
return Result.fail("购物车信息不存在");
}
if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) {
StringBuffer body=new StringBuffer();
for (TbCashierCart cashierCart : cashierCarts) {
body.append(cashierCart.getName());
}
TbMerchantThirdApply thirdApply= tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId()));
if(ObjectUtil.isEmpty(thirdApply)||ObjectUtil.isNull(thirdApply)){
return Result.fail("支付通道不存在");
}
TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(orderId);
if (ObjectUtil.isEmpty(payment) || payment == null) {
payment = new TbOrderPayment();
TbOrderPayment payment=tbOrderPaymentMapper.selectByOrderId(orderId);
if(ObjectUtil.isEmpty(payment)||payment==null){
payment=new TbOrderPayment();
payment.setPayTypeId("ysk");
payment.setAmount(orderInfo.getOrderAmount());
payment.setPaidAmount(orderInfo.getPayAmount());
payment.setHasRefundAmount(BigDecimal.ZERO);
if (payType.equals("wechatPay")) {
payment.setPayName("微信支付");
payment.setPayType("wechatPay");
} else if (payType.equals("aliPay")) {
payment.setPayName("支付宝支付");
payment.setPayType("aliPay");
}
payment.setPayName("微信支付");
payment.setPayType("wechatPay");
payment.setReceived(payment.getAmount());
payment.setChangeFee(BigDecimal.ZERO);
payment.setMemberId(orderInfo.getMemberId());
@ -149,435 +172,280 @@ public class PayService {
payment.setOrderId(orderInfo.getId().toString());
payment.setCreatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.insert(payment);
} else {
if (payType.equals("wechatPay")) {
payment.setPayName("微信支付");
payment.setPayType("wechatPay");
} else if (payType.equals("aliPay")) {
payment.setPayName("支付宝支付");
payment.setPayType("aliPay");
}
}else {
payment.setUpdatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.updateByPrimaryKey(payment);
}
PayReq req = new PayReq();
req.setAppId(thirdApply.getAppId());
req.setTimestamp(System.currentTimeMillis());
req.setIp(ip);
req.setMercOrderNo(orderInfo.getOrderNo());
req.setNotifyUrl(callBackurl);
req.setPayAmt(payment.getAmount().setScale(2, BigDecimal.ROUND_DOWN).toPlainString());
if (payType.equals("wechatPay")) {
if("ysk".equals(thirdPayType)){
PayReq req=new PayReq();
req.setAppId(thirdApply.getAppId());
req.setTimestamp(System.currentTimeMillis());
req.setIp(ip);
req.setMercOrderNo(orderInfo.getOrderNo());
req.setNotifyUrl(callBackurl);
req.setPayAmt(payment.getAmount().setScale(2,BigDecimal.ROUND_DOWN).toPlainString());
req.setPayType("03");
req.setPayWay("WXZF");//WXZF ZFBZF UNIONPAY
} else if (payType.equals("aliPay")) {
req.setPayWay("ZFBZF");
}
req.setSubject("扫码点餐");
req.setUserId(openId);
Map<String, Object> map = BeanUtil.transBeanMap(req);
req.setSign(MD5Util.encrypt(map, thirdApply.getAppToken(), true));
ResponseEntity<String> response = restTemplate.postForEntity(url.concat("trans/pay"), req, String.class);
if (response.getStatusCodeValue() == 200 && ObjectUtil.isNotEmpty(response.getBody())) {
JSONObject object = JSONObject.parseObject(response.getBody());
if (object.get("code").equals("0")) {
payment.setTradeNumber(object.getJSONObject("data").get("orderNumber").toString());
payment.setUpdatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.updateByPrimaryKeySelective(payment);
orderInfo.setStatus("paying");
orderInfo.setPayOrderNo(payment.getTradeNumber());
req.setPayWay("WXZF");
req.setSubject("扫码点餐");
req.setUserId(openId);
tbOrderInfoMapper.updateByPrimaryKey(orderInfo);
String key = RedisCst.TABLE_CART.concat(orderInfo.getTableId()).concat("-").concat(orderInfo.getShopId());
//清除缓存购物车数据
redisUtil.deleteByKey(key);
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("status", "success");
jsonObject1.put("msg", "成功");
jsonObject1.put("type", "");
jsonObject1.put("data", new JSONArray());
jsonObject1.put("amount", 0);
AppWebSocketServer.AppSendInfo(jsonObject1, key, false);
tbCashierCartMapper.updateStatusByOrderId(orderId.toString(), "final");
return Result.success(CodeEnum.SUCCESS, object.getJSONObject("data"));
} else {
return Result.fail(object.getString("msg"));
}
}
Map<String,Object> map= BeanUtil.transBeanMap(req);
req.setSign(MD5Util.encrypt(map,thirdApply.getAppToken(),true));
return Result.fail("失败");
}
@Transactional(rollbackFor = Exception.class)
public Result groupOrderPay(String orderId, String payType, String userId, String ip) {
TbGroupOrderInfo orderInfo = tbGroupOrderInfoMapper.queryById(Integer.valueOf(orderId));
if (!"unpaid".equals(orderInfo.getStatus())) {
return Result.fail("订单状态异常,不允许支付");
}
TbMerchantAccount tbMerchantAccount = merchantAccountMapper.selectByShopId(orderInfo.getShopId().toString());
if (tbMerchantAccount == null) {
throw new MsgException("生成订单错误");
}
if (ObjectUtil.isNull(tbMerchantAccount.getMerchantId()) || ObjectUtil.isEmpty(tbMerchantAccount.getMerchantId())) {
return Result.fail("没有对应的商户");
}
TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(tbMerchantAccount.getMerchantId()));
if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) {
return Result.fail("支付通道不存在");
}
TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(orderId);
if (ObjectUtil.isEmpty(payment) || payment == null) {
payment = new TbOrderPayment();
payment.setPayTypeId("ysk");
payment.setAmount(orderInfo.getOrderAmount());
payment.setPaidAmount(orderInfo.getPayAmount());
payment.setHasRefundAmount(BigDecimal.ZERO);
if (payType.equals("wechatPay")) {
payment.setPayName("微信支付");
payment.setPayType("wechatPay");
} else if (payType.equals("aliPay")) {
payment.setPayName("支付宝支付");
payment.setPayType("aliPay");
}
payment.setReceived(payment.getAmount());
payment.setChangeFee(BigDecimal.ZERO);
// payment.setMemberId(orderInfo.getMemberId());//会员Id
payment.setShopId(orderInfo.getShopId().toString());
payment.setOrderId(orderInfo.getId().toString());
payment.setCreatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.insert(payment);
} else {
if (payType.equals("wechatPay")) {
payment.setPayName("微信支付");
payment.setPayType("wechatPay");
} else if (payType.equals("aliPay")) {
payment.setPayName("支付宝支付");
payment.setPayType("aliPay");
}
payment.setUpdatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.updateByPrimaryKey(payment);
}
PayReq req = new PayReq();
req.setAppId(thirdApply.getAppId());
req.setTimestamp(System.currentTimeMillis());
req.setIp(ip);
req.setMercOrderNo(orderInfo.getOrderNo());
req.setNotifyUrl(callBackGroupurl);
req.setPayAmt(payment.getAmount().setScale(2, BigDecimal.ROUND_DOWN).toPlainString());
if (payType.equals("wechatPay")) {
req.setPayType("03");
req.setPayWay("WXZF");//WXZF ZFBZF UNIONPAY
} else if (payType.equals("aliPay")) {
req.setPayWay("ZFBZF");
}
req.setSubject("零点八零:团购卷");
req.setUserId(userId);
ResponseEntity<String> response= restTemplate.postForEntity(url.concat("trans/pay"),req,String.class);
if(response.getStatusCodeValue()==200&&ObjectUtil.isNotEmpty(response.getBody())){
JSONObject object=JSONObject.parseObject(response.getBody());
if(object.get("code").equals("0")){
payment.setTradeNumber(object.getJSONObject("data").get("orderNumber").toString());
payment.setUpdatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.updateByPrimaryKeySelective(payment);
orderInfo.setStatus("paying");
orderInfo.setPayOrderNo(payment.getTradeNumber());
Map<String, Object> map = BeanUtil.transBeanMap(req);
req.setSign(MD5Util.encrypt(map, thirdApply.getAppToken(), true));
ResponseEntity<String> response = restTemplate.postForEntity(url.concat("trans/pay"), req, String.class);
if (response.getStatusCodeValue() == 200 && ObjectUtil.isNotEmpty(response.getBody())) {
JSONObject object = JSONObject.parseObject(response.getBody());
log.info("团购卷支付响应:{}",object);
if (object.get("code").equals("0")) {
payment.setTradeNumber(object.getJSONObject("data").get("orderNumber").toString());
payment.setUpdatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.updateByPrimaryKeySelective(payment);
orderInfo.setPayType(payType);
orderInfo.setPayOrderNo(payment.getTradeNumber());
tbGroupOrderInfoMapper.update(orderInfo);
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("status", "success");
jsonObject1.put("msg", "成功");
jsonObject1.put("type", "");
jsonObject1.put("data", new JSONArray());
jsonObject1.put("amount", 0);
tbProductMapper.upGroupRealSalesNumber(orderInfo.getProId().toString(), orderInfo.getNumber());
return Result.success(CodeEnum.SUCCESS, object.getJSONObject("data"));
} else {
return Result.fail(object.getString("msg"));
}
}
return Result.fail("失败");
}
@Transactional(rollbackFor = Exception.class)
public Result returnOrder(ReturnGroupOrderDto param) {
TbGroupOrderInfo groupOrderInfo = tbGroupOrderInfoMapper.queryById(param.getOrderId());
List<TbGroupOrderCoupon> tbGroupOrderCoupons = orderCouponService.queryNoRefundByOrderId(param.getOrderId());
if (param.getNum() > tbGroupOrderCoupons.size()) {
return Result.fail("可退数量不足");
}
for (int i = 0; i < param.getNum(); i++) {
TbGroupOrderCoupon coupon = tbGroupOrderCoupons.get(i);
coupon.setIsRefund(1);
coupon.setRefundAmount(param.getRefundAmount());
coupon.setRefundDesc(param.getRefundDesc());
coupon.setRefundReason(param.getRefundReason());
orderCouponService.update(coupon);
}
TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(groupOrderInfo.getMerchantId());
MsgException.checkNull(thirdApply, "支付参数配置错误");
ReturnOrderReq req = new ReturnOrderReq();
req.setAppId(thirdApply.getAppId());
req.setTimestamp(System.currentTimeMillis());
req.setOrderNumber(groupOrderInfo.getPayOrderNo());
req.setAmount(param.getRefundAmount().toString());
req.setMercRefundNo(groupOrderInfo.getOrderNo());
req.setRefundReason("团购卷:退货");
req.setPayPassword(thirdApply.getPayPassword());
Map<String, Object> map = BeanUtil.transBean2Map(req);
req.setSign(MD5Util.encrypt(map, thirdApply.getAppToken(), true));
log.info("groupOrderReturn req:{}", JSONUtil.toJsonStr(req));
ResponseEntity<String> response = restTemplate.postForEntity(url.concat("merchantOrder/returnOrder"), req, String.class);
log.info("groupOrderReturn:{}", response.getBody());
if (response.getStatusCodeValue() == 200 && ObjectUtil.isNotEmpty(response.getBody())) {
JSONObject object = JSONObject.parseObject(response.getBody());
if (!object.get("code").equals("0")) {
MsgException.check(true, "退款渠道调用失败");
}
}
groupOrderInfo.setRefundNumber(groupOrderInfo.getRefundNumber() + param.getNum());
groupOrderInfo.setRefundAmount(groupOrderInfo.getRefundAmount().add(param.getRefundAmount()));
if (groupOrderInfo.getNumber() == groupOrderInfo.getRefundNumber()) {
groupOrderInfo.setRefundAble(0);
groupOrderInfo.setStatus("refund");
}
tbGroupOrderInfoMapper.update(groupOrderInfo);
return Result.success(CodeEnum.SUCCESS);
}
@Transactional(rollbackFor = Exception.class)
public Result accountPay(String orderId, String userId, String shopId, String pwd) {
if (ObjectUtil.isEmpty(orderId) || ObjectUtil.isEmpty(userId) || ObjectUtil.isEmpty(shopId) || ObjectUtil.isEmpty(pwd)) {
return Result.fail("参数错误");
}
TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId));
if (ObjectUtil.isEmpty(orderInfo)) {
return Result.fail("订单信息不存在");
}
if (!"unpaid".equals(orderInfo.getStatus())) {
return Result.fail("订单状态异常");
}
int count = tbShopPayTypeMapper.countSelectByShopIdAndPayType(orderInfo.getShopId(), "deposit");
if (count < 1) {
return Result.fail("当前店铺未开通储值卡支付");
}
TbShopUser user = tbShopUserMapper.selectByUserIdAndShopId(userId, shopId);
if (ObjectUtil.isEmpty(user) || !"1".equals(user.getIsVip().toString())) {
return Result.fail("此用户非会员用户");
}
if ("1".equals(user.getIsPwd())) {
return Result.fail("会员支付密码为初始化密码");
}
if (!MD5Util.encrypt(pwd).equals(user.getPwd())) {
return Result.fail("会员支付密码错误");
}
if (N.gt(orderInfo.getPayAmount(), user.getAmount())) {
return Result.fail("会员卡余额不足");
}
user.setAmount(user.getAmount().subtract(orderInfo.getOrderAmount()));
user.setConsumeAmount(user.getConsumeAmount().add(orderInfo.getPayAmount()));
user.setConsumeNumber(user.getConsumeNumber() + 1);
user.setUpdatedAt(System.currentTimeMillis());
tbShopUserMapper.updateByPrimaryKeySelective(user);
TbShopUserFlow flow = new TbShopUserFlow();
flow.setShopUserId(Integer.valueOf(user.getId()));
flow.setBizCode("accountPay");
flow.setBizName("会员储值卡支付");
flow.setAmount(orderInfo.getOrderAmount());
flow.setBalance(user.getAmount());
flow.setCreateTime(new Date());
tbShopUserFlowMapper.insert(flow);
orderInfo.setPayAmount(orderInfo.getOrderAmount());
orderInfo.setMemberId(userId);
orderInfo.setPayType("deposit");
orderInfo.setStatus("closed");
orderInfo.setPayOrderNo("deposit".concat(SnowFlakeUtil.generateOrderNo()));
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
int cartCount = tbCashierCartMapper.updateStatusByOrderId(orderId.toString(), "final");
log.info("更新购物车:{}", cartCount);
//更新子单状态
tbOrderDetailMapper.updateStatusByOrderIdAndStatus(Integer.valueOf(orderId), "closed");
//修改主单状态
orderInfo.setStatus("closed");
orderInfo.setPayType("deposit");
orderInfo.setPayOrderNo(user.getDynamicCode());
orderInfo.setPayAmount(orderInfo.getOrderAmount());
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", 0);
jsonObject.put("type", "wxcreate");
jsonObject.put("orderId", orderInfo.getId().toString());
producer.putOrderCollect(jsonObject.toJSONString());
producer.printMechine(orderInfo.getId() + "");
return Result.success(CodeEnum.SUCCESS);
}
@Transactional(rollbackFor = Exception.class)
public Result modifyOrderStatus(Integer orderId) throws IOException {
TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId));
if (ObjectUtil.isEmpty(orderInfo)) {
return Result.fail("订单信息不存在");
}
if ("paying".equals(orderInfo.getStatus())) {
TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(orderInfo.getId().toString());
if (ObjectUtil.isNotEmpty(payment) && ObjectUtil.isNotEmpty(payment.getTradeNumber())) {
TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId()));
if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) {
return Result.fail("支付通道不存在");
tbOrderInfoMapper.updateByPrimaryKey(orderInfo);
String key= RedisCst.TABLE_CART.concat(orderInfo.getTableId()).concat("-").concat(orderInfo.getShopId());
//清除缓存购物车数据
redisUtil.deleteByKey(key);
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("status", "success");
jsonObject1.put("msg", "成功");
jsonObject1.put("type", "");
jsonObject1.put("data", new JSONArray());
jsonObject1.put("amount", 0);
AppWebSocketServer.AppSendInfo(jsonObject1,key, false);
tbCashierCartMapper.updateStatusByOrderId(orderId.toString(),"final");
return Result.success(CodeEnum.SUCCESS,object.getJSONObject("data"));
}else {
return Result.fail(object.getString("msg"));
}
TradeQueryReq req = new TradeQueryReq();
req.setAppId(thirdApply.getAppId());
req.setTimestamp(System.currentTimeMillis());
req.setOrderNumber(payment.getTradeNumber());
Map<String, Object> map = BeanUtil.transBeanMap(req);
}
}else {
String reqbody="";
req.setSign(MD5Util.encrypt(map, thirdApply.getAppToken(), true));
if(body.length()>15){
reqbody=body.substring(0,6).concat("....").concat(body.substring(body.length()-6,body.length())).toString();
}else {
reqbody=body.toString();
}
ResponseEntity<String> response = restTemplate.postForEntity(url.concat("merchantOrder/tradeQuery"), req, String.class);
if (response.getStatusCodeValue() == 200 && ObjectUtil.isNotEmpty(response.getBody())) {
JSONObject object = JSONObject.parseObject(response.getBody());
if (object.get("code").equals("0")) {
JSONObject data = object.getJSONObject("data");
String status = data.getString("status");
String cartStatus = "";
switch (status) {
case "0": //交易失败
break;
case "1": //交易成功
//修改数据库中购物车数据
int cartCount = tbCashierCartMapper.updateStatusByOrderId(orderId.toString(), "final");
log.info("更新购物车:{}", cartCount);
//更新子单状态
tbOrderDetailMapper.updateStatusByOrderIdAndStatus(Integer.valueOf(orderId), "closed");
//修改主单状态
orderInfo.setStatus("closed");
orderInfo.setPayType("wx_lite");
orderInfo.setPayOrderNo(payment.getTradeNumber());
orderInfo.setPayAmount(orderInfo.getOrderAmount());
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
PublicResp<WxScanPayResp> publicResp= thirdPayService.scanpay(thirdUrl,thirdApply.getAppId(),reqbody,reqbody,payment.getAmount().setScale(2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).longValue(),"wx212769170d2c6b2a","wx212769170d2c6b2a",openId,ip,orderInfo.getOrderNo(),"S2405103298",callBack,null,thirdApply.getAppToken());
if(ObjectUtil.isNotNull(publicResp)&&ObjectUtil.isNotEmpty(publicResp)){
if("000000".equals(publicResp.getCode())){
WxScanPayResp wxScanPayResp= publicResp.getObjData();
if("TRADE_SUCCESS".equals(wxScanPayResp.getState())){
payment.setTradeNumber(wxScanPayResp.getPayOrderId());
payment.setUpdatedAt(System.currentTimeMillis());
tbOrderPaymentMapper.updateByPrimaryKeySelective(payment);
orderInfo.setStatus("paying");
orderInfo.setPayOrderNo(payment.getTradeNumber());
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", 0);
jsonObject.put("type", "wxcreate");
jsonObject.put("orderId", orderInfo.getId().toString());
producer.putOrderCollect(jsonObject.toJSONString());
log.info("发送打印数据");
producer.printMechine(orderInfo.getId() + "");
log.info("发送赠送购物券");
JSONObject coupons = new JSONObject();
coupons.put("type", "buy");
coupons.put("orderId", orderId);
producer.printCoupons(coupons.toJSONString());
return Result.success(CodeEnum.SUCCESS, orderId);
case "2": //退款成功
cartStatus = "refund";
orderInfo.setStatus("refund");
break;
case "3": //退款失败
break;
case "4": //退款中
cartStatus = "refunding";
orderInfo.setStatus("refunding");
break;
}
tbCashierCartMapper.updateStatusByOrderId(orderId.toString(), cartStatus);
orderInfo.setUpdatedAt(System.currentTimeMillis());
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
tbOrderInfoMapper.updateByPrimaryKey(orderInfo);
String key= RedisCst.TABLE_CART.concat(orderInfo.getTableId()).concat("-").concat(orderInfo.getShopId());
//清除缓存购物车数据
redisUtil.deleteByKey(key);
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("status", "success");
jsonObject1.put("msg", "成功");
jsonObject1.put("type", "");
jsonObject1.put("data", new JSONArray());
jsonObject1.put("amount", 0);
AppWebSocketServer.AppSendInfo(jsonObject1,key, false);
tbCashierCartMapper.updateStatusByOrderId(orderId.toString(),"final");
return Result.success(CodeEnum.SUCCESS,wxScanPayResp.getPayInfo());
}else{
return Result.fail(publicResp.getMsg());
}
}
}
}
return Result.success(CodeEnum.SUCCESS, orderId);
return Result.fail("失败");
}
@Transactional(rollbackFor = Exception.class)
public Result memberIn(String openId, String userId, String amount, String shopId, String ip) {
if (ObjectUtil.isEmpty(openId) || ObjectUtil.isEmpty(userId)) {
public Result modifyOrderStatus(Integer orderId) throws IOException {
TbOrderInfo orderInfo= tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId));
if(ObjectUtil.isEmpty(orderInfo)){
return Result.fail("订单信息不存在");
}
if("paying".equals(orderInfo.getStatus())){
TbOrderPayment payment= tbOrderPaymentMapper.selectByOrderId(orderInfo.getId().toString());
if(ObjectUtil.isNotEmpty(payment)&&ObjectUtil.isNotEmpty(payment.getTradeNumber())){
TbMerchantThirdApply thirdApply= tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId()));
if(ObjectUtil.isEmpty(thirdApply)||ObjectUtil.isNull(thirdApply)){
return Result.fail("支付通道不存在");
}
if("ysk".equals(thirdPayType)){
TradeQueryReq req=new TradeQueryReq();
req.setAppId(thirdApply.getAppId());
req.setTimestamp(System.currentTimeMillis());
req.setOrderNumber(payment.getTradeNumber());
Map<String,Object> map= BeanUtil.transBeanMap(req);
req.setSign(MD5Util.encrypt(map,thirdApply.getAppToken(),true));
ResponseEntity<String> response= restTemplate.postForEntity(url.concat("merchantOrder/tradeQuery"),req,String.class);
if(response.getStatusCodeValue()==200&&ObjectUtil.isNotEmpty(response.getBody())){
JSONObject object=JSONObject.parseObject(response.getBody());
if(object.get("code").equals("0")){
JSONObject data=object.getJSONObject("data");
String status=data.getString("status");
String cartStatus="";
switch (status){
case "0": //交易失败
break;
case "1": //交易成功
//修改数据库中购物车数据
int cartCount= tbCashierCartMapper.updateStatusByOrderId(orderId.toString(),"final");
log.info("更新购物车:{}",cartCount);
//更新子单状态
tbOrderDetailMapper.updateStatusByOrderIdAndStatus(Integer.valueOf(orderId),"closed");
//修改主单状态
orderInfo.setStatus("closed");
orderInfo.setPayType("wx_lite");
orderInfo.setPayOrderNo(payment.getTradeNumber());
orderInfo.setPayAmount(orderInfo.getOrderAmount());
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
JSONObject jsonObject=new JSONObject();
jsonObject.put("token",0);
jsonObject.put("type","wxcreate");
jsonObject.put("orderId",orderInfo.getId().toString());
producer.putOrderCollect(jsonObject.toJSONString());
log.info("发送打印数据");
producer.printMechine(orderInfo.getId() + "");
return Result.success(CodeEnum.SUCCESS,orderId);
case "2": //退款成功
cartStatus="refund";
orderInfo.setStatus("refund");
break;
case "3": //退款失败
break;
case "4": //退款中
cartStatus="refunding";
orderInfo.setStatus("refunding");
break;
}
tbCashierCartMapper.updateStatusByOrderId(orderId.toString(),cartStatus);
orderInfo.setUpdatedAt(System.currentTimeMillis());
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
}
}
}else {
PublicResp<OrderStatusQueryResp> publicResp=thirdPayService.queryOrder(thirdUrl,thirdApply.getAppId(),orderInfo.getOrderNo(),null,thirdApply.getAppToken());
if(ObjectUtil.isNotNull(publicResp)&&ObjectUtil.isNotEmpty(publicResp)){
if("000000".equals(publicResp.getCode())){
String cartStatus="";
switch (publicResp.getObjData().getState()){
case "TRADE_SUCCESS":
//修改数据库中购物车数据
int cartCount= tbCashierCartMapper.updateStatusByOrderId(orderId.toString(),"final");
log.info("更新购物车:{}",cartCount);
//更新子单状态
tbOrderDetailMapper.updateStatusByOrderIdAndStatus(Integer.valueOf(orderId),"closed");
//修改主单状态
orderInfo.setStatus("closed");
orderInfo.setPayType("wx_lite");
orderInfo.setPayOrderNo(payment.getTradeNumber());
orderInfo.setPayAmount(orderInfo.getOrderAmount());
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
JSONObject jsonObject=new JSONObject();
jsonObject.put("token",0);
jsonObject.put("type","wxcreate");
jsonObject.put("orderId",orderInfo.getId().toString());
producer.putOrderCollect(jsonObject.toJSONString());
log.info("发送打印数据");
producer.printMechine(orderInfo.getId() + "");
return Result.success(CodeEnum.SUCCESS,orderId);
case "REFUND_ING":
cartStatus="refunding";
orderInfo.setStatus("refunding");
break;
}
}
}
}
}
}
return Result.success(CodeEnum.SUCCESS,orderId);
}
@Transactional(rollbackFor = Exception.class)
public Result memberIn(String openId,String userId,String amount,String shopId,String ip){
if(ObjectUtil.isEmpty(openId)||ObjectUtil.isEmpty(userId)){
return Result.fail("用户信息允许为空");
}
TbShopUser tbShopUser = tbShopUserMapper.selectByUserIdAndShopId(userId, shopId);
if (ObjectUtil.isEmpty(tbShopUser)) {
TbShopUser tbShopUser= tbShopUserMapper.selectByUserIdAndShopId(userId,shopId);
if(ObjectUtil.isEmpty(tbShopUser)){
return Result.fail("对应的用户信息不存在");
}
if(ObjectUtil.isEmpty(tbShopUser.getIsVip())||!"1".equals(tbShopUser.getIsVip().toString())){
return Result.fail("非会员用户不允许充值");
}
TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId));
if (ObjectUtil.isEmpty(shopInfo)) {
TbShopInfo shopInfo= tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId));
if(ObjectUtil.isEmpty(shopInfo)){
return Result.fail("对应的店铺信息不存在");
}
TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(shopInfo.getMerchantId()));
if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) {
TbMerchantThirdApply thirdApply= tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(shopInfo.getMerchantId()));
if(ObjectUtil.isEmpty(thirdApply)||ObjectUtil.isNull(thirdApply)){
return Result.fail("支付通道不存在");
}
BigDecimal payAmount = new BigDecimal(amount).setScale(2, BigDecimal.ROUND_DOWN);
BigDecimal payAmount= new BigDecimal(amount).setScale(2,BigDecimal.ROUND_DOWN);
TbMemberIn memberIn = new TbMemberIn();
TbMemberIn memberIn=new TbMemberIn();
memberIn.setAmount(payAmount);
memberIn.setUserId(Integer.valueOf(tbShopUser.getUserId()));
memberIn.setCode(tbShopUser.getDynamicCode());
memberIn.setCode(tbShopUser.getCode());
memberIn.setShopId(shopInfo.getId());
memberIn.setStatus("7");
memberIn.setMerchantId(Integer.valueOf(shopInfo.getMerchantId()));
@ -585,7 +453,8 @@ public class PayService {
tbMemberInMapper.insert(memberIn);
PayReq req = new PayReq();
PayReq req=new PayReq();
req.setAppId(thirdApply.getAppId());
req.setTimestamp(System.currentTimeMillis());
@ -599,51 +468,26 @@ public class PayService {
req.setUserId(openId);
Map<String, Object> map = BeanUtil.transBeanMap(req);
req.setSign(MD5Util.encrypt(map, thirdApply.getAppToken(), true));
Map<String,Object> map= BeanUtil.transBeanMap(req);
req.setSign(MD5Util.encrypt(map,thirdApply.getAppToken(),true));
ResponseEntity<String> response = restTemplate.postForEntity(url.concat("trans/pay"), req, String.class);
if (response.getStatusCodeValue() == 200 && ObjectUtil.isNotEmpty(response.getBody())) {
JSONObject object = JSONObject.parseObject(response.getBody());
if (object.get("code").equals("0")) {
ResponseEntity<String> response= restTemplate.postForEntity(url.concat("trans/pay"),req,String.class);
if(response.getStatusCodeValue()==200&&ObjectUtil.isNotEmpty(response.getBody())){
JSONObject object=JSONObject.parseObject(response.getBody());
if(object.get("code").equals("0")){
memberIn.setOrderNo(object.getJSONObject("data").get("orderNumber").toString());
memberIn.setUpdateTime(new Date());
tbMemberInMapper.updateByPrimaryKeySelective(memberIn);
return Result.success(CodeEnum.SUCCESS, object.getJSONObject("data"));
} else {
return Result.success(CodeEnum.SUCCESS,object.getJSONObject("data"));
}else {
return Result.fail(object.getString("msg"));
}
}
return Result.fail("失败");
}
@Transactional(rollbackFor = Exception.class)
public String callBackGroupPay(String payOrderNO) {
TbGroupOrderInfo orderInfo = tbGroupOrderInfoMapper.selectByPayOrderNo(payOrderNO);
if (ObjectUtil.isEmpty(orderInfo)) {
return "订单信息不存在";
}
if ("unpaid".equals(orderInfo.getStatus())) {
for (int i = 0; i < orderInfo.getNumber(); i++) {
TbGroupOrderCoupon groupOrderCoupon = new TbGroupOrderCoupon();
groupOrderCoupon.setOrderId(orderInfo.getId());
groupOrderCoupon.setCouponNo(genCouponNumber());
groupOrderCoupon.setIsRefund(0);
groupOrderCouponService.insert(groupOrderCoupon);
}
orderInfo.setExpDate(getNextMonDate());
//修改主单状态
orderInfo.setStatus("unused");
orderInfo.setPayAmount(orderInfo.getOrderAmount());
tbGroupOrderInfoMapper.update(orderInfo);
return "SUCCESS";
}else {
log.error("支付回调异常,订单状态为{}",orderInfo);
}
return null;
}
@Transactional(rollbackFor = Exception.class)
public String callBackPay(String payOrderNO) {
@ -668,10 +512,10 @@ public class PayService {
tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo);
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", 0);
jsonObject.put("type", "wxcreate");
jsonObject.put("orderId", orderInfo.getId().toString());
JSONObject jsonObject=new JSONObject();
jsonObject.put("token",0);
jsonObject.put("type","wxcreate");
jsonObject.put("orderId",orderInfo.getId().toString());
producer.putOrderCollect(jsonObject.toJSONString());
@ -686,10 +530,10 @@ public class PayService {
@Transactional(rollbackFor = Exception.class)
public String minsuccess(String payOrderNO, String tradeNo) {
public String minsuccess(String payOrderNO,String tradeNo){
TbMemberIn memberIn = tbMemberInMapper.selectByOrderNo(payOrderNO);
if (ObjectUtil.isEmpty(memberIn)) {
TbMemberIn memberIn= tbMemberInMapper.selectByOrderNo(payOrderNO);
if(ObjectUtil.isEmpty(memberIn)){
return "充值记录不存在";
}
@ -698,18 +542,21 @@ public class PayService {
memberIn.setUpdateTime(new Date());
tbMemberInMapper.updateByPrimaryKeySelective(memberIn);
TbShopUser tbShopUser = tbShopUserMapper.selectByUserIdAndShopId(memberIn.getUserId().toString(), memberIn.getShopId().toString());
if (ObjectUtil.isEmpty(tbShopUser)) {
TbShopUser tbShopUser= tbShopUserMapper.selectByUserIdAndShopId(memberIn.getUserId().toString(),memberIn.getShopId().toString());
if(ObjectUtil.isEmpty(tbShopUser)){
return "用户信息不存在";
}
if(!"1".equals(tbShopUser.getIsVip().toString())){
tbShopUser.setIsVip(Byte.parseByte("1"));
}
//修改客户资金
tbShopUser.setIsVip(Byte.parseByte("1"));
tbShopUser.setAmount(tbShopUser.getAmount().add(memberIn.getAmount()));
tbShopUser.setUpdatedAt(System.currentTimeMillis());
tbShopUserMapper.updateByPrimaryKeySelective(tbShopUser);
TbShopUserFlow flow = new TbShopUserFlow();
TbShopUserFlow flow=new TbShopUserFlow();
flow.setShopUserId(Integer.valueOf(tbShopUser.getId()));
flow.setBizCode("scanMemberIn");
flow.setBizName("会员扫码充值");
@ -725,76 +572,52 @@ public class PayService {
//
// }
/**
* 生成长度为12的随机串
*
* @return
*/
public static String genCouponNumber() {
Random random = new Random();
long min = 10000000000L;
long max = 19999999999L;
// 生成介于min和max之间的随机整数
long randomNumber = min + ((long) (random.nextDouble() * (max - min)));
// 将随机整数转换为字符串并在前面补0直到长度为12位
return String.format("%012d", randomNumber);
}
/**
* 获取一个月后的时间
*
* @return
*/
public Date getNextMonDate() {
// 获取当前日期和时间
LocalDateTime currentDateTime = LocalDateTime.now();
// 计算一个月后的日期和时间
LocalDateTime nextMonthDateTime = currentDateTime.plusMonths(1);
return java.sql.Timestamp.valueOf(nextMonthDateTime);
}
public static void main(String[] args){
RestTemplate restTemplate1= new RestTemplate();
JSONObject param=new JSONObject();
String priv="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIqNqTqhN8zE7eFZnwKcyBTENce2wdAtl/gaDHNuNVgg33dS27Jx0fKl9QSHXyzyxbAdG8F94niYbRBstrMymFRjuO72jH+rIH62Ym1k7l8JSLVK2dKHXt8lHDaQGUP10q0EEocnDQ9cL93oBNG1ttsV6vOAu1TPvRK9TGihRAe1AgMBAAECgYBmI8KCl0DkcrSOsRvYuC2DqZWf8el1B3eFjeZp3e/zVOCIPYv6Q5ArWg6DVSxjnWEA0KSagqvGjU+xkQMqnXzPcPMhsIS+1wyR/pP+pwiatO2ioHaQpEqHg9eXhxrgA477/xuKVw9zl5GNqaIgd++2NDXnqLh0Y6OR73f0OB5eDQJBAPihEm+UWLOam/Q/k2+k4Lm2dvxJTBur1fslBiJpgMhgcz/PlwRwpL7aPD0AuPv0NqLouuoTiKpq9icnUv12tgsCQQCOqTANw0IErCHUNdinjXewmG3ui1j9XgM41rSn5ZeTrPL4GhZc2zbS/pZT4PBKUL6NLGkfPHmw4rOmNL/Xc5E/AkBqAwQBX5eSvVHSC2mqKPtJNGv3lqlFAzfyJg8/jQzEY5vAkZsq4Xzdg+A7gptdkvvY6rMIK9wSDhl3CGVyfbORAkA1N+g1OiHmnFACWhP4bU25EyPvWQxZeDi7e1zpRTzGWj5JT3IIMb7B9zcdE0yQbI6pG2gbvvOmiOt7lTH7raEBAkBas2gugvR3f0aGqQcqMpyM627pyRppQ2h58/7KBylP3oR2BReqMUcXeiJ8TuBXzbRXpeVQ0DWOva5CWZJmBMdz";
PayReq req=new PayReq();
req.setAppId("M8002023120892f1e4");
req.setTimestamp(System.currentTimeMillis());
req.setIp("127.0.0.1");
req.setMercOrderNo(System.currentTimeMillis()+"");
req.setNotifyUrl("https");
req.setPayAmt("0.01");
req.setPayType("03");
req.setPayWay("WXZF");
req.setSubject("ddd");
req.setUserId("or1l864NBOoJZhC5x_yeziZ26j6c");
Map<String,Object> map= BeanUtil.transBeanMap(req);
req.setSign(MD5Util.encrypt(map,priv,true));
// public static void main(String[] args) {
//
// RestTemplate restTemplate1 = new RestTemplate();
// JSONObject param = new JSONObject();
//
// String priv = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIqNqTqhN8zE7eFZnwKcyBTENce2wdAtl/gaDHNuNVgg33dS27Jx0fKl9QSHXyzyxbAdG8F94niYbRBstrMymFRjuO72jH+rIH62Ym1k7l8JSLVK2dKHXt8lHDaQGUP10q0EEocnDQ9cL93oBNG1ttsV6vOAu1TPvRK9TGihRAe1AgMBAAECgYBmI8KCl0DkcrSOsRvYuC2DqZWf8el1B3eFjeZp3e/zVOCIPYv6Q5ArWg6DVSxjnWEA0KSagqvGjU+xkQMqnXzPcPMhsIS+1wyR/pP+pwiatO2ioHaQpEqHg9eXhxrgA477/xuKVw9zl5GNqaIgd++2NDXnqLh0Y6OR73f0OB5eDQJBAPihEm+UWLOam/Q/k2+k4Lm2dvxJTBur1fslBiJpgMhgcz/PlwRwpL7aPD0AuPv0NqLouuoTiKpq9icnUv12tgsCQQCOqTANw0IErCHUNdinjXewmG3ui1j9XgM41rSn5ZeTrPL4GhZc2zbS/pZT4PBKUL6NLGkfPHmw4rOmNL/Xc5E/AkBqAwQBX5eSvVHSC2mqKPtJNGv3lqlFAzfyJg8/jQzEY5vAkZsq4Xzdg+A7gptdkvvY6rMIK9wSDhl3CGVyfbORAkA1N+g1OiHmnFACWhP4bU25EyPvWQxZeDi7e1zpRTzGWj5JT3IIMb7B9zcdE0yQbI6pG2gbvvOmiOt7lTH7raEBAkBas2gugvR3f0aGqQcqMpyM627pyRppQ2h58/7KBylP3oR2BReqMUcXeiJ8TuBXzbRXpeVQ0DWOva5CWZJmBMdz";
//
// PayReq req = new PayReq();
//
// req.setAppId("M8002023120892f1e4");
ResponseEntity<String> response= restTemplate1.postForEntity("https://gatewaytestapi.sxczgkj.cn/gate-service/trans/pay",req,String.class);
// TradeQueryReq req=new TradeQueryReq();
// req.setAppId("M800202305094c170c");
// req.setTimestamp(System.currentTimeMillis());
// req.setIp("127.0.0.1");
// req.setMercOrderNo(System.currentTimeMillis() + "");
// req.setNotifyUrl("https");
// req.setPayAmt("0.01");
// req.setPayType("03");
// req.setPayWay("WXZF");
// req.setSubject("ddd");
// req.setUserId("or1l864NBOoJZhC5x_yeziZ26j6c");
// req.setOrderNumber("SXF_W_MERC_20240205182102491");
// Map<String,Object> map= BeanUtil.transBeanMap(req);
//
// Map<String, Object> map = BeanUtil.transBeanMap(req);
// req.setSign(MD5Util.encrypt(map,priv,true));
//
// req.setSign(MD5Util.encrypt(map, priv, true));
// ResponseEntity<String> response= restTemplate1.postForEntity("https://gateway.api.sxczgkj.cn/gate-service/merchantOrder/tradeQuery",req,String.class);
//
//
// ResponseEntity<String> response = restTemplate1.postForEntity("https://gatewaytestapi.sxczgkj.cn/gate-service/trans/pay", req, String.class);
//
//
//// TradeQueryReq req=new TradeQueryReq();
//// req.setAppId("M800202305094c170c");
//// req.setTimestamp(System.currentTimeMillis());
//// req.setOrderNumber("SXF_W_MERC_20240205182102491");
//// Map<String,Object> map= BeanUtil.transBeanMap(req);
////
//// req.setSign(MD5Util.encrypt(map,priv,true));
////
//// ResponseEntity<String> response= restTemplate1.postForEntity("https://gateway.api.sxczgkj.cn/gate-service/merchantOrder/tradeQuery",req,String.class);
////
////
// System.out.println(">>>>>>>>>>>>>>>" + response.getBody());
// }
System.out.println(">>>>>>>>>>>>>>>"+response.getBody());
}
}

View File

@ -0,0 +1,16 @@
package com.chaozhanggui.system.cashierservice.thirdpay.constants;
public enum SignTypeEnum {
MD5("MD5"),RSA2("RSA2");
private final String value;
SignTypeEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}

View File

@ -0,0 +1,41 @@
package com.chaozhanggui.system.cashierservice.thirdpay.req;
import lombok.Data;
import java.io.Serializable;
@Data
public class MainScanReq implements Serializable {
private String subject;
private String body;
private Long amount;
private String subAppid;
private String currency;
private String authCode;
private String mchOrderNo;
private String storeId;
private String notifyUrl;
public MainScanReq(String subject, String body, Long amount, String subAppid, String currency, String authCode, String mchOrderNo, String storeId, String notifyUrl) {
this.subject = subject;
this.body = body;
this.amount = amount;
this.subAppid = subAppid;
this.currency = currency;
this.authCode = authCode;
this.mchOrderNo = mchOrderNo;
this.storeId = storeId;
this.notifyUrl = notifyUrl;
}
}

View File

@ -0,0 +1,32 @@
package com.chaozhanggui.system.cashierservice.thirdpay.req;
import lombok.Data;
import java.io.Serializable;
@Data
public class OrderRefundReq implements Serializable {
private String mchRefundNo;
private String payOrderId;
private String mchOrderNo;
private String refundReason;
private Long refundAmount;
private String notifyUrl;
private String extParam;
public OrderRefundReq(String mchRefundNo, String payOrderId, String mchOrderNo, String refundReason, Long refundAmount, String notifyUrl, String extParam) {
this.mchRefundNo = mchRefundNo;
this.payOrderId = payOrderId;
this.mchOrderNo = mchOrderNo;
this.refundReason = refundReason;
this.refundAmount = refundAmount;
this.notifyUrl = notifyUrl;
this.extParam = extParam;
}
}

View File

@ -0,0 +1,18 @@
package com.chaozhanggui.system.cashierservice.thirdpay.req;
import lombok.Data;
import java.io.Serializable;
@Data
public class OrderReturnQueryReq implements Serializable {
private String mchRefundNo;
private String refundOrderId;
public OrderReturnQueryReq(String mchRefundNo, String refundOrderId) {
this.mchRefundNo = mchRefundNo;
this.refundOrderId = refundOrderId;
}
}

View File

@ -0,0 +1,18 @@
package com.chaozhanggui.system.cashierservice.thirdpay.req;
import lombok.Data;
import java.io.Serializable;
@Data
public class OrderStatusQueryReq implements Serializable {
private String payOrderId;
private String mchOrderNo;
public OrderStatusQueryReq(String payOrderId, String mchOrderNo) {
this.payOrderId = payOrderId;
this.mchOrderNo = mchOrderNo;
}
}

View File

@ -0,0 +1,33 @@
package com.chaozhanggui.system.cashierservice.thirdpay.req;
import lombok.Data;
import java.io.Serializable;
@Data
public class PublicParam implements Serializable {
private String appId;
private String sign;
private String signType;
private String bizData;
private String reqTime;
private String version;
private String reqId;
public PublicParam(String appId, String sign, String signType, String bizData, String reqTime, String version, String reqId) {
this.appId = appId;
this.sign = sign;
this.signType = signType;
this.bizData = bizData;
this.reqTime = reqTime;
this.version = version;
this.reqId = reqId;
}
}

View File

@ -0,0 +1,49 @@
package com.chaozhanggui.system.cashierservice.thirdpay.req;
import lombok.Data;
import java.io.Serializable;
@Data
public class WxScanPayReq implements Serializable {
private String subject;
private String body;
private Long amount;
private String currency;
private String payType;
private String subAppid;
private String userId;
private String clientIp;
private String mchOrderNo;
private String storeId;
private String notifyUrl;
private String returnUrl;
public WxScanPayReq(String subject, String body, Long amount, String currency, String payType, String subAppid, String userId, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl) {
this.subject = subject;
this.body = body;
this.amount = amount;
this.currency = currency;
this.payType = payType;
this.subAppid = subAppid;
this.userId = userId;
this.clientIp = clientIp;
this.mchOrderNo = mchOrderNo;
this.storeId = storeId;
this.notifyUrl = notifyUrl;
this.returnUrl = returnUrl;
}
}

View File

@ -0,0 +1,47 @@
package com.chaozhanggui.system.cashierservice.thirdpay.resp;
import lombok.Data;
import java.io.Serializable;
@Data
public class MainScanResp implements Serializable {
private Long amount;
private String mchOrderNo;
private String payOrderId;
private String mercNo;
private String channelSendNo;
private String channelTradeNo;
private String state;
private String payType;
private String ifCode;
private String extParam;
private String note;
private String tradeFee;
private String storeId;
private String subject;
private String drType;
private Long refundAmt;
private Integer refundState;
private Long cashFee;
private String settlementType;
}

View File

@ -0,0 +1,36 @@
package com.chaozhanggui.system.cashierservice.thirdpay.resp;
import lombok.Data;
import java.io.Serializable;
@Data
public class OderReturnQueyResp implements Serializable {
private String mchRefundNo;
private String refundOrderId;
private String state;
private String oriPayOrderId;
private String mercNo;
private Long oriAmount;
private Long refundAmt;
private String refundReason;
private String ifCode;
private String note;
private String refundTime;
private String extParam;
private String payType;
}

View File

@ -0,0 +1,33 @@
package com.chaozhanggui.system.cashierservice.thirdpay.resp;
import lombok.Data;
import java.io.Serializable;
@Data
public class OrderReturnResp implements Serializable {
private String mchRefundNo;
private String refundOrderId;
private String state;
private String oriPayOrderId;
private String mercNo;
private Long oriAmount;
private Long refundAmt;
private String refundReason;
private String ifCode;
private String refundTime;
private String extParam;
private String payType;
}

View File

@ -0,0 +1,49 @@
package com.chaozhanggui.system.cashierservice.thirdpay.resp;
import lombok.Data;
import java.io.Serializable;
@Data
public class OrderStatusQueryResp implements Serializable {
private Long amount;
private String channelSendNo;
private String ifCode;
private String mercNo;
private String mchOrderNo;
private String payOrderId;
private String payType;
private String channelTradeNo;
private String state;
private String refundAmt;
private String refundState;
private String drType;
private String extParam;
private String payTime;
private String subject;
private String tradeFee;
private String cashFee;
private String storeId;
private String userId;
private String settlementType;
}

View File

@ -0,0 +1,22 @@
package com.chaozhanggui.system.cashierservice.thirdpay.resp;
import lombok.Data;
import java.io.Serializable;
@Data
public class PublicResp <T> implements Serializable {
private String code;
private String msg;
private String sign;
private String bizData;
private T objData;
private String signType;
private String timestamp;
}

View File

@ -0,0 +1,51 @@
package com.chaozhanggui.system.cashierservice.thirdpay.resp;
import lombok.Data;
import java.io.Serializable;
@Data
public class WxScanPayResp implements Serializable {
private Long amount;
private String mchOrderNo;
private String payOrderId;
private String mercNo;
private String channelSendNo;
private String channelTradeNo;
private String state;
private String payType;
private String ifCode;
private String extParam;
private String payInfo;
private String liteInfo;
private String note;
private String tradeFee;
private String storeId;
private String subject;
private String drType;
private String refundAmt;
private String refundState;
private String cashFee;
private String settlementType;
}

View File

@ -0,0 +1,300 @@
package com.chaozhanggui.system.cashierservice.thirdpay.service;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.chaozhanggui.system.cashierservice.thirdpay.constants.SignTypeEnum;
import com.chaozhanggui.system.cashierservice.thirdpay.req.*;
import com.chaozhanggui.system.cashierservice.thirdpay.resp.*;
import com.chaozhanggui.system.cashierservice.util.DateUtils;
import com.chaozhanggui.system.cashierservice.util.JSONUtil;
import com.chaozhanggui.system.cashierservice.util.MD5Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
@Service
@Slf4j
public class ThirdPayService {
private static String micropay="/api/open/payment/micropay";
private static String ltpay="/api/open/payment/ltpay";
private static String trade="/api/open/query/trade";
/**
* 被扫接口
* @param url
* @param appId
* @param subject
* @param body
* @param amount
* @param subAppId
* @param authCode
* @param orderNo
* @param storeId
* @param notifyUrl
* @param key
* @return
*/
public PublicResp<MainScanResp> mainScan(String url,String appId, String subject, String body, Long amount, String subAppId, String authCode, String orderNo, String storeId, String notifyUrl,
String key
) {
MainScanReq mainScanReq = new MainScanReq(subject, body, amount, subAppId, "cny", authCode, orderNo, storeId, notifyUrl);
PublicParam param = new PublicParam(appId, "", SignTypeEnum.MD5.getValue(), null, DateUtils.getSdfTimes(), "1.0", String.valueOf(System.currentTimeMillis()));
try {
String str = JSONUtil.toJSONString(sortFields(mainScanReq));
param.setBizData(str);
String tt = sortFieldsAndPrint(param);
String MD5 = tt.concat("appSecret=" + key);
log.info("加签原传:{}", MD5);
String sign = MD5Util.encrypt(MD5);
param.setSign(sign);
String reqbody = JSONUtil.toJSONString(param);
log.info("请求参数:{}", reqbody);
String response = HttpRequest.post(url.concat(micropay)).body(reqbody).execute().body();
log.info("返回结果:{}", response);
PublicResp<MainScanResp> resp =JSONUtil.parseJSONStr2T(response,PublicResp.class);
resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),MainScanResp.class));
return resp;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* 主扫接口(小程序)
* @param url
* @param appId
* @param subject
* @param body
* @param amount
* @param payType
* @param subAppId
* @param userId
* @param clinetIp
* @param orderNo
* @param storeId
* @param notifyUrl
* @param returnUrl
* @param key
* @return
*/
public PublicResp<WxScanPayResp> scanpay(String url,String appId, String subject, String body, Long amount,String payType, String subAppId, String userId,
String clinetIp,String orderNo, String storeId, String notifyUrl,String returnUrl,
String key){
WxScanPayReq scanPayReq=new WxScanPayReq(subject,body,amount,"cny",payType,subAppId,userId,clinetIp,orderNo,storeId,notifyUrl,returnUrl);
PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(),null,DateUtils.getSdfTimes(), "1.0", String.valueOf(System.currentTimeMillis()));
try {
String str = JSONUtil.toJSONString(sortFields(scanPayReq));
param.setBizData(str);
String tt = sortFieldsAndPrint(param);
String MD5 = tt.concat("appSecret=" + key);
log.info("加签原传:{}", MD5);
String sign = MD5Util.encrypt(MD5);
param.setSign(sign);
String reqbody = JSONUtil.toJSONString(param);
log.info("请求参数:{}", reqbody);
String response = HttpRequest.post(url.concat(ltpay)).body(reqbody).execute().body();
log.info("返回结果:{}", response);
PublicResp<WxScanPayResp> resp =JSONUtil.parseJSONStr2T(response,PublicResp.class);
resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),WxScanPayResp.class));
return resp;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* 查询订单状态
* @param url
* @param appId
* @param payOrderId
* @param mchOrderNo
* @param key
* @return
*/
public PublicResp<OrderStatusQueryResp> queryOrder(String url,String appId, String payOrderId,String mchOrderNo,String key){
OrderStatusQueryReq req=new OrderStatusQueryReq(payOrderId,mchOrderNo);
PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(), "1.0", String.valueOf(System.currentTimeMillis()));
try {
String str = JSONUtil.toJSONString(sortFields(req));
param.setBizData(str);
String tt = sortFieldsAndPrint(param);
String MD5 = tt.concat("appSecret=" + key);
log.info("加签原传:{}", MD5);
String sign = MD5Util.encrypt(MD5);
param.setSign(sign);
String reqbody = JSONUtil.toJSONString(param);
log.info("请求参数:{}", reqbody);
String response = HttpRequest.post(url.concat(trade)).body(reqbody).execute().body();
log.info("返回结果:{}", response);
PublicResp<OrderStatusQueryResp> resp =JSONUtil.parseJSONStr2T(response,PublicResp.class);
resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),OrderStatusQueryResp.class));
return resp;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* 退款
* @param url
* @param appId
* @param mchRefundNo
* @param payOrderId
* @param mchOrderNo
* @param refundReason
* @param refundAmount
* @param notifyUrl
* @param extParam
* @param key
* @return
*/
public PublicResp<OrderReturnResp> returnOrder(String url,String appId, String mchRefundNo, String payOrderId, String mchOrderNo, String refundReason, Long refundAmount, String notifyUrl, String extParam,String key){
OrderRefundReq req=new OrderRefundReq(mchRefundNo, payOrderId, mchOrderNo, refundReason, refundAmount, notifyUrl, extParam);
PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(), "1.0", String.valueOf(System.currentTimeMillis()));
try {
String str = JSONUtil.toJSONString(sortFields(req));
param.setBizData(str);
String tt = sortFieldsAndPrint(param);
String MD5 = tt.concat("appSecret=" + key);
log.info("加签原传:{}", MD5);
String sign = MD5Util.encrypt(MD5);
param.setSign(sign);
String reqbody = JSONUtil.toJSONString(param);
log.info("请求参数:{}", reqbody);
String response = HttpRequest.post(url.concat(trade)).body(reqbody).execute().body();
log.info("返回结果:{}", response);
PublicResp<OrderReturnResp> resp =JSONUtil.parseJSONStr2T(response,PublicResp.class);
resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),OrderReturnResp.class));
return resp;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* 查询退款订单
* @param url
* @param appId
* @param mchRefundNo
* @param refundOrderId
* @param key
* @return
*/
public PublicResp<OrderReturnQueryReq> returnOrderQuery(String url,String appId,String mchRefundNo, String refundOrderId,String key){
OrderReturnQueryReq req=new OrderReturnQueryReq(mchRefundNo,refundOrderId);
PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(), "1.0", String.valueOf(System.currentTimeMillis()));
try {
String str = JSONUtil.toJSONString(sortFields(req));
param.setBizData(str);
String tt = sortFieldsAndPrint(param);
String MD5 = tt.concat("appSecret=" + key);
log.info("加签原传:{}", MD5);
String sign = MD5Util.encrypt(MD5);
param.setSign(sign);
String reqbody = JSONUtil.toJSONString(param);
log.info("请求参数:{}", reqbody);
String response = HttpRequest.post(url.concat(trade)).body(reqbody).execute().body();
log.info("返回结果:{}", response);
PublicResp<OrderReturnQueryReq> resp =JSONUtil.parseJSONStr2T(response,PublicResp.class);
resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),OrderReturnQueryReq.class));
return resp;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static String sortFieldsAndPrint(Object obj) throws IllegalAccessException {
StringBuffer sb = new StringBuffer();
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
// 按字段名称排序
Arrays.sort(fields, Comparator.comparing(Field::getName));
for (Field field : fields) {
// 可能需要设置访问权限
field.setAccessible(true);
if ("sign".equals(field.getName())) {
continue;
}
Object value = field.get(obj);
StringBuffer param = new StringBuffer();
param.append(field.getName());
param.append("=");
if (value instanceof String) {
param.append(value);
} else if (value instanceof Integer) {
param.append(value);
} else if (value instanceof Long) {
param.append(value);
}
param.append("&");
sb.append(param);
}
return sb.toString();
}
public static LinkedHashMap<String, Object> sortFields(Object obj) throws IllegalAccessException {
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
// 按字段名称排序
Arrays.sort(fields, Comparator.comparing(Field::getName));
for (Field field : fields) {
// 可能需要设置访问权限
field.setAccessible(true);
Object value = field.get(obj);
if(value==null){
continue;
}
map.put(field.getName(), value);
}
return map;
}
public static void main(String[] args) {
// mainScan("https://paymentapi.sxczgkj.cn","6639fdc9fdf6f35856a23b3c", "测试支付", "测试支付", 1L, "wx212769170d2c6b2a", "131112206836873461", "CZ".concat(String.valueOf(System.currentTimeMillis())), "S2405103298", "https://", "fEu7tJgqaoPCA5QevafnSHfqHtO7rWcvhyfA0ltuab7rbpgOlab7CFCmqxMIbssUvbOnFKLdQqW5xUvhzb7FoxJNMAkIf2KDzlgDl6Diw1oBq56agSAFHhgYr3bLxXXI");
}
}

View File

@ -1,3 +1,5 @@
server:
port: 9888
spring:
datasource:
url: jdbc:mysql://rm-bp1b572nblln4jho2po.mysql.rds.aliyuncs.com/fycashier?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false

View File

@ -1,5 +1,5 @@
server:
# port: 9889
port: 9889
servlet:
context-path: /cashierService/
wx:
@ -51,7 +51,8 @@ logging:
aliyun:
keyid: LTAI5tPdEfYSZcqHbjCrtPRD
keysecret: DZjyHBq3nTujF0NMLxnZgsecU8ZCvy
oss:
bucketname: cashier-oss
endpoint: oss-cn-beijing.aliyuncs.com
thirdPay:
payType: fushangtong
callBack: https://cashierclient.sxczgkj.cn/cashier-client/notify/notifyPay
url: https://paymentapi.sxczgkj.cn