package com.tendbird.bzserver.pay.service; import com.alibaba.fastjson.JSONObject; import com.tendbird.bzserver.pay.domain.PayConfig; import com.tendbird.bzserver.pay.domain.PayOrder; import com.tendbird.bzserver.pay.mapper.PayConfigMapper; import com.tendbird.bzserver.pay.mapper.PayOrderMapper; import com.tendpay.sdk.Tendpay; import com.tendpay.sdk.TendpayClient; import com.tendpay.sdk.exception.PayException; import com.tendpay.sdk.model.PayOrderCreateReqModel; import com.tendpay.sdk.model.PayOrderQueryReqModel; import com.tendpay.sdk.model.RefundOrderCreateReqModel; import com.tendpay.sdk.model.RefundOrderQueryReqModel; import com.tendpay.sdk.request.PayOrderCreateRequest; import com.tendpay.sdk.request.PayOrderQueryRequest; import com.tendpay.sdk.request.RefundOrderCreateRequest; import com.tendpay.sdk.request.RefundOrderQueryRequest; import com.tendpay.sdk.response.PayOrderCreateResponse; import com.tendpay.sdk.response.PayOrderQueryResponse; import com.tendpay.sdk.response.RefundOrderCreateResponse; import com.tendpay.sdk.response.RefundOrderQueryResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import java.util.Date; @Slf4j @Service public class PayService { @Autowired private PayOrderMapper payOrderMapper; @Autowired private PayConfigMapper payConfigMapper; private int maxQueryRetry = 6; public PayConfig initApiKey(String appId) throws Exception { // Tendpay.setApiBase("https://www.tendpay.net/pay"); // Tendpay.apiKey = "eIFRw9vx8zDAJ5yA4WvLA3VfK0iWeueYNNvsNwVOv4TJfCMAzHMJRNwu1i9hS1pSNrAMnFyqetTcch1Yqw7x8STvHVl52pzpZCV6ouBGhEvNktmpQgpGFBeIoBEv8mVc"; // Tendpay.mchNo = "M1667280330"; // Tendpay.appId = "637e25b3e4b0ec03530a05f1"; PayConfig payConfig = payConfigMapper.findByappId(appId); if (ObjectUtils.isEmpty(payConfig)) { throw new Exception("获取支付参数错误!"); } Tendpay.setApiBase(payConfig.getApiUrl()); Tendpay.apiKey = payConfig.getApiKey(); Tendpay.mchNo = payConfig.getMchNo(); Tendpay.appId = payConfig.getAppid(); return payConfig; } public PayOrderQueryResponse doTradePay(PayOrder payOrder) throws Exception { PayOrder newPayOrder = payOrderMapper.findByorderNo(payOrder.getMchOrderNo()); if (ObjectUtils.isEmpty(newPayOrder)) { //保存单据 payOrder.setPayTime(new Date()); payOrder.setStatus("0"); payOrderMapper.save(payOrder); } else { //判断状态,是否发起重新支付 if (!newPayOrder.getStatus().equals("成功")) { payOrder.setPayTime(new Date()); payOrder.setStatus("0"); payOrderMapper.update(payOrder); } } return doTradePaying(payOrder); } public RefundOrderQueryResponse doTradePayRefund(PayOrder payOrder) throws Exception { PayOrder newPayOrder = payOrderMapper.findByorderNo(payOrder.getMchOrderNo()); if (ObjectUtils.isEmpty(newPayOrder)) { //保存单据 payOrder.setPayTime(new Date()); payOrder.setStatus("0"); payOrderMapper.save(payOrder); } else { //判断状态,是否发起重新支付 if (!payOrder.getStatus().equals("成功")) { payOrder.setPayTime(new Date()); payOrder.setStatus("0"); payOrderMapper.update(payOrder); } } return doTradePayRefunding(payOrder); } public PayOrderQueryResponse doTradePaying(PayOrder payOrder) throws Exception { PayConfig payConfig = initApiKey(payOrder.getAppId()); System.out.println(Tendpay.apiKey); System.out.println(Tendpay.appId); System.out.println(Tendpay.mchNo); System.out.println(Tendpay.getApiBase()); TendpayClient tendpayClient = TendpayClient.getInstance(Tendpay.appId, Tendpay.apiKey, Tendpay.getApiBase()); // String wayCode = "WX_LITE"; // 支付方式 PayOrderCreateRequest request = new PayOrderCreateRequest(); PayOrderCreateReqModel model = new PayOrderCreateReqModel(); model.setMchNo(Tendpay.mchNo); // 商户号 model.setAppId(tendpayClient.getAppId()); // 应用ID model.setMchOrderNo(payOrder.getMchOrderNo()); // 商户订单号 model.setWayCode(payOrder.getWayCode()); // 支付方式 model.setAmount(payOrder.getAmount()); // 金额,单位分 model.setCurrency(payOrder.getCurrency()); // 币种,目前只支持cny model.setClientIp("192.166.1.132"); // 发起支付请求客户端的IP地址 model.setSubject(payOrder.getSubject()); // 商品标题 model.setBody(payOrder.getBody()); // 商品描述 model.setNotifyUrl(payConfig.getNotifyUrl()); // 异步通知地址 model.setReturnUrl(payConfig.getReturnUrl()); // 前端跳转地址 model.setChannelExtra(channelExtra(payOrder.getWayCode(), payOrder.getAuthCode())); // 渠道扩展参数 model.setExtParam(payOrder.getExtParam()); // 商户扩展参数,回调时原样返回 request.setBizModel(model); try { PayOrderCreateResponse response = tendpayClient.execute(request); log.info("验签结果:{}", response.checkSign(Tendpay.apiKey)); System.out.println(response); // 下单成功 if (response.isSuccess(Tendpay.apiKey)) { String payOrderId = response.get().getPayOrderId(); String mchOrderNo = response.get().getMchOrderNo(); log.info("payOrderId:{}", payOrderId); log.info("mchOrderNo:{}", response.get().getMchOrderNo()); PayOrderQueryResponse queryResponse = doTradePayQuerying(mchOrderNo); if (queryResponse != null) { return queryResponse; } } else { log.info("下单失败:{}", payOrder.getMchOrderNo()); log.info("通道错误码:{}", response.get().getErrCode()); log.info("通道错误信息:{}", response.get().getErrMsg()); return null; } } catch (PayException e) { log.error(e.getMessage()); throw new Exception(e.getMessage()); } catch (Exception e) { log.error(e.getMessage()); throw new Exception(e.getMessage()); } return null; } public PayOrderQueryResponse doTradePayQuerying(String orderNo) throws Exception { for (int i = 0; i < maxQueryRetry; i++) { Thread.sleep(5000); PayOrderQueryResponse response = doTradePayQuery(orderNo); if (!ObjectUtils.isEmpty(response)) { return response; } } return null; } public PayOrderQueryResponse doTradePayQuery(String orderNo) throws Exception { TendpayClient tendpayClient = TendpayClient.getInstance(Tendpay.appId, Tendpay.apiKey, Tendpay.getApiBase()); PayOrderQueryRequest request = new PayOrderQueryRequest(); PayOrderQueryReqModel model = new PayOrderQueryReqModel(); model.setMchNo(Tendpay.mchNo); // 商户号 model.setAppId(tendpayClient.getAppId()); // 应用ID //model.setPayOrderId("P202106181104177050002"); // 支付订单号 model.setMchOrderNo(orderNo); //商户订单号 request.setBizModel(model); try { PayOrderQueryResponse response = tendpayClient.execute(request); log.info("验签结果:{}", response.checkSign(Tendpay.apiKey)); if (response.isSuccess(Tendpay.apiKey)) { log.info("订单信息:{}", response); log.info("金额:{}", response.get().getAmount()); return response; } else { return null; } } catch (PayException e) { log.error(e.getMessage()); throw new Exception(e.getMessage()); } } public RefundOrderQueryResponse doTradePayRefunding(PayOrder payOrder) throws Exception { PayConfig payConfig = initApiKey(payOrder.getAppId()); TendpayClient tendpayClient = TendpayClient.getInstance(Tendpay.appId, Tendpay.apiKey, Tendpay.getApiBase()); RefundOrderCreateRequest request = new RefundOrderCreateRequest(); RefundOrderCreateReqModel model = new RefundOrderCreateReqModel(); model.setMchNo(Tendpay.mchNo); // 商户号 model.setAppId(tendpayClient.getAppId()); // 应用ID model.setMchOrderNo(payOrder.getAuthCode()); // 商户支付单号(与支付订单号二者传一) //model.setPayOrderId("P202106181104177050002"); // 支付订单号(与商户支付单号二者传一) model.setMchRefundNo(payOrder.getMchOrderNo()); // 商户退款单号 model.setRefundAmount(payOrder.getAmount()); // 退款金额,单位分 model.setCurrency(payOrder.getCurrency()); // 币种,目前只支持cny model.setClientIp("192.166.1.132"); // 发起支付请求客户端的IP地址 model.setRefundReason(payOrder.getReason()); // 退款原因 model.setNotifyUrl(payConfig.getNotifyUrl()); // 异步通知地址 model.setChannelExtra(payOrder.getChannelExtra()); // 渠道扩展参数 model.setExtParam(payOrder.getExtParam()); // 商户扩展参数,回调时原样返回 request.setBizModel(model); try { log.info("验签结果:{}", request.getBizModel()); RefundOrderCreateResponse response = tendpayClient.execute(request); log.info("验签结果:{}", response); log.info("验签结果:{}", response.checkSign(Tendpay.apiKey)); // 判断退款发起是否成功(并不代表退款成功) if (response.isSuccess(Tendpay.apiKey)) { String refundOrderId = response.get().getRefundOrderId(); String mchRefundNo = response.get().getMchRefundNo(); log.info("refundOrderId:{}", refundOrderId); log.info("mchRefundNo:{}", response.get().getMchRefundNo()); RefundOrderQueryResponse queryResponse = doRefundPayQuerying(mchRefundNo); if (queryResponse != null) { return queryResponse; } } else { log.info("下单失败:refundOrderNo={}, msg={}", payOrder.getMchOrderNo(), response.getMsg()); log.info("通道错误码:{}", response.get().getErrCode()); log.info("通道错误信息:{}", response.get().getErrMsg()); } } catch (PayException e) { log.error(e.getMessage()); throw new Exception(e.getMessage()); } return null; } public RefundOrderQueryResponse doRefundPayQuerying(String orderNo) throws Exception { int maxQueryRetry = 6; for (int i = 0; i < maxQueryRetry; i++) { Thread.sleep(5000); RefundOrderQueryResponse response = doRefundPayQuery(orderNo); if (response != null) { return response; } } return null; } public RefundOrderQueryResponse doRefundPayQuery(String orderNo) throws Exception { TendpayClient tendpayClient = TendpayClient.getInstance(Tendpay.appId, Tendpay.apiKey, Tendpay.getApiBase()); RefundOrderQueryRequest request = new RefundOrderQueryRequest(); RefundOrderQueryReqModel model = new RefundOrderQueryReqModel(); model.setMchNo(Tendpay.mchNo); // 商户号 model.setAppId(tendpayClient.getAppId()); // 应用ID //model.setRefundOrderId("P202106181105527690009"); // 退款单号 model.setMchRefundNo(orderNo); //商户退款单号 request.setBizModel(model); try { RefundOrderQueryResponse response = tendpayClient.execute(request); log.info("验签结果:{}", response.checkSign(Tendpay.apiKey)); if (response.isSuccess(Tendpay.apiKey)) { log.info("订单信息:{}", response); log.info("退款状态:{}", response.get().getState()); log.info("退款金额:{}", response.get().getRefundAmount()); return response; } } catch (PayException e) { e.printStackTrace(); throw new Exception(e.getMessage()); } return null; } private String channelExtra(String wayCode, String data) { if ("WX_LITE".equals(wayCode)) return wxJsapiExtra(data); if ("WX_JSAPI".equals(wayCode)) return wxJsapiExtra(data); if ("WX_BAR".equals(wayCode)) return wxBarExtra(data); if ("ALI_BAR".equals(wayCode)) return aliBarExtra(data); if ("YSF_BAR".equals(wayCode)) return ysfBarExtra(data); if ("UPACP_BAR".equals(wayCode)) return upacpBarExtra(data); if ("QR_CASHIER".equals(wayCode)) return qrCashierExtra(data); if ("AUTO_BAR".equals(wayCode)) return autoBarExtra(data); if ("PP_PC".equals(wayCode)) return ppExtra(data); //if("SAND_H5".equals(wayCode)) return sandH5Extra(); return ""; } private String wxJsapiExtra(String data) { JSONObject obj = new JSONObject(); obj.put("openId", data); return obj.toString(); } private String wxBarExtra(String data) { JSONObject obj = new JSONObject(); obj.put("authCode", data); return obj.toString(); } private String aliBarExtra(String data) { JSONObject obj = new JSONObject(); obj.put("authCode", data); return obj.toString(); } private String ysfBarExtra(String data) { JSONObject obj = new JSONObject(); obj.put("authCode", data); return obj.toString(); } private String upacpBarExtra(String data) { JSONObject obj = new JSONObject(); obj.put("authCode", data); return obj.toString(); } private String qrCashierExtra(String data) { JSONObject obj = new JSONObject(); obj.put("payDataType", data); return obj.toString(); } private String autoBarExtra(String data) { JSONObject obj = new JSONObject(); obj.put("authCode", data); return obj.toString(); } private String ppExtra(String data) { JSONObject obj = new JSONObject(); obj.put("cancelUrl", data); return obj.toString(); } }