Browse Source

优化代码

java110 4 years ago
parent
commit
775872f097

+ 2 - 0
java110-bean/src/main/java/com/java110/vo/ResultVo.java

@@ -42,6 +42,8 @@ public class ResultVo implements Serializable {
     public static final int DEFAULT_RECORD = 1;
     public static final int DEFAULT_TOTAL = 1;
 
+    public static final int CODE_WAIT_PAY = 41;// 支付未完成
+
     // 分页页数
     private int page;
     // 行数

+ 3 - 0
java110-utils/src/main/java/com/java110/utils/constant/WechatConstant.java

@@ -64,5 +64,8 @@ public class WechatConstant {
     public static final String PAY_NOTIFY_ADAPT = "PAY_NOTIFY_ADAPT";
     public static final String PAY_OWE_FEE_NOTIFY_ADAPT = "PAY_OWE_FEE_NOTIFY_ADAPT";
 
+    public static final String wxMicropayUnifiedOrder="https://api.mch.weixin.qq.com/pay/micropay";
+    public static final String wxOrderQuery="https://api.mch.weixin.qq.com/pay/orderquery";
+
 
 }

+ 6 - 0
pom.xml

@@ -492,6 +492,12 @@
                 <artifactId>aliyun-sdk-oss</artifactId>
                 <version>${oss.aliyun}</version>
             </dependency>
+
+            <dependency>
+                <groupId>com.alipay.sdk</groupId>
+                <artifactId>alipay-sdk-java</artifactId>
+                <version>4.10.111.ALL</version>
+            </dependency>
         </dependencies>
 
     </dependencyManagement>

+ 4 - 1
service-acct/pom.xml

@@ -25,7 +25,10 @@
       <groupId>com.java110</groupId>
       <artifactId>java110-service</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>com.alipay.sdk</groupId>
+      <artifactId>alipay-sdk-java</artifactId>
+    </dependency>
 
   </dependencies>
 

+ 16 - 0
service-acct/src/main/java/com/java110/acct/AcctServiceApplicationStart.java

@@ -1,7 +1,9 @@
 package com.java110.acct;
 
+import com.java110.core.annotation.Java110CmdDiscovery;
 import com.java110.core.annotation.Java110ListenerDiscovery;
 import com.java110.core.client.RestTemplate;
+import com.java110.core.event.cmd.ServiceCmdEventPublishing;
 import com.java110.core.event.service.BusinessServiceDataFlowEventPublishing;
 import com.java110.service.init.ServiceStartInit;
 import org.slf4j.Logger;
@@ -35,6 +37,8 @@ import java.nio.charset.Charset;
 @EnableDiscoveryClient
 @Java110ListenerDiscovery(listenerPublishClass = BusinessServiceDataFlowEventPublishing.class,
         basePackages = {"com.java110.acct.listener"})
+@Java110CmdDiscovery(cmdPublishClass = ServiceCmdEventPublishing.class,
+        basePackages = {"com.java110.acct.cmd"})
 @EnableFeignClients(basePackages = {"com.java110.intf.community","com.java110.intf.common","com.java110.intf.store",
         "com.java110.intf.fee","com.java110.intf.order","com.java110.intf.user"})
 public class AcctServiceApplicationStart {
@@ -66,4 +70,16 @@ public class AcctServiceApplicationStart {
         RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(m).build(RestTemplate.class);
         return restTemplate;
     }
+
+    /**
+     * 实例化RestTemplate,通过@LoadBalanced注解开启均衡负载能力.
+     *
+     * @return restTemplate
+     */
+    @Bean
+    public RestTemplate outRestTemplate() {
+        StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8"));
+        RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(m).build(RestTemplate.class);
+        return restTemplate;
+    }
 }

+ 33 - 0
service-acct/src/main/java/com/java110/acct/cmd/payment/QrCodePaymentCmd.java

@@ -0,0 +1,33 @@
+package com.java110.acct.cmd.payment;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.response.AlipayTradeAppPayResponse;
+import com.java110.core.annotation.Java110Cmd;
+import com.java110.core.context.ICmdDataFlowContext;
+import com.java110.core.event.cmd.AbstractServiceCmdListener;
+import com.java110.core.event.cmd.CmdEvent;
+import com.java110.utils.exception.CmdException;
+
+/**
+ * 扫码付
+ */
+@Java110Cmd(serviceCode = "payment.qrCodePayment")
+public class QrCodePaymentCmd extends AbstractServiceCmdListener {
+
+
+    @Override
+    public void validate(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) {
+
+    }
+
+    @Override
+    public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
+
+    }
+
+}

+ 26 - 0
service-acct/src/main/java/com/java110/acct/smo/IQrCodePaymentSMO.java

