Procházet zdrojové kódy

fixed h5支付功能

fushengqian před 1 rokem
rodič
revize
a107142a44

+ 1 - 0
fuint-application/src/main/java/com/fuint/common/config/WebConfig.java

@@ -67,6 +67,7 @@ public class WebConfig extends WebMvcConfigurationSupport {
                 .excludePathPatterns("/clientApi/captcha/**")
                 .excludePathPatterns("/backendApi/captcha/**")
                 .excludePathPatterns("/backendApi/userCoupon/exportList")
+                .excludePathPatterns("/backendApi/genCode/**")
                 .excludePathPatterns("/backendApi/login/**");
 
         // 客户端拦截

+ 3 - 0
fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java

@@ -69,4 +69,7 @@ public class SettlementParam implements Serializable {
     @ApiModelProperty(value="订单ID", name="orderId")
     private Integer orderId;
 
+    @ApiModelProperty(value="是否微信客户端", name="isWechat")
+    private String isWechat;
+
 }

+ 2 - 1
fuint-application/src/main/java/com/fuint/common/service/PaymentService.java

@@ -26,9 +26,10 @@ public interface PaymentService {
      * @param giveAmount 赠送金额
      * @param ip 支付IP地址
      * @param platform 支付平台
+     * @param isWechat 是否微信客户端
      * @return
      * */
-    ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException;
+    ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException;
 
     /**
      * 支付回调

+ 2 - 1
fuint-application/src/main/java/com/fuint/common/service/WeixinService.java

@@ -38,9 +38,10 @@ public interface WeixinService {
      * @param giveAmount 赠送金额
      * @param ip 支付发起IP
      * @param platform 支付平台
+     * @param isWechat 是否微信客户端
      * @return
      * */
-    ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException;
+    ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException;
 
     /**
      * 处理返回的xml数据

+ 2 - 2
fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java

@@ -592,7 +592,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
         Integer storeId = request.getHeader("storeId") == null ? 0 : Integer.parseInt(request.getHeader("storeId"));
         String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
         String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
-
+        String isWechat = param.getIsWechat() == null ? YesOrNoEnum.NO.getKey() : param.getIsWechat();
         String cartIds = param.getCartIds() == null ? "" : param.getCartIds();
         Integer targetId = param.getTargetId() == null ? 0 : Integer.parseInt(param.getTargetId()); // 储值卡、升级等级必填
         String selectNum = param.getSelectNum() == null ? "" : param.getSelectNum(); // 储值卡必填
@@ -949,7 +949,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
                 if ((payType.equals(PayTypeEnum.MICROPAY.getKey()) || payType.equals(PayTypeEnum.ALISCAN.getKey())) && StringUtil.isEmpty(authCode)) {
                     paymentInfo = new ResponseObject(200, "请求成功", new HashMap<>());
                 } else {
-                    paymentInfo = paymentService.createPrepayOrder(userInfo, orderInfo, (wxPayAmount.intValue()), authCode, 0, ip, platform);
+                    paymentInfo = paymentService.createPrepayOrder(userInfo, orderInfo, (wxPayAmount.intValue()), authCode, 0, ip, platform, isWechat);
                 }
                 if (paymentInfo.getData() == null) {
                     errorMessage = StringUtil.isNotEmpty(paymentInfo.getMessage()) ? paymentInfo.getMessage() : PropertiesUtil.getResponseErrorMessageByCode(3000);

+ 5 - 3
fuint-application/src/main/java/com/fuint/common/service/impl/PaymentServiceImpl.java

@@ -81,10 +81,11 @@ public class PaymentServiceImpl implements PaymentService {
      * @param giveAmount 赠送金额
      * @param ip 支付IP地址
      * @param platform 支付平台
+     * @param isWechat 是否微信客户端
      * @return
      * */
     @Override
-    public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException {
+    public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException {
         logger.info("PaymentService createPrepayOrder inParams userInfo={} payAmount={} giveAmount={} goodsInfo={}", userInfo, payAmount, giveAmount, orderInfo);
 
         ResponseObject responseObject;
@@ -93,7 +94,7 @@ public class PaymentServiceImpl implements PaymentService {
             responseObject = alipayService.createPrepayOrder(userInfo, orderInfo, payAmount, authCode, giveAmount, ip, platform);
         } else {
             // 微信支付
-            responseObject = weixinService.createPrepayOrder(userInfo, orderInfo, payAmount, authCode, giveAmount, ip, platform);
+            responseObject = weixinService.createPrepayOrder(userInfo, orderInfo, payAmount, authCode, giveAmount, ip, platform, isWechat);
         }
 
         logger.info("PaymentService createPrepayOrder outParams {}", responseObject.toString());
@@ -170,6 +171,7 @@ public class PaymentServiceImpl implements PaymentService {
     public Map<String, Object> doPay(HttpServletRequest request) throws BusinessCheckException {
         String token = request.getHeader("Access-Token");
         String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
+        String isWechat = request.getHeader("isWechat") == null ? "" : request.getHeader("isWechat");
         String payType = request.getParameter("payType") == null ? PayTypeEnum.JSAPI.getKey() : request.getParameter("payType");
         String cashierPayAmount = request.getParameter("cashierPayAmount") == null ? "" : request.getParameter("cashierPayAmount"); // 收银台实付金额
         String cashierDiscountAmount = request.getParameter("cashierDiscountAmount") == null ? "" : request.getParameter("cashierDiscountAmount"); // 收银台优惠金额
@@ -263,7 +265,7 @@ public class PaymentServiceImpl implements PaymentService {
             String ip = CommonUtil.getIPFromHttpRequest(request);
             BigDecimal pay = realPayAmount.multiply(new BigDecimal("100"));
             orderInfo.setPayType(payType);
-            ResponseObject paymentInfo = createPrepayOrder(mtUser, orderInfo, (pay.intValue()), authCode, 0, ip, platform);
+            ResponseObject paymentInfo = createPrepayOrder(mtUser, orderInfo, (pay.intValue()), authCode, 0, ip, platform, isWechat);
             if (paymentInfo.getData() == null) {
                 throw new BusinessCheckException("抱歉,支付失败");
             }

+ 72 - 3
fuint-application/src/main/java/com/fuint/common/service/impl/WeixinServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONArray;
 import com.aliyun.oss.OSS;
+import com.fuint.common.bean.H5SceneInfo;
 import com.fuint.common.bean.WxPayBean;
 import com.fuint.common.dto.OrderDto;
 import com.fuint.common.dto.UserOrderDto;
@@ -18,6 +19,7 @@ import com.fuint.repository.model.*;
 import com.fuint.utils.QRCodeUtil;
 import com.fuint.utils.StringUtil;
 import com.ijpay.core.enums.SignType;
+import com.ijpay.core.enums.TradeType;
 import com.ijpay.core.kit.HttpKit;
 import com.ijpay.core.kit.WxPayKit;
 import com.ijpay.wxpay.WxPayApi;
@@ -158,12 +160,13 @@ public class WeixinServiceImpl implements WeixinService {
      * @param giveAmount 赠送金额
      * @param ip 支付IP
      * @param platform 支付平台
+     * @param isWechat 是否微信客户端
      * @throws BusinessCheckException
      * @return
      * */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException {
+    public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException {
         logger.info("WeixinService createPrepayOrder inParams userInfo={} payAmount={} giveAmount={} goodsInfo={}", userInfo, payAmount, giveAmount, orderInfo);
 
         String goodsInfo = orderInfo.getOrderSn();
@@ -203,11 +206,15 @@ public class WeixinServiceImpl implements WeixinService {
         if (reqData.get("auth_code") != null && StringUtil.isNotEmpty(reqData.get("auth_code"))) {
             respData = microPay(orderInfo.getStoreId(), reqData, ip, platform);
         } else {
-            respData = jsapiPay(orderInfo.getStoreId(), reqData, ip, platform);
+            if (platform.equals(PlatformTypeEnum.H5.getCode()) && isWechat.equals(YesOrNoEnum.NO.getKey())) {
+                respData = wapPay(orderInfo.getStoreId(), reqData, ip, platform);
+            } else {
+                respData = jsapiPay(orderInfo.getStoreId(), reqData, ip, platform);
+            }
         }
         logger.info("微信支付接口调用返回:{}", JsonUtil.toJSONString(respData));
 
-        if (respData == null) {
+        if (respData == null || respData.get("return_code").equals("FAIL")) {
             logger.error("微信支付接口调用异常......");
             return new ResponseObject(3000, "微信支付接口调用异常", null);
         }
@@ -705,6 +712,68 @@ public class WeixinServiceImpl implements WeixinService {
         return null;
     }
 
+    /**
+     * h5支付
+     *
+     * @param storeId 店铺ID
+     * @param reqData 请求参数
+     * @param ip 支付IP
+     * @param platform 支付平台
+     * @return
+     * */
+    private Map<String, String> wapPay(Integer storeId, Map<String, String> reqData, String ip, String platform) {
+        try {
+            logger.info("调用微信h5支付下单接口入参{}", JsonUtil.toJSONString(reqData));
+            logger.info("请求平台:{}", platform);
+            // 支付配置
+            getApiConfig(storeId, platform);
+            WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
+            H5SceneInfo sceneInfo = new H5SceneInfo();
+            H5SceneInfo.H5 h5Info = new H5SceneInfo.H5();
+            h5Info.setType("Wap");
+            // 支付域名必须在商户平台->"产品中心"->"开发配置"中添加
+            h5Info.setWap_url(wxPayApiConfig.getDomain());
+            h5Info.setWap_name("WEB");
+            sceneInfo.setH5Info(h5Info);
+            Map<String, String> params = UnifiedOrderModel
+                    .builder()
+                    .appid(wxPayApiConfig.getAppId())
+                    .mch_id(wxPayApiConfig.getMchId())
+                    .nonce_str(WxPayKit.generateStr())
+                    .body(reqData.get("body"))
+                    .attach(reqData.get("body"))
+                    .out_trade_no(WxPayKit.generateStr())
+                    .total_fee(reqData.get("total_fee"))
+                    .spbill_create_ip(ip)
+                    .notify_url(wxPayApiConfig.getDomain() + CALL_BACK_URL)
+                    .trade_type(TradeType.MWEB.getTradeType())
+                    .scene_info(JSON.toJSONString(sceneInfo))
+                    .build()
+                    .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+
+            String xmlResult = WxPayApi.pushOrder(false, params);
+            logger.info("调用微信h5支付接口返回xml:{}", xmlResult);
+
+            Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
+
+            String return_code = result.get("return_code");
+            String return_msg = result.get("return_msg");
+            if (!WxPayKit.codeIsOk(return_code)) {
+                throw new RuntimeException(return_msg);
+            }
+            String result_code = result.get("result_code");
+            if (!WxPayKit.codeIsOk(result_code)) {
+                throw new RuntimeException(return_msg);
+            }
+            result.put("backUrl", env.getProperty("website.url"));
+            logger.info("调用微信h5支付接口返回{}", JsonUtil.toJSONString(result));
+            return result;
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
     /**
      * 发起售后
      *

+ 1 - 1
fuint-application/src/main/java/com/fuint/common/web/CORSFilter.java

@@ -23,7 +23,7 @@ public class CORSFilter extends OncePerRequestFilter {
         response.setHeader("Access-Control-Allow-Credentials", "true");
         response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
         response.setHeader("Access-Control-Max-Age", "3600");
-        response.setHeader("Access-Control-Allow-Headers", "Authorization,Origin,X-Requested-With,token,Content-Type,Accept,Access-Token,platform,latitude,longitude,storeId,merchantNo");
+        response.setHeader("Access-Control-Allow-Headers", "Authorization,Origin,X-Requested-With,token,Content-Type,Accept,Access-Token,platform,latitude,longitude,storeId,merchantNo,isWechat");
         filterChain.doFilter(request, response);
     }
 

+ 2 - 1
fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientBalanceController.java

@@ -133,6 +133,7 @@ public class ClientBalanceController extends BaseController {
     public ResponseObject doRecharge(HttpServletRequest request, @RequestBody RechargeParam rechargeParam) throws BusinessCheckException {
         Integer storeId = request.getHeader("storeId") == null ? 0 : Integer.parseInt(request.getHeader("storeId"));
         String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
+        String isWechat = request.getHeader("isWechat") == null ? "" : request.getHeader("isWechat");
         String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
 
         String token = request.getHeader("Access-Token");
@@ -206,7 +207,7 @@ public class ClientBalanceController extends BaseController {
         String ip = CommonUtil.getIPFromHttpRequest(request);
         BigDecimal pay = amount.multiply(new BigDecimal("100"));
         orderInfo.setPayType(PayTypeEnum.JSAPI.getKey());
-        ResponseObject paymentInfo = paymentService.createPrepayOrder(mtUser, orderInfo, (pay.intValue()), "", 0, ip, platform);
+        ResponseObject paymentInfo = paymentService.createPrepayOrder(mtUser, orderInfo, (pay.intValue()), "", 0, ip, platform, isWechat);
         if (paymentInfo.getData() == null) {
             return getFailureResult(201, "抱歉,发起支付失败");
         }

+ 3 - 7
fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientPayController.java

@@ -159,13 +159,9 @@ public class ClientPayController extends BaseController {
     @ApiOperation(value = "发起支付")
     @RequestMapping(value = "/doPay", method = RequestMethod.GET)
     @CrossOrigin
-    public ResponseObject doPay(HttpServletRequest request) {
-        try {
-            Map<String, Object> result = paymentService.doPay(request);
-            return getSuccessResult(result);
-        } catch (BusinessCheckException e) {
-            return getFailureResult(201, e.getMessage() == null ? "订单支付出错" : e.getMessage());
-        }
+    public ResponseObject doPay(HttpServletRequest request) throws BusinessCheckException {
+       Map<String, Object> result = paymentService.doPay(request);
+       return getSuccessResult(result);
     }
 
     /**

+ 3 - 0
fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientSettlementController.java

@@ -1,5 +1,6 @@
 package com.fuint.module.clientApi.controller;
 
+import com.fuint.common.enums.YesOrNoEnum;
 import com.fuint.common.param.SettlementParam;
 import com.fuint.common.service.OrderService;
 import com.fuint.framework.exception.BusinessCheckException;
@@ -36,6 +37,8 @@ public class ClientSettlementController extends BaseController {
     @RequestMapping(value = "/submit", method = RequestMethod.POST)
     @CrossOrigin
     public ResponseObject submit(HttpServletRequest request, @RequestBody SettlementParam param) throws BusinessCheckException {
+        String isWechat = request.getHeader("isWechat") == null ? YesOrNoEnum.NO.getKey() : request.getHeader("isWechat");
+        param.setIsWechat(isWechat);
         Map<String, Object> result = orderService.doSettle(request, param);
         return getSuccessResult(result);
     }