he2802 před 4 roky
rodič
revize
245c7ca964
17 změnil soubory, kde provedl 878 přidání a 43 odebrání
  1. 3 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/collect/CollectQuestionController.java
  2. 4 4
      zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxPayController.java
  3. 60 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/config/WxSmallConfig.java
  4. 690 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/wxpay/WXPay.java
  5. 5 5
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/wxpay/WXPayConfig.java
  6. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/bo/CollectQuestionAddBo.java
  7. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/bo/CollectQuestionEditBo.java
  8. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/bo/CollectQuestionQueryBo.java
  9. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/domain/CollectQuestion.java
  10. 2 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/mapper/CollectQuestionMapper.java
  11. 7 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/service/ICollectQuestionService.java
  12. 10 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/service/impl/CollectQuestionServiceImpl.java
  13. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/vo/CollectQuestionVo.java
  14. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxPayBody.java
  15. 1 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxPayService.java
  16. 35 26
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  17. 17 0
      zhongzheng-system/src/main/resources/mapper/modules/collect/CollectQuestionMapper.xml

+ 3 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/collect/CollectQuestionController.java

@@ -5,6 +5,7 @@ import java.util.Arrays;
 
 
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionAddBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionAddBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionEditBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionEditBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
@@ -53,11 +54,11 @@ public class CollectQuestionController extends BaseController {
      */
      */
     @ApiOperation("查询收藏题目列表")
     @ApiOperation("查询收藏题目列表")
     @GetMapping("/list")
     @GetMapping("/list")
-    public TableDataInfo<CollectQuestionVo> list(CollectQuestionQueryBo bo) {
+    public TableDataInfo<QuestionVo> list(CollectQuestionQueryBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         bo.setUserId(loginUser.getUser().getUserId());
         bo.setUserId(loginUser.getUser().getUserId());
         startPage();
         startPage();
-        List<CollectQuestionVo> list = iCollectQuestionService.queryList(bo);
+        List<QuestionVo> list = iCollectQuestionService.selectList(bo);
         return getDataTable(list);
         return getDataTable(list);
     }
     }
 
 

+ 4 - 4
zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxPayController.java

@@ -10,6 +10,7 @@ import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
+import com.zhongzheng.modules.wx.bo.WxPayBody;
 import com.zhongzheng.modules.wx.service.IWxPayService;
 import com.zhongzheng.modules.wx.service.IWxPayService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -40,14 +41,13 @@ public class WxPayController
     /**
     /**
      * 支付方法
      * 支付方法
      *
      *
-     * @param loginBody 获取支付凭证
+     * @param wxPayBody 获取支付凭证
      * @return 结果
      * @return 结果
      */
      */
     @ApiOperation("获取支付凭证")
     @ApiOperation("获取支付凭证")
     @PostMapping("/payment")
     @PostMapping("/payment")
-    public AjaxResult payment(@RequestBody WxLoginBody loginBody) throws Exception {
-        iWxPayService.payment("34");
-        return AjaxResult.success();
+    public AjaxResult payment(@RequestBody WxPayBody wxPayBody) throws Exception {
+        return AjaxResult.success(iWxPayService.payment("34"));
     }
     }
 
 
     @ApiOperation("获取支付回调凭证")
     @ApiOperation("获取支付回调凭证")

+ 60 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/config/WxSmallConfig.java

@@ -0,0 +1,60 @@
+package com.zhongzheng.common.config;
+
+import com.zhongzheng.common.utils.wxpay.IWXPayDomain;
+import com.zhongzheng.common.utils.wxpay.WXPayConfig;
+import com.zhongzheng.common.utils.wxpay.WXPayConstants;
+import org.springframework.beans.factory.annotation.Value;
+
+import java.io.InputStream;
+
+public class WxSmallConfig extends WXPayConfig {
+
+    private String appid;
+
+    private String mchid;
+
+    private String key;
+
+    public WxSmallConfig(String appid,String mchid,String key)  {
+      this.appid = appid;
+      this.mchid = mchid;
+      this.key = key;
+    }
+    @Override
+    public String getAppID() {
+        return appid;
+    }
+
+    @Override
+    public String getMchID() {
+        return mchid;
+    }
+
+    @Override
+    public String getKey() {
+        return key;
+    }
+
+    @Override
+    public InputStream getCertStream() {
+        return null;
+    }
+
+    @Override
+    public IWXPayDomain getWXPayDomain() {
+
+        // 这个方法需要这样实现, 否则无法正常初始化WXPay
+        IWXPayDomain iwxPayDomain = new IWXPayDomain() {
+
+            public void report(String domain, long elapsedTimeMillis, Exception ex) {
+
+            }
+
+            public DomainInfo getDomain(WXPayConfig config) {
+                return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
+            }
+        };
+        return iwxPayDomain;
+
+    }
+}

+ 690 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/wxpay/WXPay.java

@@ -0,0 +1,690 @@
+package com.zhongzheng.common.utils.wxpay;
+
+import com.zhongzheng.common.utils.wxpay.WXPayConstants.SignType;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPay {
+
+    private WXPayConfig config;
+    private SignType signType;
+    private boolean autoReport;
+    private boolean useSandbox;
+    private String notifyUrl;
+    private WXPayRequest wxPayRequest;
+
+    public WXPay(final WXPayConfig config) throws Exception {
+        this(config, null, true, false);
+    }
+
+    public WXPay(final WXPayConfig config, final boolean autoReport) throws Exception {
+        this(config, null, autoReport, false);
+    }
+
+
+    public WXPay(final WXPayConfig config, final boolean autoReport, final boolean useSandbox) throws Exception{
+        this(config, null, autoReport, useSandbox);
+    }
+
+    public WXPay(final WXPayConfig config, final String notifyUrl) throws Exception {
+        this(config, notifyUrl, true, false);
+    }
+
+    public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport) throws Exception {
+        this(config, notifyUrl, autoReport, false);
+    }
+
+    public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
+        this.config = config;
+        this.notifyUrl = notifyUrl;
+        this.autoReport = autoReport;
+        this.useSandbox = useSandbox;
+        if (useSandbox) {
+            this.signType = SignType.MD5; // 沙箱环境
+        }
+        else {
+        //    this.signType = SignType.HMACSHA256;
+            this.signType = SignType.MD5;
+        }
+        this.wxPayRequest = new WXPayRequest(config);
+    }
+
+    private void checkWXPayConfig() throws Exception {
+        if (this.config == null) {
+            throw new Exception("config is null");
+        }
+        if (this.config.getAppID() == null || this.config.getAppID().trim().length() == 0) {
+            throw new Exception("appid in config is empty");
+        }
+        if (this.config.getMchID() == null || this.config.getMchID().trim().length() == 0) {
+            throw new Exception("appid in config is empty");
+        }
+        if (this.config.getCertStream() == null) {
+            throw new Exception("cert stream in config is empty");
+        }
+        if (this.config.getWXPayDomain() == null){
+            throw new Exception("config.getWXPayDomain() is null");
+        }
+
+        if (this.config.getHttpConnectTimeoutMs() < 10) {
+            throw new Exception("http connect timeout is too small");
+        }
+        if (this.config.getHttpReadTimeoutMs() < 10) {
+            throw new Exception("http read timeout is too small");
+        }
+
+    }
+
+    /**
+     * 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
+     * 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
+     *
+     * @param reqData
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
+        reqData.put("appid", config.getAppID());
+        reqData.put("mch_id", config.getMchID());
+        reqData.put("nonce_str", WXPayUtil.generateNonceStr());
+        if (SignType.MD5.equals(this.signType)) {
+            reqData.put("sign_type", WXPayConstants.MD5);
+        }
+        else if (SignType.HMACSHA256.equals(this.signType)) {
+            reqData.put("sign_type", WXPayConstants.HMACSHA256);
+        }
+        reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));
+        return reqData;
+    }
+
+    /**
+     * 判断xml数据的sign是否有效,必须包含sign字段,否则返回false。
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return 签名是否有效
+     * @throws Exception
+     */
+    public boolean isResponseSignatureValid(Map<String, String> reqData) throws Exception {
+        // 返回数据的签名方式和请求中给定的签名方式是一致的
+        return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), this.signType);
+    }
+
+    /**
+     * 判断支付结果通知中的sign是否有效
+     *
+     * @param reqData 向wxpay post的请求数据
+     * @return 签名是否有效
+     * @throws Exception
+     */
+    public boolean isPayResultNotifySignatureValid(Map<String, String> reqData) throws Exception {
+        String signTypeInData = reqData.get(WXPayConstants.FIELD_SIGN_TYPE);
+        SignType signType;
+        if (signTypeInData == null) {
+            signType = SignType.MD5;
+        }
+        else {
+            signTypeInData = signTypeInData.trim();
+            if (signTypeInData.length() == 0) {
+                signType = SignType.MD5;
+            }
+            else if (WXPayConstants.MD5.equals(signTypeInData)) {
+                signType = SignType.MD5;
+            }
+            else if (WXPayConstants.HMACSHA256.equals(signTypeInData)) {
+                signType = SignType.HMACSHA256;
+            }
+            else {
+                throw new Exception(String.format("Unsupported sign_type: %s", signTypeInData));
+            }
+        }
+        return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), signType);
+    }
+
+
+    /**
+     * 不需要证书的请求
+     * @param urlSuffix String
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 超时时间,单位是毫秒
+     * @param readTimeoutMs 超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public String requestWithoutCert(String urlSuffix, Map<String, String> reqData,
+                                     int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String msgUUID = reqData.get("nonce_str");
+        String reqBody = WXPayUtil.mapToXml(reqData);
+
+        String resp = this.wxPayRequest.requestWithoutCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, autoReport);
+        return resp;
+    }
+
+
+    /**
+     * 需要证书的请求
+     * @param urlSuffix String
+     * @param reqData 向wxpay post的请求数据  Map
+     * @param connectTimeoutMs 超时时间,单位是毫秒
+     * @param readTimeoutMs 超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public String requestWithCert(String urlSuffix, Map<String, String> reqData,
+                                  int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String msgUUID= reqData.get("nonce_str");
+        String reqBody = WXPayUtil.mapToXml(reqData);
+
+        String resp = this.wxPayRequest.requestWithCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, this.autoReport);
+        return resp;
+    }
+
+    /**
+     * 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。
+     * @param xmlStr API返回的XML格式数据
+     * @return Map类型数据
+     * @throws Exception
+     */
+    public Map<String, String> processResponseXml(String xmlStr) throws Exception {
+        String RETURN_CODE = "return_code";
+        String return_code;
+        Map<String, String> respData = WXPayUtil.xmlToMap(xmlStr);
+        if (respData.containsKey(RETURN_CODE)) {
+            return_code = respData.get(RETURN_CODE);
+        }
+        else {
+            throw new Exception(String.format("No `return_code` in XML: %s", xmlStr));
+        }
+
+        if (return_code.equals(WXPayConstants.FAIL)) {
+            return respData;
+        }
+        else if (return_code.equals(WXPayConstants.SUCCESS)) {
+           if (this.isResponseSignatureValid(respData)) {
+               return respData;
+           }
+           else {
+               throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr));
+           }
+        }
+        else {
+            throw new Exception(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr));
+        }
+    }
+
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> microPay(Map<String, String> reqData) throws Exception {
+        return this.microPay(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:提交刷卡支付<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> microPay(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_MICROPAY_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.MICROPAY_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+    /**
+     * 提交刷卡支付,针对软POS,尽可能做成功
+     * 内置重试机制,最多60s
+     * @param reqData
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> microPayWithPos(Map<String, String> reqData) throws Exception {
+        return this.microPayWithPos(reqData, this.config.getHttpConnectTimeoutMs());
+    }
+
+    /**
+     * 提交刷卡支付,针对软POS,尽可能做成功
+     * 内置重试机制,最多60s
+     * @param reqData
+     * @param connectTimeoutMs
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> microPayWithPos(Map<String, String> reqData, int connectTimeoutMs) throws Exception {
+        int remainingTimeMs = 60*1000;
+        long startTimestampMs = 0;
+        Map<String, String> lastResult = null;
+        Exception lastException = null;
+
+        while (true) {
+            startTimestampMs = WXPayUtil.getCurrentTimestampMs();
+            int readTimeoutMs = remainingTimeMs - connectTimeoutMs;
+            if (readTimeoutMs > 1000) {
+                try {
+                    lastResult = this.microPay(reqData, connectTimeoutMs, readTimeoutMs);
+                    String returnCode = lastResult.get("return_code");
+                    if (returnCode.equals("SUCCESS")) {
+                        String resultCode = lastResult.get("result_code");
+                        String errCode = lastResult.get("err_code");
+                        if (resultCode.equals("SUCCESS")) {
+                            break;
+                        }
+                        else {
+                            // 看错误码,若支付结果未知,则重试提交刷卡支付
+                            if (errCode.equals("SYSTEMERROR") || errCode.equals("BANKERROR") || errCode.equals("USERPAYING")) {
+                                remainingTimeMs = remainingTimeMs - (int)(WXPayUtil.getCurrentTimestampMs() - startTimestampMs);
+                                if (remainingTimeMs <= 100) {
+                                    break;
+                                }
+                                else {
+                                    WXPayUtil.getLogger().info("microPayWithPos: try micropay again");
+                                    if (remainingTimeMs > 5*1000) {
+                                        Thread.sleep(5*1000);
+                                    }
+                                    else {
+                                        Thread.sleep(1*1000);
+                                    }
+                                    continue;
+                                }
+                            }
+                            else {
+                                break;
+                            }
+                        }
+                    }
+                    else {
+                        break;
+                    }
+                }
+                catch (Exception ex) {
+                    lastResult = null;
+                    lastException = ex;
+                }
+            }
+            else {
+                break;
+            }
+        }
+
+        if (lastResult == null) {
+            throw lastException;
+        }
+        else {
+            return lastResult;
+        }
+    }
+
+
+
+    /**
+     * 作用:统一下单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> unifiedOrder(Map<String, String> reqData) throws Exception {
+        return this.unifiedOrder(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:统一下单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> unifiedOrder(Map<String, String> reqData,  int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_UNIFIEDORDER_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.UNIFIEDORDER_URL_SUFFIX;
+        }
+        if(this.notifyUrl != null) {
+            reqData.put("notify_url", this.notifyUrl);
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:查询订单<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> orderQuery(Map<String, String> reqData) throws Exception {
+        return this.orderQuery(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:查询订单<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据 int
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> orderQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_ORDERQUERY_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.ORDERQUERY_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:撤销订单<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> reverse(Map<String, String> reqData) throws Exception {
+        return this.reverse(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:撤销订单<br>
+     * 场景:刷卡支付<br>
+     * 其他:需要证书
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> reverse(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REVERSE_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.REVERSE_URL_SUFFIX;
+        }
+        String respXml = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:关闭订单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> closeOrder(Map<String, String> reqData) throws Exception {
+        return this.closeOrder(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:关闭订单<br>
+     * 场景:公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> closeOrder(Map<String, String> reqData,  int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_CLOSEORDER_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.CLOSEORDER_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:申请退款<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refund(Map<String, String> reqData) throws Exception {
+        return this.refund(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:申请退款<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
+     * 其他:需要证书
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refund(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REFUND_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.REFUND_URL_SUFFIX;
+        }
+        String respXml = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:退款查询<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refundQuery(Map<String, String> reqData) throws Exception {
+        return this.refundQuery(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:退款查询<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> refundQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REFUNDQUERY_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.REFUNDQUERY_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:对账单下载(成功时返回对账单数据,失败时返回XML格式数据)<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> downloadBill(Map<String, String> reqData) throws Exception {
+        return this.downloadBill(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:对账单下载<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
+     * 其他:无论是否成功都返回Map。若成功,返回的Map中含有return_code、return_msg、data,
+     *      其中return_code为`SUCCESS`,data为对账单数据。
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return 经过封装的API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> downloadBill(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_DOWNLOADBILL_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.DOWNLOADBILL_URL_SUFFIX;
+        }
+        String respStr = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs).trim();
+        Map<String, String> ret;
+        // 出现错误,返回XML数据
+        if (respStr.indexOf("<") == 0) {
+            ret = WXPayUtil.xmlToMap(respStr);
+        }
+        else {
+            // 正常返回csv数据
+            ret = new HashMap<String, String>();
+            ret.put("return_code", WXPayConstants.SUCCESS);
+            ret.put("return_msg", "ok");
+            ret.put("data", respStr);
+        }
+        return ret;
+    }
+
+
+    /**
+     * 作用:交易保障<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> report(Map<String, String> reqData) throws Exception {
+        return this.report(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:交易保障<br>
+     * 场景:刷卡支付、公共号支付、扫码支付、APP支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> report(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_REPORT_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.REPORT_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return WXPayUtil.xmlToMap(respXml);
+    }
+
+
+    /**
+     * 作用:转换短链接<br>
+     * 场景:刷卡支付、扫码支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> shortUrl(Map<String, String> reqData) throws Exception {
+        return this.shortUrl(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:转换短链接<br>
+     * 场景:刷卡支付、扫码支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> shortUrl(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_SHORTURL_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.SHORTURL_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+    /**
+     * 作用:授权码查询OPENID接口<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> authCodeToOpenid(Map<String, String> reqData) throws Exception {
+        return this.authCodeToOpenid(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
+    }
+
+
+    /**
+     * 作用:授权码查询OPENID接口<br>
+     * 场景:刷卡支付
+     * @param reqData 向wxpay post的请求数据
+     * @param connectTimeoutMs 连接超时时间,单位是毫秒
+     * @param readTimeoutMs 读超时时间,单位是毫秒
+     * @return API返回数据
+     * @throws Exception
+     */
+    public Map<String, String> authCodeToOpenid(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
+        String url;
+        if (this.useSandbox) {
+            url = WXPayConstants.SANDBOX_AUTHCODETOOPENID_URL_SUFFIX;
+        }
+        else {
+            url = WXPayConstants.AUTHCODETOOPENID_URL_SUFFIX;
+        }
+        String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
+        return this.processResponseXml(respXml);
+    }
+
+
+} // end class

+ 5 - 5
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/wxpay/WXPayConfig.java

@@ -11,7 +11,7 @@ public abstract class WXPayConfig {
      *
      *
      * @return App ID
      * @return App ID
      */
      */
-    abstract String getAppID();
+    protected abstract String getAppID();
 
 
 
 
     /**
     /**
@@ -19,7 +19,7 @@ public abstract class WXPayConfig {
      *
      *
      * @return Mch ID
      * @return Mch ID
      */
      */
-    abstract String getMchID();
+    protected abstract String getMchID();
 
 
 
 
     /**
     /**
@@ -27,7 +27,7 @@ public abstract class WXPayConfig {
      *
      *
      * @return API密钥
      * @return API密钥
      */
      */
-    abstract String getKey();
+    protected abstract String getKey();
 
 
 
 
     /**
     /**
@@ -35,7 +35,7 @@ public abstract class WXPayConfig {
      *
      *
      * @return 商户证书内容
      * @return 商户证书内容
      */
      */
-    abstract InputStream getCertStream();
+    protected abstract InputStream getCertStream();
 
 
     /**
     /**
      * HTTP(S) 连接超时时间,单位毫秒
      * HTTP(S) 连接超时时间,单位毫秒
@@ -59,7 +59,7 @@ public abstract class WXPayConfig {
      * 获取WXPayDomain, 用于多域名容灾自动切换
      * 获取WXPayDomain, 用于多域名容灾自动切换
      * @return
      * @return
      */
      */
-    abstract IWXPayDomain getWXPayDomain();
+    protected abstract IWXPayDomain getWXPayDomain();
 
 
     /**
     /**
      * 是否自动上报。
      * 是否自动上报。

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/bo/CollectQuestionAddBo.java

@@ -27,4 +27,6 @@ public class CollectQuestionAddBo {
     /** 添加时间 */
     /** 添加时间 */
     @ApiModelProperty("添加时间")
     @ApiModelProperty("添加时间")
     private Long createTime;
     private Long createTime;
+    @ApiModelProperty("题库ID")
+    private Long bankId;
 }
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/bo/CollectQuestionEditBo.java

@@ -29,4 +29,6 @@ public class CollectQuestionEditBo {
     /** 用户ID */
     /** 用户ID */
     @ApiModelProperty("用户ID")
     @ApiModelProperty("用户ID")
     private Long userId;
     private Long userId;
+    @ApiModelProperty("题库ID")
+    private Long bankId;
 }
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/bo/CollectQuestionQueryBo.java

@@ -43,4 +43,7 @@ public class CollectQuestionQueryBo extends BaseEntity {
 	@ApiModelProperty("用户ID")
 	@ApiModelProperty("用户ID")
 	private Long userId;
 	private Long userId;
 
 
+	@ApiModelProperty("题库ID")
+	private Long bankId;
+
 }
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/domain/CollectQuestion.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.collect.domain;
 package com.zhongzheng.modules.collect.domain;
 
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
@@ -37,5 +38,7 @@ private static final long serialVersionUID=1L;
     /** 添加时间 */
     /** 添加时间 */
     @TableField(fill = FieldFill.INSERT)
     @TableField(fill = FieldFill.INSERT)
     private Long createTime;
     private Long createTime;
+    @ApiModelProperty("题库ID")
+    private Long bankId;
 
 
 }
 }

