Browse Source

抖音小程序 下单

Althars123 2 years ago
parent
commit
5fde78a507
20 changed files with 1009 additions and 32 deletions
  1. 158 0
      sdjk-admin/src/main/java/com/miaxis/app/controller/tt/TtController.java
  2. 296 0
      sdjk-admin/src/main/java/com/miaxis/app/controller/tt/TtNotifyController.java
  3. 1 1
      sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java
  4. 1 1
      sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java
  5. 6 10
      sdjk-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java
  6. 2 1
      sdjk-admin/src/main/resources/application-dev.yml
  7. 2 4
      sdjk-admin/src/test/java/com/miaxis/test/NormalTest.java
  8. 77 0
      sdjk-common/src/main/java/com/miaxis/common/utils/ttUtils.java
  9. 1 1
      sdjk-service/src/main/java/com/miaxis/feign/dto/DyTokenDTO.java
  10. 1 1
      sdjk-service/src/main/java/com/miaxis/feign/dto/DyUserInfoDTO.java
  11. 24 0
      sdjk-service/src/main/java/com/miaxis/feign/dto/ToutiaoCreatOrderDTO.java
  12. 1 1
      sdjk-service/src/main/java/com/miaxis/feign/dto/ToutiaoTokenDTO.java
  13. 2 7
      sdjk-service/src/main/java/com/miaxis/feign/service/DyService.java
  14. 10 4
      sdjk-service/src/main/java/com/miaxis/feign/service/ToutiaoService.java
  15. 1 1
      sdjk-service/src/main/java/com/miaxis/feign/service/WxService.java
  16. 290 0
      sdjk-service/src/main/java/com/miaxis/tt/domain/TtOrder.java
  17. 22 0
      sdjk-service/src/main/java/com/miaxis/tt/mapper/TtOrderMapper.java
  18. 21 0
      sdjk-service/src/main/java/com/miaxis/tt/service/ITtOrderService.java
  19. 36 0
      sdjk-service/src/main/java/com/miaxis/tt/service/impl/TtOrderServiceImpl.java
  20. 57 0
      sdjk-service/src/main/resources/mapper/tt/TtOrderMapper.xml

+ 158 - 0
sdjk-admin/src/main/java/com/miaxis/app/controller/tt/TtController.java

@@ -0,0 +1,158 @@
+package com.miaxis.app.controller.tt;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.system.service.ISysConfigService;
+import com.miaxis.system.service.ISysUserService;
+import com.miaxis.tt.domain.TtOrder;
+import com.miaxis.tt.service.ITtOrderService;
+import com.miaxis.feign.dto.ToutiaoCreatOrderDTO;
+import com.miaxis.feign.service.ToutiaoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
+import static com.miaxis.common.utils.ttUtils.getSign;
+
+/**
+ * 【小程序-微信支付】Controller
+ *
+ * @author miaxis
+ * @date 2021-03-10
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.STUDENT_PREFIX+"/tt")
+@Api(tags = {"【小程序-头条支付】"})
+@Slf4j
+public class TtController extends BaseController {
+
+    @Autowired
+    private HttpClient httpClient;
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+
+    @Autowired
+    private ITtOrderService ttOrderService;
+
+    @Autowired
+    private ToutiaoService toutiaoService;
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Value("${tt.appid}")
+    private String ttappid;
+    @Value("${tt.notifyUrl}")
+    private  String ttnotifyUrl ;
+
+
+
+    /**
+     * 微信支付获取预订单id
+     */
+    @PostMapping(value = "/prepareOrder")
+    @ApiOperation("小程序头条支付下单")
+    public Response<TtParamEntity> getPrepareOrder() throws Exception{
+
+        //创建本地抖音订单
+        TtOrder order = new TtOrder();
+        UserInfo student = SecurityUtils.getLoginUser().getStudent();
+        String orderCode = getOrderCode(student.getId());
+        order.setCpOrderno(orderCode);
+        order.setXcxOpenid(student.getXcxOpenid());
+        order.setUnionId(student.getUnionId());
+        ttOrderService.save(order);
+        return Response.success(placeWxOrder(order));
+
+
+    }
+
+
+
+
+    //下单
+    private TtParamEntity placeWxOrder(TtOrder order) throws Exception {
+        ToutiaoCreatOrderDTO dto = new ToutiaoCreatOrderDTO();
+        dto.setApp_id(ttappid);
+        dto.setOut_order_no(order.getCpOrderno());
+        dto.setTotal_amount(getTotal());
+
+        dto.setSubject("速达驾考会员");
+        dto.setBody("速达驾考会员,可以观看付费内容");
+        dto.setValid_time(900);
+        dto.setNotify_url(ttnotifyUrl);
+        dto.setStore_uid("70963547131799657030");
+        dto.setSign(getSign(BeanUtil.beanToMap(dto,false,true)));
+        String ttReturnStr = toutiaoService.createOrder(dto);
+        System.out.println("tt支付返回"+ttReturnStr);
+        return getWxParamJson(ttReturnStr);
+
+    }
+
+
+
+    private int getTotal() {
+        String price = configService.selectConfigByKey("vip_price");
+        Double dprice = Double.valueOf(price);
+        Double v =dprice* 100;
+        return v.intValue();
+    }
+
+    // 生成调用调起微信支付所需参数
+    private TtParamEntity getWxParamJson(String bodyAsString) throws Exception {
+        JSONObject TtReturn = JSONObject.parseObject(bodyAsString);
+        if (TtReturn.getInteger("err_no") != 0){
+            throw new CustomException(TtReturn.getString("err_tips"));
+        }
+        JSONObject data = TtReturn.getJSONObject("data");
+        TtParamEntity ttParamEntity = new TtParamEntity();
+        ttParamEntity.setOrder_id(data.getString("order_id"));
+        ttParamEntity.setOrder_token(data.getString("order_token"));
+        return ttParamEntity;
+    }
+
+    private HttpPost initHttpPost() {
+        HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type","application/json; charset=utf-8");
+        return httpPost;
+    }
+
+    @Data
+    class  TtParamEntity{
+        String order_id;
+        String order_token;
+
+    }
+
+
+
+
+
+
+
+
+
+
+}

