|
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.zanxiang.common.constant.Constants;
|
|
|
import com.zanxiang.common.domain.ResultMap;
|
|
|
+import com.zanxiang.common.enums.HttpStatusEnum;
|
|
|
import com.zanxiang.common.exception.BaseException;
|
|
|
import com.zanxiang.module.util.JsonUtil;
|
|
|
import com.zanxiang.module.util.bean.BeanUtil;
|
|
@@ -13,6 +14,7 @@ import com.zanxiang.mybatis.entity.PayMerchant;
|
|
|
import com.zanxiang.mybatis.mapper.PayApplicationMapper;
|
|
|
import com.zanxiang.sdk.constant.WxPayConstants;
|
|
|
import com.zanxiang.sdk.domain.dto.PayApplicationDTO;
|
|
|
+import com.zanxiang.sdk.domain.dto.PayMerchantDTO;
|
|
|
import com.zanxiang.sdk.domain.params.MiniAppPayParam;
|
|
|
import com.zanxiang.sdk.service.PayApplicationService;
|
|
|
import com.zanxiang.sdk.service.PayMerchantService;
|
|
@@ -21,12 +23,18 @@ import com.zanxiang.sdk.util.HttpUtil;
|
|
|
import com.zanxiang.sdk.util.WxPayUtil;
|
|
|
import com.zanxiang.sdk.util.XmlUtil;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.io.IOUtils;
|
|
|
import org.apache.commons.lang3.RandomStringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.BufferedOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.HashMap;
|
|
@@ -68,7 +76,7 @@ public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper,
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public ResultMap miniAppPay(MiniAppPayParam payParam, HttpServletRequest request) {
|
|
|
+ public ResultMap appletStorePay(MiniAppPayParam payParam, HttpServletRequest request) {
|
|
|
//查询商城小程序信息
|
|
|
PayApplication payApplication = super.getOne(new LambdaQueryWrapper<PayApplication>()
|
|
|
.eq(PayApplication::getAppId, payParam.getAppId()));
|
|
@@ -76,15 +84,9 @@ public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper,
|
|
|
throw new BaseException("参数错误, 支付商城小程序信息不存在");
|
|
|
}
|
|
|
//查询商户信息
|
|
|
- PayMerchant payMerchant = payMerchantService.getById(3L);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- Map<String, String> payConfigMap = JsonUtil.toMap(payMerchant.getPayConfig(), Map.class, String.class);
|
|
|
+ PayMerchantDTO payMerchantDTO = payMerchantService.getByMerchantNo(payApplication.getMerchantNo());
|
|
|
+ //下单参数
|
|
|
+ Map<String, String> payConfigMap = JsonUtil.toMap(payMerchantDTO.getPayConfig(), Map.class, String.class);
|
|
|
//获取用户openId
|
|
|
String openId = wxApiService.getAppletOpenId(payParam.getCode(), payApplication.getAppId(), payApplication.getAppSecret());
|
|
|
//订单id
|
|
@@ -93,7 +95,7 @@ public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper,
|
|
|
//下单参数
|
|
|
Map<String, String> paramMap = new HashMap<>(9);
|
|
|
paramMap.put("appId", payApplication.getAppId());
|
|
|
- paramMap.put("mchId", payMerchant.getMerchantNo());
|
|
|
+ paramMap.put("mchId", payMerchantDTO.getMerchantNo());
|
|
|
paramMap.put("productName", payParam.getProductName());
|
|
|
paramMap.put("orderId", orderId);
|
|
|
paramMap.put("totalFee", payParam.getTotalFee());
|
|
@@ -103,7 +105,7 @@ public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper,
|
|
|
Map<String, String> attachMap = new HashMap<>(3);
|
|
|
attachMap.put("appId", payApplication.getAppId());
|
|
|
attachMap.put("orderId", orderId);
|
|
|
- attachMap.put("merchantNo", payMerchant.getMerchantNo());
|
|
|
+ attachMap.put("merchantNo", payMerchantDTO.getMerchantNo());
|
|
|
paramMap.put("attach", JsonUtil.toString(attachMap));
|
|
|
log.error("下单参数, paramMap : {}", JsonUtil.toString(paramMap));
|
|
|
//下单
|
|
@@ -118,6 +120,45 @@ public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public String appletStoreNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
|
|
+ // 读取参数
|
|
|
+ InputStream inputStream = request.getInputStream();
|
|
|
+ String requestStr = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
|
|
|
+ // 解析xml成map
|
|
|
+ Map<String, String> packageParams = XmlUtil.xmlToMap(requestStr);
|
|
|
+ //获取订单信息
|
|
|
+ String attachStr = packageParams.get("attach");
|
|
|
+ Map<String, String> attachStrMap = JsonUtil.toMap(attachStr, Map.class, String.class);
|
|
|
+ if (attachStrMap == null || attachStrMap.isEmpty()) {
|
|
|
+ log.info("回调参数中attach值为空");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //商户号id
|
|
|
+ String merchantNo = attachStrMap.get("merchantNo");
|
|
|
+ PayMerchant payMerchant = payMerchantService.getOne(new LambdaQueryWrapper<PayMerchant>()
|
|
|
+ .eq(PayMerchant::getMerchantNo, merchantNo));
|
|
|
+ Map<String, String> payConfigMap = JsonUtil.toMap(payMerchant.getPayConfig(), Map.class, String.class);
|
|
|
+ // 判断签名是否正确
|
|
|
+ String mySign = WxPayUtil.generateSignature(packageParams, payConfigMap.get("apiKey"));
|
|
|
+ if (!Objects.equals(mySign, packageParams.get("sign"))) {
|
|
|
+ log.error("通知签名验证失败, muSign : {}, sign : {}", mySign, packageParams.get("sign"));
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ log.info("小程序商城支付成功回调");
|
|
|
+ // 处理业务开始
|
|
|
+ Map<String, String> xmlMap = new HashMap<>();
|
|
|
+ xmlMap.put("return_code", "SUCCESS");
|
|
|
+ xmlMap.put("return_msg", "OK");
|
|
|
+ // 处理业务完毕
|
|
|
+ BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
|
|
|
+ log.info("返回给腾讯的回调结果, ss : {}", XmlUtil.mapToXml(xmlMap));
|
|
|
+ out.write(XmlUtil.mapToXml(xmlMap).getBytes());
|
|
|
+ out.flush();
|
|
|
+ out.close();
|
|
|
+ return HttpStatusEnum.SUCCESS.getMsg();
|
|
|
+ }
|
|
|
+
|
|
|
private Map<Object, Object> payParamMap(String orderId, String appId, String apiKey, Map<String, String> successMap) {
|
|
|
//支付id
|
|
|
String prepayId = successMap.get("prepay_id");
|