+ 2 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/mapper/CollectQuestionMapper.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.collect.mapper;
 package com.zhongzheng.modules.collect.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
 import com.zhongzheng.modules.collect.domain.CollectQuestion;
 import com.zhongzheng.modules.collect.domain.CollectQuestion;
 import com.zhongzheng.modules.collect.vo.CollectQuestionVo;
 import com.zhongzheng.modules.collect.vo.CollectQuestionVo;
@@ -15,6 +16,6 @@ import java.util.List;
  */
  */
 public interface CollectQuestionMapper extends BaseMapper<CollectQuestion> {
 public interface CollectQuestionMapper extends BaseMapper<CollectQuestion> {
 
 
-
+    List<QuestionVo> selectList(CollectQuestionQueryBo bo);
 
 
 }
 }

+ 7 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/service/ICollectQuestionService.java

@@ -1,12 +1,11 @@
 package com.zhongzheng.modules.collect.service;
 package com.zhongzheng.modules.collect.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhongzheng.modules.collect.bo.CollectCourseQueryBo;
-import com.zhongzheng.modules.collect.bo.CollectQuestionAddBo;
-import com.zhongzheng.modules.collect.bo.CollectQuestionEditBo;
-import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
+import com.zhongzheng.modules.bank.vo.QuestionVo;
+import com.zhongzheng.modules.collect.bo.*;
 import com.zhongzheng.modules.collect.domain.CollectQuestion;
 import com.zhongzheng.modules.collect.domain.CollectQuestion;
 import com.zhongzheng.modules.collect.vo.CollectCourseVo;
 import com.zhongzheng.modules.collect.vo.CollectCourseVo;
