FengChaoYu 10 месяцев назад
Родитель
Сommit
150708ba7c

+ 21 - 21
mall-miniapp-service/src/main/java/com/gree/mall/miniapp/constant/Constant.java

@@ -28,28 +28,28 @@ public class Constant {
     }
 
     public class RedisPrefix{
-        public final static String WORK_MINI_ACCESS_TOKEN = "gejiang:work:mini:access:token";
-        public final static String TOKEN_WX = "gejiang:token:wx";
-        public final static String TOKEN_GREE = "gejiang:token:gree";
-        public final static String LOCK_ORDER = "gejiang:lock:order";
-        public final static String LOCK_ORDER_STOCK = "gejiang:lock:stock";
-        public final static String SEC_IDENTIFIER = "gejiang:sec:identifier";
-        public final static String LOCK_COUPON = "gejiang:lock:coupon";
-        public final static String LOCK_GIFT = "gejiang:lock:gift";
-        public final static String LOCK_COUPON_TRANSFER = "gejiang:lock:coupon:transfer";
-        public final static String LOCK_COUPON_CHECK = "gejiang:lock:coupon:check";
-        public final static String LOCK_AUTH = "gejiang:lock:auth";
-        public final static String SMS = "gejiang:sms";
-        public final static String VERIFICATION = "gejiang:verification";
-        public final static String SMS_BIND_CODE= "gejiang:sms:bind:";
-        public final static String TOKEN_TAX = "gejiang:token:tax";
-        public final static String TOKEN_GONGDAN = "gejiang:token:gongdan";
-        public final static String LOCK_EXCHANGE_CODE = "gejiang:lock:exchangecode";
+        public final static String WORK_MINI_ACCESS_TOKEN = "jsm:sxb::work:mini:access:token";
+        public final static String TOKEN_WX = "jsm:sxb::token:wx";
+        public final static String TOKEN_GREE = "jsm:sxb::token:gree";
+        public final static String LOCK_ORDER = "jsm:sxb::lock:order";
+        public final static String LOCK_ORDER_STOCK = "jsm:sxb::lock:stock";
+        public final static String SEC_IDENTIFIER = "jsm:sxb::sec:identifier";
+        public final static String LOCK_COUPON = "jsm:sxb::lock:coupon";
+        public final static String LOCK_GIFT = "jsm:sxb::lock:gift";
+        public final static String LOCK_COUPON_TRANSFER = "jsm:sxb::lock:coupon:transfer";
+        public final static String LOCK_COUPON_CHECK = "jsm:sxb::lock:coupon:check";
+        public final static String LOCK_AUTH = "jsm:sxb::lock:auth";
+        public final static String SMS = "jsm:sxb::sms";
+        public final static String VERIFICATION = "jsm:sxb::verification";
+        public final static String SMS_BIND_CODE= "jsm:sxb::sms:bind:";
+        public final static String TOKEN_TAX = "jsm:sxb::token:tax";
+        public final static String TOKEN_GONGDAN = "jsm:sxb::token:gongdan";
+        public final static String LOCK_EXCHANGE_CODE = "jsm:sxb::lock:exchangecode";
         //订单号每日流水
-        public final static String ORDER_NUM = "gejiang:orderNo:";
-        public final static String MATERIAL_STOCK_LOCK = "gejiang:lock:material:stock:";
-        public final static String LEASE_ORDER_LOCK = "gejiang:lock:lease:order:";
-        public final static String ES_GOODS_LOCK = "gejiang:lock:es:goods:";
+        public final static String ORDER_NUM = "jsm:sxb::orderNo:";
+        public final static String MATERIAL_STOCK_LOCK = "jsm:sxb::lock:material:stock:";
+        public final static String LEASE_ORDER_LOCK = "jsm:sxb::lock:lease:order:";
+        public final static String ES_GOODS_LOCK = "jsm:sxb::lock:es:goods:";
     }
 
     //礼品卡支持的市

