|
@@ -170,6 +170,8 @@ public class PayServiceImpl implements IPayService {
|
|
|
|
|
|
@Override
|
|
|
public AppPayRespVO appPay(PayOrderAppDTO payOrderAppDTO) {
|
|
|
+ OrderPayInfo orderPayInfo = orderPayInfoService.createOrderPayInfo(payOrderAppDTO.getOrderNo(), payOrderAppDTO.getPayAmount(), payOrderAppDTO.getPayType());
|
|
|
+ payOrderAppDTO.setOrderNo(orderPayInfo.getPayOrderNo());
|
|
|
switch (EnumUtils.getEnumByType(payOrderAppDTO.getPayType(), PayType.class)) {
|
|
|
case WECHAT: {
|
|
|
if ("APP".equals(payOrderAppDTO.getPlatform())) {
|
|
@@ -188,6 +190,63 @@ public class PayServiceImpl implements IPayService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public PayResponseDTO faceToFacePay(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO) {
|
|
|
+ if (payOrderFaceToFaceDTO.getExpireTime() == null) {
|
|
|
+ throw new ServiceException("支付缺少过期时间");
|
|
|
+ }
|
|
|
+ PayResponseDTO payResponseDTO = null;
|
|
|
+ switch (EnumUtils.getEnumByType(payOrderFaceToFaceDTO.getPayType(), PayType.class)) {
|
|
|
+ case WECHAT: {
|
|
|
+ payResponseDTO = wechatPayService.facePay(payOrderFaceToFaceDTO);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case ALIPAY: {
|
|
|
+ payResponseDTO = aliPayService.facePay(payOrderFaceToFaceDTO);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ payResponseDTO = PayResponseDTO.payError("支付方式不能为空");
|
|
|
+ }
|
|
|
+ return payResponseDTO;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PayResponseDTO orderPayQuery(OrderPayInfo orderPayInfo) {
|
|
|
+ PayResponseDTO payResponseDTO = null;
|
|
|
+ switch (EnumUtils.getEnumByType(orderPayInfo.getPayType(), PayType.class)) {
|
|
|
+ case WECHAT: {
|
|
|
+ payResponseDTO = wechatPayService.orderPayQuery(orderPayInfo.getPayOrderNo());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case ALIPAY: {
|
|
|
+ payResponseDTO = aliPayService.orderPayQuery(orderPayInfo.getPayOrderNo());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ payResponseDTO = PayResponseDTO.payWait(orderPayInfo.getPayOrderNo());
|
|
|
+ }
|
|
|
+ return payResponseDTO;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public RefundResponseDTO orderRefundQuery(PayRefundDTO payRefundDTO) {
|
|
|
+ RefundResponseDTO refundResponseDTO = null;
|
|
|
+ switch (EnumUtils.getEnumByType(payRefundDTO.getPayType(), PayType.class)) {
|
|
|
+ case WECHAT: {
|
|
|
+ refundResponseDTO = wechatPayService.orderRefundQuery(payRefundDTO.getOutRequestNo());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case ALIPAY: {
|
|
|
+ refundResponseDTO = RefundResponseDTO.refundSuccess(payRefundDTO.getOutRequestNo(), payRefundDTO.getOutRequestNo());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ refundResponseDTO = RefundResponseDTO.refundError("支付方式不能为空");
|
|
|
+ }
|
|
|
+ return refundResponseDTO;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 退款
|
|
|
*
|
|
@@ -362,211 +421,6 @@ public class PayServiceImpl implements IPayService {
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
- //</editor-folder>
|
|
|
-
|
|
|
- //<editor-folder desc="付款码支付">
|
|
|
- @Override
|
|
|
- public PayResponseDTO faceToFacePay(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO) {
|
|
|
- if (payOrderFaceToFaceDTO.getExpireTime() == null) {
|
|
|
- throw new ServiceException("支付缺少过期时间");
|
|
|
- }
|
|
|
- PayResponseDTO payResponseDTO = null;
|
|
|
- switch (EnumUtils.getEnumByType(payOrderFaceToFaceDTO.getPayType(), PayType.class)) {
|
|
|
- case WECHAT: {
|
|
|
- payResponseDTO = wechatPayService.facePay(payOrderFaceToFaceDTO);
|
|
|
- break;
|
|
|
- }
|
|
|
- case ALIPAY: {
|
|
|
- payResponseDTO = aliPayService.facePay(payOrderFaceToFaceDTO);
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- payResponseDTO = PayResponseDTO.payError("支付方式不能为空");
|
|
|
- }
|
|
|
- return payResponseDTO;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public PayResponseDTO orderPayQuery(OrderPayInfo orderPayInfo) {
|
|
|
- PayResponseDTO payResponseDTO = null;
|
|
|
- switch (EnumUtils.getEnumByType(orderPayInfo.getPayType(), PayType.class)) {
|
|
|
- case WECHAT: {
|
|
|
- payResponseDTO = wechatPayService.orderPayQuery(orderPayInfo.getPayOrderNo());
|
|
|
- break;
|
|
|
- }
|
|
|
- case ALIPAY: {
|
|
|
- payResponseDTO = aliPayService.orderPayQuery(orderPayInfo.getPayOrderNo());
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- payResponseDTO = PayResponseDTO.payWait(orderPayInfo.getPayOrderNo());
|
|
|
- }
|
|
|
- return payResponseDTO;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public RefundResponseDTO orderRefundQuery(PayRefundDTO payRefundDTO) {
|
|
|
- RefundResponseDTO refundResponseDTO = null;
|
|
|
- switch (EnumUtils.getEnumByType(payRefundDTO.getPayType(), PayType.class)) {
|
|
|
- case WECHAT: {
|
|
|
- refundResponseDTO = wechatPayService.orderRefundQuery(payRefundDTO.getOutRequestNo());
|
|
|
- break;
|
|
|
- }
|
|
|
- case ALIPAY: {
|
|
|
- refundResponseDTO = RefundResponseDTO.refundSuccess(payRefundDTO.getOutRequestNo(), payRefundDTO.getOutRequestNo());
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- refundResponseDTO = RefundResponseDTO.refundError("支付方式不能为空");
|
|
|
- }
|
|
|
- return refundResponseDTO;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- private void alipayFaceToFacePay(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO) {
|
|
|
-// Configs.init();
|
|
|
-
|
|
|
- DefaultAlipayClient alipayClient = null;
|
|
|
- try {
|
|
|
- alipayClient = new DefaultAlipayClient(getAlipayConfig());
|
|
|
- } catch (AlipayApiException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- AlipayTradePayRequest request = new AlipayTradePayRequest();
|
|
|
- //异步接收地址,仅支持http/https,公网可访问
|
|
|
- request.setNotifyUrl(AlipayConfigs.getPayNotifySuccessDomain());
|
|
|
-
|
|
|
- /******必传参数******/
|
|
|
- JSONObject bizContent = new JSONObject();
|
|
|
- //商户订单号,商家自定义,保持唯一性
|
|
|
- bizContent.put("out_trade_no", payOrderFaceToFaceDTO.getOrderNo());
|
|
|
- //支付金额,最小值0.01元
|
|
|
- bizContent.put("total_amount", payOrderFaceToFaceDTO.getPayAmount().setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
|
- //订单标题,不可使用特殊符号
|
|
|
- bizContent.put("subject", payOrderFaceToFaceDTO.getSubjectTitle());
|
|
|
- //1.条码场景:bar_code;2.刷脸场景:security_code
|
|
|
- bizContent.put("scene", "bar_code");
|
|
|
- //根据auth_code_type上传付款码,auth_code_type=bar_code,则填写用户支付宝钱包中的付款码;auth_code_type=security_code,则填写设备刷脸返回的付款码;
|
|
|
- bizContent.put("auth_code", payOrderFaceToFaceDTO.getAuthCode());
|
|
|
-
|
|
|
- /******可选参数******/
|
|
|
- //当面付场景下,当面付快捷版则传 OFFLINE_PAYMENT;其它支付宝当面付产品传 FACE_TO_FACE_PAYMENT;不传则默认使用FACE_TO_FACE_PAYMENT。
|
|
|
- //bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
|
|
|
- //// 商品明细信息
|
|
|
- //JSONArray goodsDetail = new JSONArray();
|
|
|
- //JSONObject goods1 = new JSONObject();
|
|
|
- //goods1.put("goods_id", "goodsNo1");
|
|
|
- //goods1.put("goods_name", "子商品1");
|
|
|
- //goods1.put("quantity", 1);
|
|
|
- //goods1.put("price", 0.01);
|
|
|
- //goodsDetail.add(goods1);
|
|
|
- //bizContent.put("goods_detail", goodsDetail);
|
|
|
-
|
|
|
- //// 扩展信息
|
|
|
- //JSONObject extendParams = new JSONObject();
|
|
|
- //extendParams.put("sys_service_provider_id", "2088511833207846");
|
|
|
- //bizContent.put("extend_params", extendParams);
|
|
|
-
|
|
|
- //// 返回参数选项
|
|
|
- //JSONArray queryOptions = new JSONArray();
|
|
|
- //queryOptions.add("fund_bill_list");
|
|
|
- //queryOptions.add("voucher_detail_list");
|
|
|
- //bizContent.put("query_options", queryOptions);
|
|
|
-
|
|
|
- request.setBizContent(bizContent.toString());
|
|
|
- AlipayTradePayResponse response = null;
|
|
|
- try {
|
|
|
- response = alipayClient.certificateExecute(request);
|
|
|
- } catch (AlipayApiException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- if (!response.isSuccess()) {
|
|
|
- throw new ServiceException("支付请求失败,errorCode:" + response.getCode() + ";errorMsg:"
|
|
|
- + response.getMsg() + ";subCode:" + response.getSubCode() + ";subMsg:" + response.getSubMsg());
|
|
|
- }
|
|
|
-
|
|
|
- log.info("调用成功");
|
|
|
-
|
|
|
- //定时校验订单状态,如果订单已经付款完成,则终止校验,如果超过5分钟,则修改订单状态为已取消
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 支付宝付款码支付
|
|
|
- *
|
|
|
- * @param payOrderFaceToFaceDTO
|
|
|
- * @throws Exception
|
|
|
- */
|
|
|
- private void wxPayFaceToFace(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO) {
|
|
|
- WxPayV2Config config = null;
|
|
|
- try {
|
|
|
- config = new WxPayV2Config();
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- WXPay wxpay = new WXPay(config);
|
|
|
- Map<String, String> map = new HashMap<>(16);
|
|
|
- map.put("attach", "");
|
|
|
- map.put("auth_code", payOrderFaceToFaceDTO.getAuthCode());
|
|
|
- map.put("body", payOrderFaceToFaceDTO.getSubjectTitle());
|
|
|
- map.put("nonce_str", WXPayUtil.generateNonceStr());
|
|
|
- map.put("out_trade_no", payOrderFaceToFaceDTO.getOrderNo());
|
|
|
- map.put("spbill_create_ip", ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getRemoteAddr());
|
|
|
- map.put("total_fee", payOrderFaceToFaceDTO.getPayAmount().multiply(new BigDecimal(100)).intValue() + "");
|
|
|
- //生成签名
|
|
|
- String sign = null;
|
|
|
- try {
|
|
|
- sign = WXPayUtil.generateSignature(map, config.getKey());
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- throw new ServiceException("微信签名生成失败");
|
|
|
- }
|
|
|
- map.put("sign", sign);
|
|
|
- String mapToXml = null;
|
|
|
- try {
|
|
|
- //调用微信的扫码支付接口
|
|
|
- Map<String, String> resp = wxpay.microPay(map);
|
|
|
- mapToXml = WXPayUtil.mapToXml(resp);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.error("微信支付失败" + e);
|
|
|
- }
|
|
|
- //判断支付是否成功
|
|
|
- String return_code = null;
|
|
|
- String return_msg = null;
|
|
|
- String result_code = null;
|
|
|
- String err_code_des = null;
|
|
|
- String err_code = null;
|
|
|
- //获取Document对象(主要是获取支付接口的返回信息)
|
|
|
- Document doc = null;
|
|
|
- try {
|
|
|
- doc = DocumentHelper.parseText(mapToXml);
|
|
|
- } catch (DocumentException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- //获取对象的根节点<xml>
|
|
|
- Element rootElement = doc.getRootElement();
|
|
|
- //获取对象的子节点
|
|
|
- List<Element> elements = rootElement.elements();
|
|
|
- for (Element element : elements) {
|
|
|
- if (element.getName().equals("return_code")) {
|
|
|
- return_code = element.getTextTrim();
|
|
|
- } else if (element.getName().equals("return_msg")) {
|
|
|
- return_msg = element.getTextTrim();
|
|
|
- } else if (element.getName().equals("result_code")) {
|
|
|
- result_code = element.getTextTrim();
|
|
|
- } else if (element.getName().equals("err_code_des")) {
|
|
|
- err_code_des = element.getTextTrim();
|
|
|
- } else if (element.getName().equals("err_code")) {
|
|
|
- err_code = element.getTextTrim();
|
|
|
- }
|
|
|
- }
|
|
|
- if (!WxPayV2Config.PAY_SUCCESS.equals(return_code)) {
|
|
|
- throw new ServiceException("付款码支付失败,return_msg: " + return_msg);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //</editor-folder>
|
|
|
-
|
|
|
private AlipayConfig getAlipayConfig() {
|
|
|
AlipayConfig alipayConfig = new AlipayConfig();
|
|
|
//设置网关地址
|
|
@@ -591,87 +445,5 @@ public class PayServiceImpl implements IPayService {
|
|
|
return alipayConfig;
|
|
|
}
|
|
|
|
|
|
- //<editor-folder desc="app支付相关接口">
|
|
|
- private AppPayRespVO wxXcxPay(PayOrderAppDTO payOrderAppDTO) {
|
|
|
- // 构建service
|
|
|
- JsapiService service = new JsapiService.Builder().config(WxPayConfigs.getConfig()).build();
|
|
|
- // request.setXxx(val)设置所需参数,具体参数可见Request定义
|
|
|
- PrepayRequest request = new PrepayRequest();
|
|
|
- com.wechat.pay.java.service.payments.jsapi.model.Amount amount = new com.wechat.pay.java.service.payments.jsapi.model.Amount();
|
|
|
- amount.setTotal(payOrderAppDTO.getPayAmount().multiply(new BigDecimal(100)).intValue());
|
|
|
- request.setAmount(amount);
|
|
|
- request.setAppid(wxMaProperties.getAppid());
|
|
|
- request.setMchid(WxPayConfigs.getMch_ID());
|
|
|
- request.setDescription(payOrderAppDTO.getSubjectTitle());
|
|
|
- request.setNotifyUrl(WxPayConfigs.getPayNotifyUrl());
|
|
|
- request.setOutTradeNo(payOrderAppDTO.getOrderNo());
|
|
|
- Payer payer = new Payer();
|
|
|
- payer.setOpenid(AuthHolder.openId());
|
|
|
- request.setPayer(payer);
|
|
|
- // 调用下单方法,得到应答
|
|
|
- com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse response = service.prepay(request);
|
|
|
-
|
|
|
- return new AppPayRespVO(response.getPrepayId());
|
|
|
- }
|
|
|
-
|
|
|
- private AppPayRespVO wxAppPay(PayOrderAppDTO payOrderAppDTO) {
|
|
|
- // 构建service
|
|
|
- AppServiceExtension service = new AppServiceExtension.Builder().config(WxPayConfigs.getConfig()).build();
|
|
|
- // request.setXxx(val)设置所需参数,具体参数可见Request定义
|
|
|
- com.wechat.pay.java.service.payments.app.model.PrepayRequest request = new com.wechat.pay.java.service.payments.app.model.PrepayRequest();
|
|
|
- com.wechat.pay.java.service.payments.app.model.Amount amount = new com.wechat.pay.java.service.payments.app.model.Amount();
|
|
|
- amount.setTotal(payOrderAppDTO.getPayAmount().multiply(new BigDecimal(100)).intValue());
|
|
|
- request.setAmount(amount);
|
|
|
- request.setAppid(WxPayConfigs.getAppId());
|
|
|
- request.setMchid(WxPayConfigs.getMch_ID());
|
|
|
- request.setDescription(payOrderAppDTO.getSubjectTitle());
|
|
|
- request.setNotifyUrl(WxPayConfigs.getPayNotifyUrl());
|
|
|
- request.setOutTradeNo(payOrderAppDTO.getOrderNo());
|
|
|
- // 调用下单方法,得到应答
|
|
|
- PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);
|
|
|
- return new AppPayRespVO(response);
|
|
|
- }
|
|
|
-
|
|
|
- private AppPayRespVO alipayAppPay(PayOrderAppDTO payOrderAppDTO) {
|
|
|
- if (payOrderAppDTO.getExpireTime() == null) {
|
|
|
- throw new ServiceException("支付缺少过期时间");
|
|
|
- }
|
|
|
- AlipayClient alipayClient = null;
|
|
|
- try {
|
|
|
- alipayClient = new DefaultAlipayClient(getAlipayConfig());
|
|
|
- } catch (AlipayApiException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
|
|
|
- request.setNotifyUrl(AlipayConfigs.getPayNotifySuccessDomain());
|
|
|
- JSONObject bizContent = new JSONObject();
|
|
|
- bizContent.put("out_trade_no", payOrderAppDTO.getOrderNo());
|
|
|
- bizContent.put("total_amount", payOrderAppDTO.getPayAmount().setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
|
- bizContent.put("subject", payOrderAppDTO.getSubjectTitle());
|
|
|
- bizContent.put("product_code", "QUICK_MSECURITY_PAY");
|
|
|
- if (payOrderAppDTO.getExpireTime() != null) {
|
|
|
- bizContent.put("time_expire", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, payOrderAppDTO.getExpireTime()));
|
|
|
- }
|
|
|
- request.setBizContent(bizContent.toString());
|
|
|
- AlipayTradeAppPayResponse response = null;
|
|
|
- try {
|
|
|
- response = alipayClient.sdkExecute(request);
|
|
|
- } catch (AlipayApiException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
-
|
|
|
- if (!response.isSuccess()) {
|
|
|
- throw new ServiceException("支付请求失败,errorCode:" + response.getCode() + ";errorMsg:"
|
|
|
- + response.getMsg() + ";subCode:" + response.getSubCode() + ";subMsg:" + response.getSubMsg());
|
|
|
- }
|
|
|
-
|
|
|
- log.info("调用成功");
|
|
|
- String orderStr = response.getBody();
|
|
|
-
|
|
|
- //定时校验订单状态,如果订单已经付款完成,则终止校验,如果超过5分钟,则修改订单状态为已取消
|
|
|
- return new AppPayRespVO(orderStr);
|
|
|
- }
|
|
|
- //</editor-folder>
|
|
|
-
|
|
|
|
|
|
}
|