+import com.zhongzheng.modules.collect.vo.CollectNoteVo;
 import com.zhongzheng.modules.collect.vo.CollectQuestionVo;
 import com.zhongzheng.modules.collect.vo.CollectQuestionVo;
 
 
 import java.util.Collection;
 import java.util.Collection;
@@ -25,6 +24,8 @@ public interface ICollectQuestionService extends IService<CollectQuestion> {
 	 */
 	 */
 	CollectQuestionVo queryById(Long collectQuestionId);
 	CollectQuestionVo queryById(Long collectQuestionId);
 
 
+
+
 	CollectQuestion queryQuestionById(Long userID, Long questionId);
 	CollectQuestion queryQuestionById(Long userID, Long questionId);
 
 
 	/**
 	/**
@@ -32,6 +33,8 @@ public interface ICollectQuestionService extends IService<CollectQuestion> {
 	 */
 	 */
 	List<CollectQuestionVo> queryList(CollectQuestionQueryBo bo);
 	List<CollectQuestionVo> queryList(CollectQuestionQueryBo bo);
 
 
+	List<QuestionVo> selectList(CollectQuestionQueryBo bo);
+
 
 
 
 
 	/**
 	/**

+ 10 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/service/impl/CollectQuestionServiceImpl.java

@@ -3,6 +3,8 @@ package com.zhongzheng.modules.collect.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.bank.mapper.QuestionBankExamMapper;
+import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionAddBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionAddBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionEditBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionEditBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
 import com.zhongzheng.modules.collect.bo.CollectQuestionQueryBo;
@@ -11,6 +13,7 @@ import com.zhongzheng.modules.collect.domain.CollectQuestion;
 import com.zhongzheng.modules.collect.mapper.CollectQuestionMapper;
 import com.zhongzheng.modules.collect.mapper.CollectQuestionMapper;
 import com.zhongzheng.modules.collect.service.ICollectQuestionService;
 import com.zhongzheng.modules.collect.service.ICollectQuestionService;
 import com.zhongzheng.modules.collect.vo.CollectQuestionVo;
 import com.zhongzheng.modules.collect.vo.CollectQuestionVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -32,6 +35,9 @@ import java.util.stream.Collectors;
 @Service
 @Service
 public class CollectQuestionServiceImpl extends ServiceImpl<CollectQuestionMapper, CollectQuestion> implements ICollectQuestionService {
 public class CollectQuestionServiceImpl extends ServiceImpl<CollectQuestionMapper, CollectQuestion> implements ICollectQuestionService {
 
 
+    @Autowired
+    private CollectQuestionMapper collectQuestionMapper;
+
     @Override
     @Override
     public CollectQuestionVo queryById(Long collectQuestionId){
     public CollectQuestionVo queryById(Long collectQuestionId){
         CollectQuestion db = this.baseMapper.selectById(collectQuestionId);
         CollectQuestion db = this.baseMapper.selectById(collectQuestionId);
@@ -55,6 +61,10 @@ public class CollectQuestionServiceImpl extends ServiceImpl<CollectQuestionMappe
         return entity2Vo(this.list(lqw));
         return entity2Vo(this.list(lqw));
     }
     }
 
 
+    @Override
+    public List<QuestionVo> selectList(CollectQuestionQueryBo bo) {
+        return collectQuestionMapper.selectList(bo);
+    }
 
 
 
 
     /**
     /**

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/collect/vo/CollectQuestionVo.java

@@ -32,5 +32,7 @@ public class CollectQuestionVo {
 	@Excel(name = "用户ID")
 	@Excel(name = "用户ID")
 	@ApiModelProperty("用户ID")
 	@ApiModelProperty("用户ID")
 	private Long userId;
 	private Long userId;
+	@ApiModelProperty("题库ID")
+	private Long bankId;
 
 
 }
 }

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/bo/WxPayBody.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.wx.bo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 微信登录
+ *
+ * @author hjl
+ * @date 2021-06-28
+ */
+
+@ApiModel("支付参数")
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class WxPayBody {
+
+    /** iv */
+    @ApiModelProperty("订单编号")
+    @NotBlank(message = "订单编号")
+    private String orderNo;
+
+
+
+}

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxPayService.java

@@ -24,7 +24,7 @@ public interface IWxPayService {
 	 * 查询单个
 	 * 查询单个
 	 * @return
 	 * @return
 	 */
 	 */
-	WxPayVo payment(String polyvId) throws Exception;
+	Map<String, Object> payment(String polyvId) throws Exception;
 
 
 
 
 }
 }