@@ -0,0 +1,26 @@
+package com.java110.acct.smo;
+
+import com.java110.vo.ResultVo;
+
+/**
+ * 扫码枪支付
+ */
+public interface IQrCodePaymentSMO {
+
+    /**
+     * 扫码支付
+     *
+     * @return
+     */
+    ResultVo pay(String communityId, String orderNum, double money, String authCode, String feeName) throws Exception;
+
+    /**
+     * 检查是否支付完成
+     *
+     * @param communityId
+     * @param orderNum
+     * @return
+     */
+    ResultVo checkPayFinish(String communityId, String orderNum);
+
+}

File diff suppressed because it is too large
+ 112 - 0
service-acct/src/main/java/com/java110/acct/smo/impl/QrCodeAliPaymentAdapt.java


+ 164 - 0
service-acct/src/main/java/com/java110/acct/smo/impl/QrCodeWechatPaymentAdapt.java

@@ -0,0 +1,164 @@
+package com.java110.acct.smo.impl;
+
+import com.java110.acct.smo.IQrCodePaymentSMO;
+import com.java110.core.client.RestTemplate;
+import com.java110.dto.smallWeChat.SmallWeChatDto;
+import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.WechatConstant;
+import com.java110.utils.util.PayUtil;
+import com.java110.vo.ResultVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * 微信支付
+ */
+public class QrCodeWechatPaymentAdapt implements IQrCodePaymentSMO {
+    private static Logger logger = LoggerFactory.getLogger(QrCodeWechatPaymentAdapt.class);
+
+    //微信支付
+    public static final String DOMAIN_WECHAT_PAY = "WECHAT_PAY";
+    // 微信服务商支付开关
+    public static final String WECHAT_SERVICE_PAY_SWITCH = "WECHAT_SERVICE_PAY_SWITCH";
+
+    //开关ON打开
+    public static final String WECHAT_SERVICE_PAY_SWITCH_ON = "ON";
+
+
+    private static final String WECHAT_SERVICE_APP_ID = "SERVICE_APP_ID";
+
+    private static final String WECHAT_SERVICE_MCH_ID = "SERVICE_MCH_ID";
+
+    @Autowired
+    private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
+
+    @Autowired
+    private RestTemplate outRestTemplate;
+
+    @Override
+    public ResultVo pay(String communityId, String orderNum, double money, String authCode, String feeName) throws Exception {
+        logger.info("【小程序支付】 统一下单开始, 订单编号=" + orderNum);
+        SortedMap<String, String> resultMap = new TreeMap<String, String>();
+        //生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元
+        double payAmount = PayUtil.getPayAmountByEnv(MappingCache.getValue("HC_ENV"), money);
+        //添加或更新支付记录(参数跟进自己业务需求添加)
+
+        Map<String, String> resMap = null;
+        logger.debug("resMap=" + resMap);
+        String systemName = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_GOOD_NAME);
+
+        SmallWeChatDto shopSmallWeChatDto = null;
+
+        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
+        smallWeChatDto.setObjId(communityId);
+        List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
+        if (smallWeChatDtos == null && smallWeChatDtos.size() < 1) {
+            shopSmallWeChatDto = new SmallWeChatDto();
+            shopSmallWeChatDto.setObjId(communityId);
+            shopSmallWeChatDto.setAppId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId"));
+            shopSmallWeChatDto.setAppSecret(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret"));
+            shopSmallWeChatDto.setMchId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "mchId"));
+            shopSmallWeChatDto.setPayPassword(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "payPassword"));
+        } else {
+            shopSmallWeChatDto = smallWeChatDtos.get(0);
+        }
+
+        SortedMap<String, String> paramMap = new TreeMap<String, String>();
+        paramMap.put("appid", shopSmallWeChatDto.getAppId());
+        paramMap.put("mch_id", shopSmallWeChatDto.getMchId());
+        paramMap.put("nonce_str", PayUtil.makeUUID(32));
+        paramMap.put("body", systemName + feeName);
+        paramMap.put("out_trade_no", orderNum);
+        paramMap.put("total_fee", PayUtil.moneyToIntegerStr(payAmount));
+        paramMap.put("spbill_create_ip", PayUtil.getLocalIp());
+        paramMap.put("auth_code", authCode);
+
+        String paySwitch = MappingCache.getValue(DOMAIN_WECHAT_PAY, WECHAT_SERVICE_PAY_SWITCH);
+        if (WECHAT_SERVICE_PAY_SWITCH_ON.equals(paySwitch)) {
+            paramMap.put("appid", MappingCache.getValue(DOMAIN_WECHAT_PAY, WECHAT_SERVICE_APP_ID));  //服务商appid,是服务商注册时公众号的id
+            paramMap.put("mch_id", MappingCache.getValue(DOMAIN_WECHAT_PAY, WECHAT_SERVICE_MCH_ID));  //服务商商户号
+            paramMap.put("sub_appid", smallWeChatDto.getAppId());//起调小程序appid
+            paramMap.put("sub_mch_id", smallWeChatDto.getMchId());//起调小程序的商户号
+            paramMap.remove("openid");
+        }
+        paramMap.put("sign", PayUtil.createSign(paramMap, smallWeChatDto.getPayPassword()));
+//转换为xml
+        String xmlData = PayUtil.mapToXml(paramMap);
+
+        logger.debug("调用支付统一下单接口" + xmlData);
+
+        ResponseEntity<String> responseEntity = outRestTemplate.postForEntity(
+                WechatConstant.wxMicropayUnifiedOrder, xmlData, String.class);
+
+        logger.debug("统一下单返回" + responseEntity);
+//请求微信后台,获取预支付ID
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException("支付失败" + responseEntity.getBody());
+        }
+        resMap = PayUtil.xmlStrToMap(responseEntity.getBody());
+
+        if ("SUCCESS".equals(resMap.get("return_code")) && "SUCCESS".equals(resMap.get("result_code"))) {
+            return new ResultVo(ResultVo.CODE_OK, "成功");
+        } else {
+            return new ResultVo(ResultVo.CODE_ERROR, resMap.get("msg"));
+        }
+    }
+
+    public ResultVo checkPayFinish(String communityId, String orderNum) {
+        SmallWeChatDto shopSmallWeChatDto = null;
+        Map<String, String> result = null;
+        try {
+            SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
+            smallWeChatDto.setObjId(communityId);
+            List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
+            if (smallWeChatDtos == null && smallWeChatDtos.size() < 1) {
+                shopSmallWeChatDto = new SmallWeChatDto();
+                shopSmallWeChatDto.setObjId(communityId);
+                shopSmallWeChatDto.setAppId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId"));
+                shopSmallWeChatDto.setAppSecret(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret"));
+                shopSmallWeChatDto.setMchId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "mchId"));
+                shopSmallWeChatDto.setPayPassword(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "payPassword"));
+            } else {
+                shopSmallWeChatDto = smallWeChatDtos.get(0);
+            }
+
+            SortedMap<String, String> paramMap = new TreeMap<String, String>();
+            paramMap.put("appid", shopSmallWeChatDto.getAppId());
+            paramMap.put("mch_id", shopSmallWeChatDto.getMchId());
+            paramMap.put("nonce_str", PayUtil.makeUUID(32));
+            paramMap.put("out_trade_no", orderNum);
+            paramMap.put("sign", PayUtil.createSign(paramMap, smallWeChatDto.getPayPassword()));
+//转换为xml
+            String xmlData = PayUtil.mapToXml(paramMap);
+
+            logger.debug("调用支付统一下单接口" + xmlData);
+
+            ResponseEntity<String> responseEntity = outRestTemplate.postForEntity(
+                    WechatConstant.wxOrderQuery, xmlData, String.class);
+
+            logger.debug("统一下单返回" + responseEntity);
+//请求微信后台,获取预支付ID
+            if (responseEntity.getStatusCode() != HttpStatus.OK) {
+                throw new IllegalArgumentException("支付失败" + responseEntity.getBody());
+            }
+            result = PayUtil.xmlStrToMap(responseEntity.getBody());
+
+        } catch (Exception e) {
+            logger.error("请求失败", e);
+            return new ResultVo(ResultVo.CODE_WAIT_PAY, e.getLocalizedMessage());
+        }
+        if (!"SUCCESS".equals(result.get("trade_state"))) {
+            return new ResultVo(ResultVo.CODE_WAIT_PAY, "等待支付完成");
+        }
+        return new ResultVo(ResultVo.CODE_OK, "支付成功");
+    }
+}

+ 5 - 1
service-api/src/main/java/com/java110/api/listener/fee/DeleteFeeListener.java

@@ -79,7 +79,11 @@ public class DeleteFeeListener extends AbstractServiceApiPlusListener {
         feeDetailDto.setFeeId(reqJson.getString("feeId"));
         feeDetailDto.setStates(new String[]{"1400", "1000"});
         List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
-        Assert.listOnlyOne(feeDetailDtos, "存在缴费记录,不能取消,如果需要取消,请先退费");
+        //Assert.listOnlyOne(feeDetailDtos, "存在缴费记录,不能取消,如果需要取消,请先退费");
+
+        if(feeDetailDtos != null && feeDetailDtos.size()>0){
+            throw new IllegalArgumentException("存在缴费记录,不能取消,如果需要取消,请先退费");
+        }
 
     }