+ 24 - 21
mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java

@@ -31,33 +31,36 @@ public class Constant {
     }
 
     public class RedisPrefix {
-        public final static String LOCK_LOGIN = "gejiang:login:";
-        public final static String WORK_MINI_ACCESS_TOKEN = "gejiang:work:mini:access:token";
-        public final static String TOKEN_WX = "gejiang:token:wx";
+        public final static String LOCK_LOGIN = "jsm:sxb:login:";
+        public final static String WORK_MINI_ACCESS_TOKEN = "jsm:sxb:work:mini:access:token";
+        public final static String TOKEN_WX = "jsm:sxb:token:wx";
         public final static String TOKEN_MP_WX = "mp:token:wx";
-        public final static String TOKEN_TAX = "gejiang:token:tax";
-        public final static String TOKEN_GONGDAN = "gejiang:token:gongdan";
-        public final static String LOCK_ORDER = "gejiang:lock:order";
-        public final static String LOCK_ORDER_STOCK = "gejiang:lock:stock";
-        public final static String LOCK_WX_SYNC = "gejiang:lock:wx:sync";
-        public final static String LOCK_SOP_SYNC = "gejiang:lock:sop";
+        public final static String TOKEN_TAX = "jsm:sxb:token:tax";
+        public final static String TOKEN_GONGDAN = "jsm:sxb:token:gongdan";
+        public final static String LOCK_ORDER = "jsm:sxb:lock:order";
+        public final static String LOCK_ORDER_STOCK = "jsm:sxb:lock:stock";
+        public final static String LOCK_WX_SYNC = "jsm:sxb:lock:wx:sync";
+        public final static String LOCK_SOP_SYNC = "jsm:sxb:lock:sop";
         public final static String CHAT_MESSAGE_SEQ_KEY = "CHAT_MESSAGE_SEQ";
-        public final static String LOCK_EXCHANGE_CODE = "gejiang:lock:exchangecode";
-        public final static String PARTS_BASE_MANAGE = "gejiang:lock:parts:base:manage:";
-        public final static String MATERIAL_CATEGORY = "gejiang:lock:material:category:";
-        public final static String MATERIAL_PURCHASE = "gejiang:lock:material:purchase:";
-        public final static String MATERIAL_STOCK_LOCK = "gejiang:lock:material:stock:";
-        public final static String MATERIAL_SALES = "gejiang:lock:material:sales:";
-        public final static String GOODS_MATERIAL_PURCHASE = "gejiang:lock:goods:material:purchase:";
-        public final static String GOODS_MATERIAL_PURCHASE_RET = "gejiang:lock:goods:material:purchase:ret:";
+        public final static String LOCK_EXCHANGE_CODE = "jsm:sxb:lock:exchangecode";
+        public final static String PARTS_BASE_MANAGE = "jsm:sxb:lock:parts:base:manage:";
+        public final static String MATERIAL_CATEGORY = "jsm:sxb:lock:material:category:";
+        public final static String MATERIAL_PURCHASE = "jsm:sxb:lock:material:purchase:";
+        public final static String MATERIAL_STOCK_LOCK = "jsm:sxb:lock:material:stock:";
+        public final static String MATERIAL_SALES = "jsm:sxb:lock:material:sales:";
+        public final static String GOODS_MATERIAL_PURCHASE = "jsm:sxb:lock:goods:material:purchase:";
+        public final static String GOODS_MATERIAL_PURCHASE_RET = "jsm:sxb:lock:goods:material:purchase:ret:";
         //订单号每日流水
-        public final static String ORDER_NUM = "gejiang:orderNo:";
+        public final static String ORDER_NUM = "jsm:sxb:orderNo:";
 
-        public final static String LOCK_WALLET = "gejiang:orderNo:LOCK_WALLET";
+        public final static String LOCK_WALLET = "jsm:sxb:orderNo:LOCK_WALLET";
 
-        public final static String LOCK_GOODS_MATERIAL = "gejiang:goods:material:";
+        public final static String LOCK_GOODS_MATERIAL = "jsm:sxb:goods:material:";
 
-        public final static String ORDER_ENGIN_BASE =  "gejiang:lock:order:engin:base:";
+        public final static String ORDER_ENGIN_BASE =  "jsm:sxb:lock:order:engin:base:";
+
+        // 接口令牌
+        public final static String INF_TOKEN = "material:token:inf";
     }
     public class ChatMessage {
         public final static String MSG_TYPE_DOC = "docmsg";

+ 20 - 0
mall-server-api/src/main/java/com/gree/mall/manager/constant/SybConstants.java

@@ -0,0 +1,20 @@
+package com.gree.mall.manager.constant;
+
+public class SybConstants {
+	//正式环境测试参数
+	public static final String SYB_ORGID = "";//集团/机构模式下该参数不为空,且appid与key是与次参数对应
+	public static final String SYB_CUSID = "990440148166000";
+	public static final String SYB_APPID = "00000003";
+	public static final String SYB_MD5_APPKEY = "a0ea3fa20dbd7bb4d5abf1d59d63bae8";
+	public static final String SYB_APIURL = "https://vsp.allinpay.com/apiweb/unitorder";//生产环境
+	public static final String SIGN_TYPE = "SM2";
+	public static final String SYB_RSACUSPRIKEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAO0HpPUP+eHk//Ba6ZOePvoZVDpOCRtt943oeVfCTllye43bqja1jVIaebX0MgX+yPYnWIQIOJ9ubSH0R4iyY9y1/HR00qkUpfW3/0usBPt9qn7r0xtFHerhVCd4dT2rKb2Oc5IhKOg05cw/BmMFohMkFsqt0jlrUXI8zJOlLIcxAgMBAAECgYA9lt/pAYa3iK5sQOMyhUrt54j4QXCiXPeXOxHUmNuM6G9sU+itoI0hCVoYymP5JNQJCf45CH3WB3Z5/SRdQ6Uoo1cjao6cCohPLxMSfJglsZCHckPH53o25RKEza4njIgKC+yN7HAhanKymhw/yYQ6i0aXq38zFIk8djMtE7R6xQJBAP6jvNy7UhPKO5rxGFKR+MvvbO3qnYH6x0jZCGY3FlxuGfbavueOiFtMeK67FuDv683dcUKi+M48yR4kH5CfIusCQQDuS9KF6mlm3kHAiZWgVhE8VVNYGpRLCRDgAKm4InGmvk5mUv+O1yAtAFVAEHWIgD4awC7Eqf1YFrSF/It9HV9TAkEAsXiU7JJxhfFw0XAvL30lFZ1tIfReinSp6A+7VuIV552k4vNaEjC4wEjv43fpXiRZCEXJ5lOHbNXYpfUvOrBuuQJAOpow8rf8Jc0g1G3Be0XPRUwii/c1YuKe4Meo9VybIIuKkkV1Dba/9fEwBepGTURkgYWjur+nSyOCT7UUxLcVewJAPLig8dVfKpsiNwYuveEYMcFaO5xoRuiB7v+CMmvxpuuK+rrFS+d7RdmwDbnBiDV4JkTgFObUiGvB7MtS+LGfhw==";
+	public static final String SYB_RSATLPUBKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm9OV6zH5DYH/ZnAVYHscEELdCNfNTHGuBv1nYYEY9FrOzE0/4kLl9f7Y9dkWHlc2ocDwbrFSm0Vqz0q2rJPxXUYBCQl5yW3jzuKSXif7q1yOwkFVtJXvuhf5WRy+1X5FOFoMvS7538No0RpnLzmNi3ktmiqmhpcY/1pmt20FHQQIDAQAB";
+//	/**商户sm2私钥,用于向通联发起请求前进行签名**/
+	public static final String SYB_SM2PPRIVATEKEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgjj4Rk+b0YjwO+UwXofnHf4bK+kaaY5Btkd8nMP2VimmgCgYIKoEcz1UBgi2hRANCAAQqlALW4qGC3bP1x3wo5QsKxaCMEZJ2ODTTwOQ+d8UGU7GoK/y/WMBQWf5upMnFU06p5FxGooXYYoBtldgm03hq";
+//	/**通联平台sm2公钥,用于请求返回或者通联通知的验签**/
+	public static final String SYB_SM2TLPUBKEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEBQicgWm0KAMqhO3bdqMUEDrKQvYg8cCXHhdGwq7CGE6oJDzJ1P/94HpuVdBf1KidmPxr7HOH+0DAnpeCcx9TcQ==";
+
+	public static final String PAY_TYPE_W01 = "W01";
+	public static final String PAY_TYPE_W06 = "W06";
+}

+ 2 - 1
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitSalesController.java

@@ -217,9 +217,10 @@ public class WebsitSalesController {
     @ApiOperation(value = "网点销售订单-生成支付二维码")
     public ResponseHelper<PayDetail> pay(
             @ApiParam(value = "salesId单号", required = true) @RequestParam String salesId,
+            @ApiParam(value = "支付配置id", required = true) @RequestParam String payConfigId,
             HttpServletRequest request
     ) throws Exception {
-        PayDetail detail = websitSalesLogic.pay(salesId, request);
+        PayDetail detail = websitSalesLogic.pay(salesId, payConfigId, request);
         return ResponseHelper.success(detail);
     }
 

+ 170 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/common/AllInPayLogic.java

@@ -0,0 +1,170 @@
+package com.gree.mall.manager.logic.common;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.gree.mall.manager.constant.SybConstants;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.plus.entity.WebsitSalesPayOrder;
+import com.gree.mall.manager.utils.ArithUtils;
+import com.gree.mall.manager.utils.HttpUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Component
+@Slf4j
+public class AllInPayLogic {
+
+    @Value("${allIn.payment.notifyUrl}")
+    private String notifyUrl;
+
+    @Resource
+    CommonLogic commonLogic;
+
+
+    /**
+     * 通联支付
+     */
+    public Map<String, String> serviceUnifiedOrder(WebsitSalesPayOrder order, String payType)
+            throws RemoteServiceException {
+        Map<String, String> reqMap = new HashMap<>();
+        reqMap.put("orgid", order.getOrgId());
+        reqMap.put("cusid", order.getMchNo());
+        reqMap.put("appid", order.getAppid());
+        if (SybConstants.PAY_TYPE_W06.equals(payType)) {
+            reqMap.put("acct", order.getOpenid());
+            reqMap.put("sub_appid", "wx21d155e8a449d9b1");
+        }
+        reqMap.put("notify_url", this.notifyUrl);
+        reqMap.put("trxamt", (int) ArithUtils.mul(order.getPayValue().doubleValue(), 100) + "");
+        reqMap.put("reqsn", order.getOrderNo());
+        reqMap.put("body", order.getWebsitName());
+        reqMap.put("paytype", payType);
+        reqMap.put("remark", order.getOrderId());
+
+        HashMap<String, String> heads = new HashMap();
+        String token = commonLogic.getInfToken();
+        if (StringUtils.isEmpty(token)) {
+            throw new RemoteServiceException("获取接口令牌失败");
+        }
+        heads.put("authorization_token", token);
+
+        String content = HttpUtils.requestPostBody(commonLogic.getInfUrl() + "/pay/csb/qrcode", JSON.toJSONString(reqMap), heads);
+
+        Map<String, Object> resMap = JSON.parseObject(content, new TypeReference<HashMap<String, Object>>() {});
+
+        if (!Optional.ofNullable(resMap.get("message")).orElse("error").toString().equals("success")) {
+            log.error("通联统一支付接口执行失败: {}>>>{}", order.getOrderId(), resMap);
+            throw new RemoteServiceException("通联统一支付接口执行失败:" + resMap.get("message"));
+        }
+
+        return (Map<String, String>) resMap.get("data");
+    }
+
+    /**
+     * 通联支付查询订单
+     */
+    public Map<String, String> serviceQueryOrder(WebsitSalesPayOrder order) throws RemoteServiceException {
+        Map<String, String> reqMap = new HashMap<>();
+        if (StringUtils.isNotBlank(order.getOrgId())) {
+            reqMap.put("orgid", order.getOrgId());
+        }
+        reqMap.put("cusid", order.getOrderNo());
+        reqMap.put("appid", order.getAppid());
+        reqMap.put("reqsn", order.getOutTradeNo());
+        reqMap.put("trxid", order.getOrderNo());
+
+        HashMap<String, String> heads = new HashMap();
+        String token = commonLogic.getInfToken();
+        if (StringUtils.isEmpty(token)) {
+            throw new RemoteServiceException("获取接口令牌失败");
+        }
+        heads.put("authorization_token", token);
+
+        String content = HttpUtils.requestPostBody(commonLogic.getInfUrl() + "/pay/csb/order/query", JSON.toJSONString(reqMap), heads);
+
+        Map<String, Object> resMap = JSON.parseObject(content, new TypeReference<HashMap<String, Object>>() {});
+
+        if (!Optional.ofNullable(resMap.get("message")).orElse("error").toString().equals("success")) {
+            log.error("通联交易查询接口执行失败: {}", resMap);
+            throw new RemoteServiceException("通联交易查询接口执行失败:" + resMap.get("message"));
+        }
+
+        return (Map<String, String>) resMap.get("data");
+    }
+
+    /**
+     * 通联支付退款
+     */
+//    public Map<String, String> serviceRefundOrder(SalesPayList paylist, BigDecimal refundValue) throws RemoteServiceException {
+//        Map<String, String> reqMap = new HashMap<>();
+//        if (StringUtils.isNotBlank(paylist.getMchNo())) {
+//            reqMap.put("orgid", paylist.getMchNo());
+//        }
+//        reqMap.put("appid", paylist.getAppid());
+//        reqMap.put("cusid", paylist.getSubMchNo());
+//        reqMap.put("trxamt", (int) ArithUtils.mul(refundValue.doubleValue(), 100) + ""); // 退款金额 单位:分
+//        reqMap.put("reqsn", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"))); // 商户的退款订单号
+//        reqMap.put("oldreqsn", paylist.getOutTradeNo()); // 原交易的商户订单号
+//        reqMap.put("oldtrxid", paylist.getOrderNo()); // 原交易的收银宝平台流水
+//        reqMap.put("trxid", paylist.getOrderNo());
+//
+//        HashMap<String, String> heads = new HashMap();
+//        String token = commonLogic.getInfToken();
+//        if (StringUtils.isEmpty(token)) {
+//            throw new RemoteServiceException("获取接口令牌失败");
+//        }
+//        heads.put("authorization_token", token);
+//
+//        String content = HttpUtils.requestPostBody(commonLogic.getInfUrl() + "/pay/csb/order/refund", JSON.toJSONString(reqMap), heads);
+//
+//        Map<String, Object> resMap = JSON.parseObject(content, new TypeReference<HashMap<String, Object>>() {});
+//
+//        if (!Optional.ofNullable(resMap.get("message")).orElse("error").toString().equals("success")) {
+//            log.error("通联交易退款接口执行失败: {}", resMap);
+//            throw new RemoteServiceException("通联交易退款接口执行失败:" + resMap.get("message"));
+//        }
+//
+//        return (Map<String, String>) resMap.get("data");
+//    }
+
+    /**
+     * 通联支付关闭
+     */
+//    public Map<String, String> serviceCloseOrder(SalesPayList payRecord) throws RemoteServiceException {
+//        Map<String, String> reqMap = new HashMap<>();
+//        if (StringUtils.isNotBlank(payRecord.getMchNo())) {
+//            reqMap.put("orgid", payRecord.getMchNo());
+//        }
+//        reqMap.put("appid", payRecord.getAppid());
+//        reqMap.put("cusid", payRecord.getSubMchNo());
+//        reqMap.put("reqsn", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"))); // 商户的退款订单号
+//        reqMap.put("oldreqsn", payRecord.getOutTradeNo()); // 原交易的商户订单号
+//        reqMap.put("oldtrxid", payRecord.getOrderNo()); // 原交易的收银宝平台流水
+//        reqMap.put("trxid", payRecord.getOrderNo());
+//
+//        HashMap<String, String> heads = new HashMap();
+//        String token = commonLogic.getInfToken();
+//        if (StringUtils.isEmpty(token)) {
+//            throw new RemoteServiceException("获取接口令牌失败");
+//        }
+//        heads.put("authorization_token", token);
+//
+//        String content = HttpUtils.requestPostBody(commonLogic.getInfUrl() + "/pay/csb/order/close", JSON.toJSONString(reqMap), heads);
+//
+//        Map<String, Object> resMap = JSON.parseObject(content, new TypeReference<HashMap<String, Object>>() {});
+//
+//        String message = Optional.ofNullable(resMap.get("message")).orElse("error").toString();
+//        if (message.equals("success") || message.equals("交易已关闭")) {
+//            return (Map<String, String>) resMap.get("data");
+//        }
+//        log.error("通联交易关闭接口执行失败: {}", resMap);
+//        throw new RemoteServiceException("通联交易关闭接口执行失败:" + resMap.get("message"));
+//    }
+}

+ 38 - 9
mall-server-api/src/main/java/com/gree/mall/manager/logic/common/CommonLogic.java

@@ -2,30 +2,23 @@ package com.gree.mall.manager.logic.common;
 
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.gree.mall.manager.bean.admin.AdminUserCom;
 import com.gree.mall.manager.commonmapper.AdminMapper;
 import com.gree.mall.manager.constant.Constant;
 import com.gree.mall.manager.enums.RedisPrefixEnum;
-import com.gree.mall.manager.enums.admin.AdminWebsitTypeEnum;
 import com.gree.mall.manager.exception.RemoteServiceException;
 import com.gree.mall.manager.plus.entity.*;
 import com.gree.mall.manager.plus.service.*;
 import com.gree.mall.manager.utils.ApplicationContextUtils;
 import com.gree.mall.manager.utils.CommonUtils;
+import com.gree.mall.manager.utils.HttpUtils;
 import com.gree.mall.manager.utils.RedisUtil;
 import com.gree.mall.manager.utils.oss.OSSUtil;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.lang.time.DateUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.util.EntityUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -51,6 +44,12 @@ public class CommonLogic {
     private String active;
     @Value("${wechat.payment.notifyUrl}")
     private String notifyUrl;
+    @Value("${inf.url}")
+    private String infUrl;
+    @Value("${inf.token.appid}")
+    private String clientId;
+    @Value("${inf.token.appSecret}")
+    private String clientSecret;
     //    @Value("${wechat.payment.refundNotifyUrl}")
 //    private String refundNotifyUrl;
 //    @Value("${wechat.keyPath}")
@@ -415,4 +414,34 @@ public class CommonLogic {
         return null;
     }
 
+    public String getInfToken() throws RemoteServiceException {
+        Object token = redisUtil.get(Constant.RedisPrefix.INF_TOKEN);
+
+        if (token != null) {
+            return token.toString();
+        }
+        //过期就重新获取
+        return this.deleteAndAddInfToken();
+    }
+
+    public String deleteAndAddInfToken() throws RemoteServiceException {
+        HashMap<String, String> params = new HashMap();
+        params.put("clientId", this.clientId);
+        params.put("clientSecret", this.clientSecret);
+        String content = HttpUtils.requestGet(this.infUrl + "/com/token/get", params, null);
+        Map<String, Object> resMap = JSON.parseObject(content, new TypeReference<HashMap<String, Object>>() {
+        });
+
+        int code = (int) resMap.get("code");
+        if (code == 1) {
+            String token = (String) resMap.get("data");
+            redisUtil.set(Constant.RedisPrefix.INF_TOKEN, token, (2 * 60 * 60) - 30);//2小时过期
+            return token;
+        }
+        return null;
+    }
+
+    public String getInfUrl() {
+        return infUrl;
+    }
 }

+ 55 - 4
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitSalesLogic.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -13,6 +14,7 @@ import com.gree.mall.manager.bean.material.manage.*;
 import com.gree.mall.manager.bean.material.stock.WebsitSalesCategoryVO;
 import com.gree.mall.manager.bean.material.stock.WebsitSalesGoodsVO;
 import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.constant.SybConstants;
 import com.gree.mall.manager.enums.IsYesNoEnum;
 import com.gree.mall.manager.enums.UserTypeEnum;
 import com.gree.mall.manager.enums.admin.AdminWebsitTypeEnum;
@@ -20,6 +22,7 @@ import com.gree.mall.manager.enums.base.BaseEnum;
 import com.gree.mall.manager.enums.engin.ItemSourceTypeEnum;
 import com.gree.mall.manager.enums.material.*;
 import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.AllInPayLogic;
 import com.gree.mall.manager.logic.common.CommonLogic;
 import com.gree.mall.manager.logic.common.WechatLogic;
 import com.gree.mall.manager.logic.engin.WebsitGoodsMangerLogic;
@@ -27,7 +30,6 @@ import com.gree.mall.manager.logic.material.stock.WebitSalesStockLogic;
 import com.gree.mall.manager.logic.material.stock.WorkSalesStockLogic;
 import com.gree.mall.manager.plus.entity.*;
 import com.gree.mall.manager.plus.service.*;
-import com.gree.mall.manager.utils.IpUtil;
 import com.gree.mall.manager.utils.excel.ExcelUtils;
 import com.gree.mall.manager.zfire.bean.WebsitSalesParamBean;
 import com.gree.mall.manager.zfire.util.FieldUtils;
@@ -71,6 +73,8 @@ public class WebsitSalesLogic {
     private final UserService userService;
     private final WebsitGoodsCategoryService websitGoodsCategoryService;
     private final StorageService storageService;
+    private final AllInPayLogic allInPayLogic;
+    private final AdminWebsitPayConfigService adminWebsitPayConfigService;
 
     public IPage<WebsitSalesVO> page(WebsitSalesParamBean zfireParamBean) {
         AdminUserCom adminUser = commonLogic.getAdminUser();
@@ -528,10 +532,57 @@ public class WebsitSalesLogic {
         return goodsList;
     }
 
-    public PayDetail pay(String salesId, HttpServletRequest request) throws Exception {
-        String ip = IpUtil.getIpAddr(request);
+    @Transactional
+    public PayDetail pay(String salesId, String payConfigId, HttpServletRequest request) throws Exception {
         WebsitSales sales = websitSalesService.getById(salesId);
-        return wechatLogic.paymentNATIVE(salesId, sales.getTotalAmount(), "", "N", ip,sales.getCompanyWechatId());
+        if (Objects.isNull(sales)) {
+            throw new RemoteServiceException("销售单号不存在");
+        }
+
+        final AdminWebsitPayConfig payConfig = adminWebsitPayConfigService.getById(payConfigId);
+        if (Objects.isNull(payConfig) || !payConfig.getStatus()) {
+            throw new RemoteServiceException("支付配置信息异常");
+        }
+
+        // 微信扫码支付改为通联
+//        String ip = IpUtil.getIpAddr(request);
+//        wechatLogic.paymentNATIVE(salesId, sales.getTotalAmount(), "", "N", ip,sales.getCompanyWechatId());
+
+        WebsitSalesPayOrder payOrder = new WebsitSalesPayOrder();
+        payOrder.setId(IdWorker.getIdStr())
+                .setCompanyWechatId(sales.getCompanyWechatId())
+                .setCompanyWechatName(sales.getCompanyWechatName())
+                .setGoodsType(sales.getGoodsType())
+                .setWebsitId(sales.getWebsitId())
+                .setWebsitName(sales.getWebsitName())
+                .setOrderId(sales.getSalesId())
+                .setOutTradeNo(payOrder.getId())
+                .setPayType(PayTypeEnum.WECHAT.getKey())
+                .setOrderCreateTime(sales.getCreateTime())
+                .setPayValue(sales.getTotalAmount())
+                .setOrgId(payConfig.getOrgId())
+                .setMchNo(payConfig.getMchNo())
+                .setAppid(payConfig.getAppid())
+                .setOrderType(PayOrderTypeEnum.S.getKey())
+                .setOrderSource(sales.getGoodsType().equals(WebsitGoodsTypeEnum.M.getKey()) ? OrderSourceEnum.M_SALES.getKey() : OrderSourceEnum.P_SALES.getKey())
+                .setIsDeliver(false);
+
+
+        // 请求通联得到结果
+        Map<String, String> resMap = allInPayLogic.serviceUnifiedOrder(payOrder, SybConstants.PAY_TYPE_W01);
+
+        if (!resMap.get("trxstatus").equals("0000")) {
+            throw new RemoteServiceException("通联统一支付接口执行失败:" + resMap.get("errmsg"));
+        }
+
+        payOrder.setOrderNo(resMap.get("trxid"))
+                .insert();
+
+        PayDetail payDetail = new PayDetail();
+        payDetail.setCodeUrl(resMap.get("payinfo"));
+        payDetail.setId(payOrder.getId());
+        log.info("通联支付payDetail:{}", JSONObject.toJSONString(payDetail));
+        return payDetail;
     }
 
 

+ 9 - 0
mall-server-api/src/main/resources/bootstrap-dev.properties

@@ -83,4 +83,13 @@ ali.cdn.url=
 #微信公众域名
 wechat.mp.url=https://jiasm.zfire.top/gejiangh5/
 
+#通联支付回调地址
+php.interface.url=https://admin.zfire.top
+allIn.payment.notifyUrl=${php.interface.url}/java_fucai/common/allInPayCall
+
+#内部接口
+inf.url=http://121.43.111.127:11111
+inf.token.appid=zfire-jsm-sxb
+inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple
+
 

+ 5 - 1
mall-server-api/src/main/resources/bootstrap-prd.propertiesb

@@ -70,4 +70,8 @@ ali.sms.msg.code=SMS_284585310
 ali.cdn.url=
 
 #微信公众域名
-wechat.mp.url=https://sxbh5.zfire.top/
+wechat.mp.url=https://sxbh5.zfire.top/
+
+#通联支付回调地址
+php.interface.url=https://admin.zfire.top
+allIn.payment.notifyUrl=${php.interface.url}/java_fucai/common/allInPayCall

+ 10 - 1
mall-server-api/src/main/resources/bootstrap-test.properties

@@ -66,4 +66,13 @@ ali.sms.msg.code=SMS_284585310
 ali.cdn.url=
 
 #微信公众域名
-wechat.mp.url=https://jiasm.zfire.top//jsm-sxbh5/
+wechat.mp.url=https://jiasm.zfire.top//jsm-sxbh5/
+
+#通联支付回调地址
+php.interface.url=https://admin.zfire.top
+allIn.payment.notifyUrl=${php.interface.url}/java_fucai/common/allInPayCall
+
+#内部接口
+inf.url=http://121.43.111.127:11111
+inf.token.appid=zfire-jsm-sxb
+inf.token.appSecret=3e7iee31ub94rvvesp7266kwske7fple