+ 35 - 26
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -11,15 +11,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.pagehelper.Page;
 import com.github.pagehelper.Page;
+import com.zhongzheng.common.config.WxSmallConfig;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.SnowflakeIdUtils;
 import com.zhongzheng.common.utils.SnowflakeIdUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.http.HttpUtils;
+import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.common.utils.polyv.PolyvUtils;
 import com.zhongzheng.common.utils.polyv.PolyvUtils;
-import com.zhongzheng.common.utils.wxpay.WXPayConfig;
-import com.zhongzheng.common.utils.wxpay.WXPayConstants;
-import com.zhongzheng.common.utils.wxpay.WXPayRequest;
-import com.zhongzheng.common.utils.wxpay.WXPayUtil;
+import com.zhongzheng.common.utils.wxpay.*;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoAddBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoAddBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoEditBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoEditBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoQueryBo;
 import com.zhongzheng.modules.polyv.bo.PolyvVideoQueryBo;
@@ -81,31 +81,40 @@ public class WxPayServiceImpl  implements IWxPayService {
 
 
 
 
     @Override
     @Override
-    public WxPayVo payment(String polyvId) throws Exception {
-        Map<String, String> reqData = new HashMap<>();
-        this.signType = WXPayConstants.SignType.MD5;
-        reqData.put("attach", "pay");
-        reqData.put("body", "test goods");
-        reqData.put("notify_url", notifyUrl);
-        reqData.put("openid", "owcQx5LtC4XAvz8Q9AQHO1ttTDiA");
-        reqData.put("appid", appid);
-        reqData.put("mch_id", mchid);
-        reqData.put("nonce_str", WXPayUtil.generateNonceStr());
+    public Map<String, Object> payment(String polyvId) throws Exception {
+        WxSmallConfig config = new WxSmallConfig(appid,mchid,key);
+        WXPay wxpay = new WXPay(config);
         SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);
         SnowflakeIdUtils idWorker = new SnowflakeIdUtils(3, 1);
         String out_trade_no = String.valueOf(idWorker.nextId());
         String out_trade_no = String.valueOf(idWorker.nextId());
-        reqData.put("out_trade_no", out_trade_no);
-        reqData.put("total_fee", "1");
-        reqData.put("trade_type", "JSAPI");
-        if (WXPayConstants.SignType.MD5.equals(this.signType)) {
-            reqData.put("sign_type", WXPayConstants.MD5);
+        System.out.println(out_trade_no);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("body", "中正云课堂会员充值");
+        data.put("out_trade_no", out_trade_no);
+        data.put("device_info", "");
+        data.put("fee_type", "CNY");
+        data.put("total_fee", "1");
+        data.put("openid", "owcQx5LtC4XAvz8Q9AQHO1ttTDiA");
+        data.put("spbill_create_ip", IpUtils.getIpAddr(ServletUtils.getRequest()));
+        data.put("notify_url", notifyUrl);
+        data.put("trade_type", "JSAPI");
+
+        try {
+            Map<String, String> resp = wxpay.unifiedOrder(data);
+
+            Map<String, Object> result = new HashMap<>();
+            result.put("provider","wxpay");
+            result.put("nonceStr",resp.get("nonce_str"));
+            result.put("package","prepay_id="+resp.get("prepay_id"));
+            result.put("signType","MD5");
+            result.put("paySign",resp.get("sign"));
+            result.put("timeStamp",DateUtils.getNowTime());
+            System.out.println(resp);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
         }
         }
-        else if (WXPayConstants.SignType.HMACSHA256.equals(this.signType)) {
-            reqData.put("sign_type", WXPayConstants.HMACSHA256);
-        }
-        reqData.put("sign", WXPayUtil.generateSignature(reqData, key, this.signType));
-        String url = WXPayConstants.MICROPAY_URL_SUFFIX;
-        String respXml = this.requestWithoutCert(url, reqData, 6*1000, 8*1000);
-        this.processResponseXml(respXml);
+
         return null;
         return null;
     }
     }
 
 

+ 17 - 0
zhongzheng-system/src/main/resources/mapper/modules/collect/CollectQuestionMapper.xml

@@ -9,7 +9,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="questionId" column="question_id"/>
         <result property="questionId" column="question_id"/>
         <result property="userId" column="user_id"/>
         <result property="userId" column="user_id"/>
         <result property="createTime" column="create_time"/>
         <result property="createTime" column="create_time"/>
+        <result property="bankId" column="bank_id"/>
     </resultMap>
     </resultMap>
 
 
+    <select id="selectList" parameterType="com.zhongzheng.modules.collect.domain.CollectQuestion"  resultType="com.zhongzheng.modules.bank.domain.Question">
+        SELECT
+        q.*
+        FROM
+        collect_question cq
+        LEFT JOIN question q ON cq.question_id = q.question_id
+        WHERE
+        1 = 1
+        <if test="userId != null and userId != ''">
+            AND user_id = #{userId}
+        </if>
+        <if test="bankId != null and bankId != ''">
+            AND bank_id = #{bankId}
+        </if>
+
+    </select>
 
 
 </mapper>
 </mapper>