+ 296 - 0
sdjk-admin/src/main/java/com/miaxis/app/controller/tt/TtNotifyController.java

@@ -0,0 +1,296 @@
+package com.miaxis.app.controller.tt;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.AesUtil;
+import com.miaxis.user.service.IUserInfoService;
+import com.miaxis.vip.domain.VipCode;
+import com.miaxis.vip.service.IVipCodeService;
+import com.miaxis.wx.domain.RefundRecord;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.dto.WxNotifyReturnDTO;
+import com.miaxis.wx.dto.WxpayNotifyDTO;
+import com.miaxis.wx.service.IRefundRecordService;
+import com.miaxis.wx.service.IWxOrderService;
+import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.Base64Utils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.security.*;
+import java.security.cert.X509Certificate;
+import java.util.Date;
+import java.util.Random;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.OPEN_PREFIX+"/tt/notify")
+@Api(tags = {"【小程序-微信回调】"})
+@Slf4j
+public class TtNotifyController {
+
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+
+
+    @Autowired
+    private IWxOrderService wxOrderService;
+
+    @Autowired
+    private IVipCodeService vipCodeService;
+
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+    @Autowired
+    private  IRefundRecordService  refundRecordService;
+
+    @Autowired
+    private AutoUpdateCertificatesVerifier verifier;
+
+
+    /**
+     * 微信支付回调接口
+     */
+    @PostMapping(value = "/ttpay")
+    @ApiOperation("头条支付回调")
+    public WxNotifyReturnDTO wxpayNotify(@RequestBody WxpayNotifyDTO wxpayNotifyDTO, HttpServletRequest request) throws GeneralSecurityException, IOException {
+//        String bodyString = getBodyString(request);
+//        if (!validate(request,bodyString)){
+//            throw new CustomException("签名失败");
+//        }
+        String resourceString = getSourString(wxpayNotifyDTO);
+        log.info(resourceString);
+        JSONObject jsonObject = JSONObject.parseObject(resourceString);
+        //将回调数据写入数据库
+        String outTradeNo = writeNotifyDataToDb(jsonObject);
+        //创建兑换码
+        String code = createCode();
+        //激活用户
+        avtivityCode(outTradeNo,code);
+
+        WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
+        wxNotifyReturnDTO.setCode("SUCCESS");
+        wxNotifyReturnDTO.setMessage("成功");
+        return wxNotifyReturnDTO;
+    }
+
+    private void avtivityCode(String outTradeNo, String vipCode) {
+        WxOrder wxOrder = wxOrderService.getByOutTradeNo(outTradeNo);
+        if (wxOrder ==  null){
+            throw new CustomException("改订单不存在");
+        }
+        UserInfo userInfo = userInfoService.getOne(new QueryWrapper<UserInfo>().eq("app_openid", wxOrder.getAppOpenid()));
+        QueryWrapper<VipCode> queryWrapper = new QueryWrapper<VipCode>();
+        queryWrapper.eq("vip_code", vipCode);
+        VipCode vipCodeEntity = vipCodeService.getOne(queryWrapper);
+        if (vipCodeEntity == null){
+            throw new CustomException("该激活码不存在");
+        }
+        if (vipCodeEntity.getStatus() == 1){
+            throw new CustomException("该激活码已被激活");
+        }
+        if (vipCodeEntity.getStatus() == 2){
+            throw new CustomException("该激活码已作废");
+        }
+        vipCodeEntity.setStatus(1);
+        vipCodeEntity.setActivationUserId(userInfo.getId());
+        vipCodeEntity.setActivationTime(new Date());
+        vipCodeService.updateById(vipCodeEntity);
+        userInfo.setIsVip(1);
+        userInfoService.updateById(userInfo);
+
+
+
+
+    }
+
+    private String createCode() {
+        VipCode vipCode = new VipCode();
+        String rVipCode = null ;
+        do {
+            rVipCode  = randomVipcode();
+        }while (isRepeat(rVipCode));
+        vipCode.setVipCode(rVipCode);
+        vipCodeService.save(vipCode);
+        return rVipCode;
+    }
+
+    private String getBodyString(HttpServletRequest request) {
+            BufferedReader br = null;
+            StringBuilder sb = new StringBuilder("");
+            try
+            {
+                br = request.getReader();
+                String str;
+                while ((str = br.readLine()) != null)
+                {
+                    sb.append(str);
+                }
+                br.close();
+            }
+            catch (IOException e)
+            {
+                e.printStackTrace();
+            }
+            finally
+            {
+                if (null != br)
+                {
+                    try
+                    {
+                        br.close();
+                    }
+                    catch (IOException e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            }
+            return sb.toString();
+
+    }
+
+    private Boolean validate(HttpServletRequest request, String bodyString) throws  NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        String sign = request.getHeader("Wechatpay-Signature");
+        String timestamp = request.getHeader("Wechatpay-Timestamp");
+        String nonce = request.getHeader("Wechatpay-Nonce");
+
+        StringBuffer sb = new StringBuffer();
+        sb.append(timestamp + "\n");
+        sb.append(nonce + "\n");
+        sb.append(bodyString + "\n");
+        X509Certificate validCertificate = verifier.getValidCertificate();
+        // 进行签名服务
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        // 用微信平台公钥对签名器进行初始化
+        signature.initVerify(validCertificate);
+        // 把我们构造的验签名串更新到签名器中
+        signature.update(sb.toString().getBytes(StandardCharsets.UTF_8));
+        Boolean result = signature.verify(Base64Utils.decodeFromString(sign));
+        log.info("微信支付回调验签:"+result.toString());
+        return result;
+
+    }
+
+
+    /**
+     * 微信退款回调
+     */
+    @PostMapping(value = "/refund")
+    @ApiOperation("微信退款回调")
+    public WxNotifyReturnDTO refundNotify(@RequestBody WxpayNotifyDTO wxpayNotifyDTO, HttpServletRequest request) throws GeneralSecurityException, IOException {
+        String bodyString = getBodyString(request);
+        if (!validate(request,bodyString)){
+            throw new CustomException("签名失败");
+        }
+        String resourceString = getSourString(wxpayNotifyDTO);
+        log.info(resourceString);
+        JSONObject jsonObject = JSONObject.parseObject(resourceString);
+        //将回调数据写入数据库
+        writeRefundNotifyDataToDb(jsonObject);
+
+        WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
+        wxNotifyReturnDTO.setCode("SUCCESS");
+        wxNotifyReturnDTO.setMessage("成功");
+
+        return wxNotifyReturnDTO;
+    }
+
+    private void writeRefundNotifyDataToDb(JSONObject jsonObject) {
+        String refundId = jsonObject.getString("refund_id");
+        RefundRecord refundRecord = refundRecordService.getByRefundId(refundId);
+        if (refundRecord == null) {
+            throw new CustomException("该退款订单不存在");
+        }
+        refundRecord.setTransactionId(jsonObject.getString("transaction_id"));
+        refundRecord.setUserReceivedAccount(jsonObject.getString("user_received_account"));
+        refundRecord.setStatus(jsonObject.getString("refund_status"));
+        refundRecordService.updateById(refundRecord);
+
+
+    }
+
+
+
+
+
+
+    public String writeNotifyDataToDb(JSONObject jsonObject) {
+        String outTradeNo = jsonObject.getString("out_trade_no");
+        WxOrder wxOrder = wxOrderService.getByOutTradeNo(outTradeNo);
+        if (wxOrder == null) {
+            throw new CustomException("该订单不存在");
+        }
+        wxOrder.setTransactionId(jsonObject.getString("transaction_id"));
+        JSONObject amount = jsonObject.getJSONObject("amount");
+        wxOrder.setPayerTotal(amount.getInteger("payer_total"));
+        wxOrder.setTotal(amount.getInteger("total"));
+        wxOrder.setCurrency(amount.getString("currency"));
+        wxOrder.setPayerCurrency(amount.getString("payer_currency"));
+        wxOrder.setTradeState(jsonObject.getString("trade_state"));
+        wxOrder.setBankType(jsonObject.getString("bank_type"));
+        DateTime dateTime  = new DateTime(jsonObject.getString("success_time"));
+        wxOrder.setSuccessTime(dateTime.toDate());
+        wxOrder.setTradeStateDesc(jsonObject.getString("trade_state_desc"));
+        wxOrder.setTradeType(jsonObject.getString("trade_type"));
+        wxOrder.setAttach(jsonObject.getString("attach"));
+        JSONObject sceneInfo = jsonObject.getJSONObject("scene_info");
+        if (sceneInfo != null){
+            wxOrder.setDeviceId(sceneInfo.getString("device_id"));
+        }
+        wxOrderService.updateById(wxOrder);
+        return outTradeNo;
+
+    }
+
+    private String getSourString(WxpayNotifyDTO wxpayNotifyDTO) throws GeneralSecurityException, IOException {
+        AesUtil aesUtil = new AesUtil(wxpayConfig.getV3key().getBytes());
+        WxpayNotifyDTO.WxpaySource wxpaySource = wxpayNotifyDTO.getResource();
+        return aesUtil.decryptToString(wxpaySource.getAssociated_data().getBytes(), wxpaySource.getNonce().getBytes(), wxpaySource.getCiphertext());
+    }
+
+    private String randomVipcode() {
+        String result = "";
+        Random random = new Random();
+        for(int i =0 ;i <11 ;i ++){
+            result+=random.nextInt(10);
+        }
+        return  result;
+
+
+    }
+    private boolean isRepeat(String rVipCode) {
+        QueryWrapper<VipCode> wrapper = new QueryWrapper<VipCode>();
+        wrapper.eq("vip_code",rVipCode);
+        VipCode one = vipCodeService.getOne(wrapper);
+        return one!= null;
+
+    }
+
+
+
+
+
+
+}

+ 1 - 1
sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java

@@ -50,7 +50,7 @@ import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(Constants.STUDENT_PREFIX+"/wx")
-@Api(tags = {"【小程序-微信支付】"})
+@Api(tags = {"【app-微信支付】"})
 @Slf4j
 public class WxController extends BaseController {
 

+ 1 - 1
sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java

@@ -46,7 +46,7 @@ import java.util.Random;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(Constants.OPEN_PREFIX+"/wx/notify")
-@Api(tags = {"【小程序-微信回调】"})
+@Api(tags = {"【app-微信回调】"})
 @Slf4j
 public class WxNotifyController {
 

+ 6 - 10
sdjk-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java

@@ -2,7 +2,6 @@ package com.miaxis.system.controller.system;
 
 import com.alibaba.fastjson.JSONObject;
 import com.miaxis.apple.service.IAppleService;
-import com.miaxis.common.core.domain.DyUserInfo;
 import com.miaxis.common.core.domain.DyUserInfoResult;
 import com.miaxis.common.core.domain.Response;
 import com.miaxis.common.core.domain.WxUserInfo;
@@ -13,7 +12,6 @@ import com.miaxis.common.enums.StudentLoginTypeEnum;
 import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.utils.SecurityUtils;
 import com.miaxis.common.utils.ServletUtils;
-import com.miaxis.common.utils.http.HttpUtils;
 import com.miaxis.framework.web.service.SysLoginService;
 import com.miaxis.framework.web.service.SysPermissionService;
 import com.miaxis.framework.web.service.TokenService;
@@ -22,12 +20,12 @@ import com.miaxis.system.dto.system.AppleTokenDTO;
 import com.miaxis.system.dto.system.TokenDTO;
 import com.miaxis.system.dto.system.UserInfoDTO;
 import com.miaxis.system.service.ISysMenuService;
-import com.miaxis.wx.dto.DyTokenDTO;
-import com.miaxis.wx.dto.DyUserInfoDTO;
-import com.miaxis.wx.dto.ToutiaoTokenDTO;
-import com.miaxis.wx.service.DyService;
-import com.miaxis.wx.service.ToutiaoService;
-import com.miaxis.wx.service.WxService;
+import com.miaxis.feign.dto.DyTokenDTO;
+import com.miaxis.feign.dto.DyUserInfoDTO;
+import com.miaxis.feign.dto.ToutiaoTokenDTO;
+import com.miaxis.feign.service.DyService;
+import com.miaxis.feign.service.ToutiaoService;
+import com.miaxis.feign.service.WxService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -42,9 +40,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 /**

+ 2 - 1
sdjk-admin/src/main/resources/application-dev.yml

@@ -94,7 +94,8 @@ dy:
 tt:
     appId: tta896de2b37a8562901
     appSecret: d00d88459e539cc086e035d8376810f2506ad064
-
+    notifyUrl: https://sdjk-admin1.zzxcx.net/sdjk-admin/open-api/tt/notify/ttpay
+    notifyUrlRefund: https://sdjk-admin1.zzxcx.net/sdjk-admin/open-api/tt/notify/refund
 
 
 # 微信支付

+ 2 - 4
sdjk-admin/src/test/java/com/miaxis/test/NormalTest.java

@@ -1,11 +1,9 @@
 package com.miaxis.test;
 
 import com.miaxis.SdjkApplication;
-import com.miaxis.score.domain.ScoreInfo;
-import com.miaxis.score.dto.ScoreInfoDTO;
 import com.miaxis.score.service.IScoreInfoService;
-import com.miaxis.wx.dto.DyUserInfoDTO;
-import com.miaxis.wx.service.DyService;
+import com.miaxis.feign.dto.DyUserInfoDTO;
+import com.miaxis.feign.service.DyService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;

+ 77 - 0
sdjk-common/src/main/java/com/miaxis/common/utils/ttUtils.java

@@ -0,0 +1,77 @@
+package com.miaxis.common.utils;
+
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class ttUtils {
+
+    // 支付密钥值
+    private static final String SALT = "RQzx6MZMEp8l7kOMZxQi6qm0wRBSs2jYs7w0zfJI";
+
+    // paramsMap 参数含义解释同 golang
+    public static String getSign(Map<String, Object> paramsMap) {
+        List<String> paramsArr = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
+            String key = entry.getKey();
+            if (key.equals("other_settle_params")) {
+                continue;
+            }
+            String value = entry.getValue().toString();
+
+            value = value.trim();
+            if (value.startsWith("\"") && value.endsWith("\"") && value.length() > 1) {
+                value = value.substring(1, value.length() - 1);
+            }
+            value = value.trim();
+            if (value.equals("") || value.equals("null")) {
+                continue;
+            }
+            switch (key) {
+                case "app_id":
+                case "thirdparty_id":
+                case "sign":
+                    break;
+                default:
+                    paramsArr.add(value);
+                    break;
+            }
+        }
+        paramsArr.add(SALT);
+        Collections.sort(paramsArr);
+        StringBuilder signStr = new StringBuilder();
+        String sep = "";
+        for (String s : paramsArr) {
+            signStr.append(sep).append(s);
+            sep = "&";
+        }
+        return md5FromStr(signStr.toString());
+    }
+
+    public static String md5FromStr(String inStr) {
+        MessageDigest md5;
+        try {
+            md5 = MessageDigest.getInstance("MD5");
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return "";
+        }
+
+        byte[] byteArray = inStr.getBytes(StandardCharsets.UTF_8);
+        byte[] md5Bytes = md5.digest(byteArray);
+        StringBuilder hexValue = new StringBuilder();
+        for (byte md5Byte : md5Bytes) {
+            int val = ((int) md5Byte) & 0xff;
+            if (val < 16) {
+                hexValue.append("0");
+            }
+            hexValue.append(Integer.toHexString(val));
+        }
+        return hexValue.toString();
+    }
+}

+ 1 - 1
sdjk-service/src/main/java/com/miaxis/wx/dto/DyTokenDTO.java → sdjk-service/src/main/java/com/miaxis/feign/dto/DyTokenDTO.java

@@ -1,4 +1,4 @@
-package com.miaxis.wx.dto;
+package com.miaxis.feign.dto;
 
 import lombok.Data;
 

+ 1 - 1
sdjk-service/src/main/java/com/miaxis/wx/dto/DyUserInfoDTO.java → sdjk-service/src/main/java/com/miaxis/feign/dto/DyUserInfoDTO.java

@@ -1,4 +1,4 @@
-package com.miaxis.wx.dto;
+package com.miaxis.feign.dto;
 
 import lombok.Data;
 

+ 24 - 0
sdjk-service/src/main/java/com/miaxis/feign/dto/ToutiaoCreatOrderDTO.java

@@ -0,0 +1,24 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class ToutiaoCreatOrderDTO {
+    String app_id;
+    String out_order_no;
+    int total_amount;
+    String subject;
+    String body;
+    int valid_time;
+    String sign;
+    String cp_extra;
+    String notify_url;
+
+
+    //以下字段为非必传
+    String thirdparty_id;
+    String store_uid;
+    String disable_msg;
+    String msg_page;
+
+}

+ 1 - 1
sdjk-service/src/main/java/com/miaxis/wx/dto/ToutiaoTokenDTO.java → sdjk-service/src/main/java/com/miaxis/feign/dto/ToutiaoTokenDTO.java

@@ -1,4 +1,4 @@
-package com.miaxis.wx.dto;
+package com.miaxis.feign.dto;
 
 import lombok.Data;
 

+ 2 - 7
sdjk-service/src/main/java/com/miaxis/wx/service/DyService.java → sdjk-service/src/main/java/com/miaxis/feign/service/DyService.java

@@ -1,21 +1,16 @@
-package com.miaxis.wx.service;
+package com.miaxis.feign.service;
 
 
 import com.miaxis.common.config.FeignConfig;
-import com.miaxis.common.core.domain.DyUserInfo;
-import com.miaxis.wx.dto.DyTokenDTO;
-import com.miaxis.wx.dto.DyUserInfoDTO;
+import com.miaxis.feign.dto.DyUserInfoDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 import org.springframework.util.MultiValueMap;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
-import java.util.Map;
-
 /**
  *
  * 抖音

+ 10 - 4
sdjk-service/src/main/java/com/miaxis/wx/service/ToutiaoService.java → sdjk-service/src/main/java/com/miaxis/feign/service/ToutiaoService.java

@@ -1,10 +1,9 @@
-package com.miaxis.wx.service;
+package com.miaxis.feign.service;
 
 
 import com.miaxis.common.config.FeignConfig;
-import com.miaxis.wx.dto.DyTokenDTO;
-import com.miaxis.wx.dto.DyUserInfoDTO;
-import com.miaxis.wx.dto.ToutiaoTokenDTO;
+import com.miaxis.feign.dto.ToutiaoCreatOrderDTO;
+import com.miaxis.feign.dto.ToutiaoTokenDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -25,6 +24,13 @@ public interface ToutiaoService {
     @PostMapping(value = "/api/apps/v2/jscode2session")
     String getTtUserInfo(@RequestBody ToutiaoTokenDTO toutiaoTokenDTO);
 
+    /**
+     *  预下单
+     * @return
+     */
+    @PostMapping(value = "/api/apps/ecpay/v1/create_order")
+    String createOrder(@RequestBody ToutiaoCreatOrderDTO toutiaoCreatOrderDTO);
+
 
 
 //    /**

+ 1 - 1
sdjk-service/src/main/java/com/miaxis/wx/service/WxService.java → sdjk-service/src/main/java/com/miaxis/feign/service/WxService.java

@@ -1,4 +1,4 @@
-package com.miaxis.wx.service;
+package com.miaxis.feign.service;
 
 
 import com.miaxis.common.config.FeignConfig;

+ 290 - 0
sdjk-service/src/main/java/com/miaxis/tt/domain/TtOrder.java

@@ -0,0 +1,290 @@
+package com.miaxis.tt.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import lombok.Data;
+/**
+ * 头条订单对象 tt_order
+ *
+ * @author miaxis
+ * @date 2022-05-19
+ */
+@Data
+@TableName("tt_order")
+@ApiModel(value = "TtOrder", description = "头条订单对象 tt_order")
+public class TtOrder extends BaseBusinessEntity{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    /** 商户订单号 */
+    @Excel(name = "商户订单号")
+    @TableField("cp_orderno")
+    @ApiModelProperty(value = "商户订单号")
+    private String cpOrderno;
+
+    /** 退款单号 */
+    @Excel(name = "退款单号")
+    @TableField("out_refund_no")
+    @ApiModelProperty(value = "退款单号")
+    private String outRefundNo;
+
+    /** way 字段中标识了支付渠道:
+1-微信支付,2-支付宝支付,10-抖音支付 */
+    @Excel(name = "way 字段中标识了支付渠道: 1-微信支付,2-支付宝支付,10-抖音支付")
+    @TableField("way")
+    @ApiModelProperty(value = "way 字段中标识了支付渠道: 1-微信支付,2-支付宝支付,10-抖音支付")
+    private String way;
+
+    /** 退款原因 */
+    @Excel(name = "退款原因")
+    @TableField("refund_reason")
+    @ApiModelProperty(value = "退款原因")
+    private String refundReason;
+
+    /** 支付渠道侧单号 */
+    @Excel(name = "支付渠道侧单号")
+    @TableField("channel_no")
+    @ApiModelProperty(value = "支付渠道侧单号")
+    private String channelNo;
+
+    /** 支付渠道侧商家订单号 */
+    @Excel(name = "支付渠道侧商家订单号")
+    @TableField("payment_order_no")
+    @ApiModelProperty(value = "支付渠道侧商家订单号")
+    private String paymentOrderNo;
+
+    /** 交易类型,枚举值 */
+    @Excel(name = "交易类型,枚举值")
+    @TableField("trade_type")
+    @ApiModelProperty(value = "交易类型,枚举值")
+    private String tradeType;
+
+    /** 固定SUCCESS */
+    @Excel(name = "固定SUCCESS")
+    @TableField("status")
+    @ApiModelProperty(value = "固定SUCCESS")
+    private String status;
+
+    /** 银行类型 */
+    @Excel(name = "银行类型")
+    @TableField("bank_type")
+    @ApiModelProperty(value = "银行类型")
+    private String bankType;
+
+    /** 附加数据 */
+    @Excel(name = "附加数据")
+    @TableField("cp_extra")
+    @ApiModelProperty(value = "附加数据")
+    private String cpExtra;
+
+    /** 支付完成时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "支付完成时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("paid_at")
+    @ApiModelProperty(value = "支付完成时间")
+    private Date paidAt;
+
+    /** 订单来源视频对应视频 id */
+    @Excel(name = "订单来源视频对应视频 id")
+    @TableField("item_id")
+    @ApiModelProperty(value = "订单来源视频对应视频 id")
+    private String itemId;
+
+    /** 该笔交易卖家商户号 */
+    @Excel(name = "该笔交易卖家商户号")
+    @TableField("seller_uid")
+    @ApiModelProperty(value = "该笔交易卖家商户号")
+    private String sellerUid;
+
+    /** unionid */
+    @Excel(name = "unionid")
+    @TableField("union_id")
+    @ApiModelProperty(value = "unionid")
+    private String unionId;
+
+    /** 小程序端openid */
+    @Excel(name = "小程序端openid")
+    @TableField("xcx_openid")
+    @ApiModelProperty(value = "小程序端openid")
+    private String xcxOpenid;
+
+    /** 用户在直连商户appid下的唯一标识 */
+    @Excel(name = "用户在直连商户appid下的唯一标识")
+    @TableField("app_openid")
+    @ApiModelProperty(value = "用户在直连商户appid下的唯一标识")
+    private String appOpenid;
+
+    /** 总金额 */
+    @Excel(name = "总金额")
+    @TableField("total_amount")
+    @ApiModelProperty(value = "总金额")
+    private Long totalAmount;
+
+    public void setId(Long id){
+        this.id = id;
+    }
+
+    public Long getId(){
+        return id;
+    }
+    public void setCpOrderno(String cpOrderno){
+        this.cpOrderno = cpOrderno;
+    }
+
+    public String getCpOrderno(){
+        return cpOrderno;
+    }
+    public void setOutRefundNo(String outRefundNo){
+        this.outRefundNo = outRefundNo;
+    }
+
+    public String getOutRefundNo(){
+        return outRefundNo;
+    }
+    public void setWay(String way){
+        this.way = way;
+    }
+
+    public String getWay(){
+        return way;
+    }
+    public void setRefundReason(String refundReason){
+        this.refundReason = refundReason;
+    }
+
+    public String getRefundReason(){
+        return refundReason;
+    }
+    public void setChannelNo(String channelNo){
+        this.channelNo = channelNo;
+    }
+
+    public String getChannelNo(){
+        return channelNo;
+    }
+    public void setPaymentOrderNo(String paymentOrderNo){
+        this.paymentOrderNo = paymentOrderNo;
+    }
+
+    public String getPaymentOrderNo(){
+        return paymentOrderNo;
+    }
+    public void setTradeType(String tradeType){
+        this.tradeType = tradeType;
+    }
+
+    public String getTradeType(){
+        return tradeType;
+    }
+    public void setStatus(String status){
+        this.status = status;
+    }
+
+    public String getStatus(){
+        return status;
+    }
+    public void setBankType(String bankType){
+        this.bankType = bankType;
+    }
+
+    public String getBankType(){
+        return bankType;
+    }
+    public void setCpExtra(String cpExtra){
+        this.cpExtra = cpExtra;
+    }
+
+    public String getCpExtra(){
+        return cpExtra;
+    }
+    public void setPaidAt(Date paidAt){
+        this.paidAt = paidAt;
+    }
+
+    public Date getPaidAt(){
+        return paidAt;
+    }
+    public void setItemId(String itemId){
+        this.itemId = itemId;
+    }
+
+    public String getItemId(){
+        return itemId;
+    }
+    public void setSellerUid(String sellerUid){
+        this.sellerUid = sellerUid;
+    }
+
+    public String getSellerUid(){
+        return sellerUid;
+    }
+    public void setUnionId(String unionId){
+        this.unionId = unionId;
+    }
+
+    public String getUnionId(){
+        return unionId;
+    }
+    public void setXcxOpenid(String xcxOpenid){
+        this.xcxOpenid = xcxOpenid;
+    }
+
+    public String getXcxOpenid(){
+        return xcxOpenid;
+    }
+    public void setAppOpenid(String appOpenid){
+        this.appOpenid = appOpenid;
+    }
+
+    public String getAppOpenid(){
+        return appOpenid;
+    }
+    public void setTotalAmount(Long totalAmount){
+        this.totalAmount = totalAmount;
+    }
+
+    public Long getTotalAmount(){
+        return totalAmount;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("cpOrderno", getCpOrderno())
+            .append("outRefundNo", getOutRefundNo())
+            .append("way", getWay())
+            .append("refundReason", getRefundReason())
+            .append("channelNo", getChannelNo())
+            .append("paymentOrderNo", getPaymentOrderNo())
+            .append("tradeType", getTradeType())
+            .append("status", getStatus())
+            .append("bankType", getBankType())
+            .append("cpExtra", getCpExtra())
+            .append("paidAt", getPaidAt())
+            .append("itemId", getItemId())
+            .append("sellerUid", getSellerUid())
+            .append("unionId", getUnionId())
+            .append("xcxOpenid", getXcxOpenid())
+            .append("appOpenid", getAppOpenid())
+            .append("totalAmount", getTotalAmount())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 22 - 0
sdjk-service/src/main/java/com/miaxis/tt/mapper/TtOrderMapper.java

@@ -0,0 +1,22 @@
+package com.miaxis.tt.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.miaxis.tt.domain.TtOrder;
+
+/**
+ * 头条订单Mapper接口
+ *
+ * @author miaxis
+ * @date 2022-05-19
+ */
+public interface TtOrderMapper extends BaseMapper<TtOrder> {
+    /**
+     * 查询头条订单列表
+     *
+     * @param ttOrder 头条订单
+     * @return 头条订单集合
+     */
+    public List<TtOrder> selectTtOrderList(TtOrder ttOrder);
+
+}

+ 21 - 0
sdjk-service/src/main/java/com/miaxis/tt/service/ITtOrderService.java

@@ -0,0 +1,21 @@
+package com.miaxis.tt.service;
+
+import java.util.List;
+import com.miaxis.tt.domain.TtOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 头条订单Service接口
+ *
+ * @author miaxis
+ * @date 2022-05-19
+ */
+public interface ITtOrderService extends IService<TtOrder>{
+    /**
+     * 查询头条订单列表
+     *
+     * @param ttOrder 头条订单
+     * @return 头条订单集合
+     */
+    public List<TtOrder> selectTtOrderList(TtOrder ttOrder);
+}

+ 36 - 0
sdjk-service/src/main/java/com/miaxis/tt/service/impl/TtOrderServiceImpl.java

@@ -0,0 +1,36 @@
+package com.miaxis.tt.service.impl;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.miaxis.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.apache.commons.lang3.StringUtils;
+import com.miaxis.tt.mapper.TtOrderMapper;
+import com.miaxis.tt.domain.TtOrder;
+import com.miaxis.tt.service.ITtOrderService;
+
+/**
+ * 头条订单Service业务层处理
+ *
+ * @author miaxis
+ * @date 2022-05-19
+ */
+@Service
+public class TtOrderServiceImpl extends ServiceImpl<TtOrderMapper, TtOrder> implements ITtOrderService {
+    @Autowired
+    private TtOrderMapper ttOrderMapper;
+
+    /**
+     * 查询头条订单列表
+     *
+     * @param ttOrder 头条订单
+     * @return 头条订单
+     */
+    @Override
+    public List<TtOrder> selectTtOrderList(TtOrder ttOrder){
+        return ttOrderMapper.selectTtOrderList(ttOrder);
+    }
+}

+ 57 - 0
sdjk-service/src/main/resources/mapper/tt/TtOrderMapper.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.miaxis.tt.mapper.TtOrderMapper">
+
+    <resultMap type="TtOrder" id="TtOrderResult">
+        <result property="id"    column="id"    />
+        <result property="cpOrderno"    column="cp_orderno"    />
+        <result property="outRefundNo"    column="out_refund_no"    />
+        <result property="way"    column="way"    />
+        <result property="refundReason"    column="refund_reason"    />
+        <result property="channelNo"    column="channel_no"    />
+        <result property="paymentOrderNo"    column="payment_order_no"    />
+        <result property="tradeType"    column="trade_type"    />
+        <result property="status"    column="status"    />
+        <result property="bankType"    column="bank_type"    />
+        <result property="cpExtra"    column="cp_extra"    />
+        <result property="paidAt"    column="paid_at"    />
+        <result property="itemId"    column="item_id"    />
+        <result property="sellerUid"    column="seller_uid"    />
+        <result property="unionId"    column="union_id"    />
+        <result property="xcxOpenid"    column="xcx_openid"    />
+        <result property="appOpenid"    column="app_openid"    />
+        <result property="totalAmount"    column="total_amount"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectTtOrderVo">
+        select * from tt_order
+    </sql>
+
+    <select id="selectTtOrderList" parameterType="TtOrder" resultMap="TtOrderResult">
+        <include refid="selectTtOrderVo"/>
+        <where>
+            <if test="cpOrderno != null  and cpOrderno != ''"> and cp_orderno = #{cpOrderno}</if>
+            <if test="outRefundNo != null  and outRefundNo != ''"> and out_refund_no = #{outRefundNo}</if>
+            <if test="way != null  and way != ''"> and way = #{way}</if>
+            <if test="refundReason != null  and refundReason != ''"> and refund_reason = #{refundReason}</if>
+            <if test="channelNo != null  and channelNo != ''"> and channel_no = #{channelNo}</if>
+            <if test="paymentOrderNo != null  and paymentOrderNo != ''"> and payment_order_no = #{paymentOrderNo}</if>
+            <if test="tradeType != null  and tradeType != ''"> and trade_type = #{tradeType}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="bankType != null  and bankType != ''"> and bank_type = #{bankType}</if>
+            <if test="cpExtra != null  and cpExtra != ''"> and cp_extra = #{cpExtra}</if>
+            <if test="paidAt != null "> and paid_at = #{paidAt}</if>
+            <if test="itemId != null  and itemId != ''"> and item_id = #{itemId}</if>
+            <if test="sellerUid != null  and sellerUid != ''"> and seller_uid = #{sellerUid}</if>
+            <if test="unionId != null  and unionId != ''"> and union_id = #{unionId}</if>
+            <if test="xcxOpenid != null  and xcxOpenid != ''"> and xcx_openid = #{xcxOpenid}</if>
+            <if test="appOpenid != null  and appOpenid != ''"> and app_openid = #{appOpenid}</if>
+            <if test="totalAmount != null "> and total_amount = #{totalAmount}</if>
+        </where>
+    </select>
+
+</mapper>