|
@@ -3,6 +3,11 @@ package com.miaxis.app.controller.wx;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
|
+import com.github.wxpay.sdk.WXPay;
|
|
|
|
+import com.github.wxpay.sdk.WXPayConfig;
|
|
|
|
+import com.github.wxpay.sdk.WXPayConstants;
|
|
|
|
+import com.github.wxpay.sdk.WXPayUtil;
|
|
|
|
+import com.miaxis.common.config.WxPayConfigImpl;
|
|
import com.miaxis.common.config.WxpayConfig;
|
|
import com.miaxis.common.config.WxpayConfig;
|
|
import com.miaxis.common.constant.Constants;
|
|
import com.miaxis.common.constant.Constants;
|
|
import com.miaxis.common.core.controller.BaseController;
|
|
import com.miaxis.common.core.controller.BaseController;
|
|
@@ -12,10 +17,13 @@ import com.miaxis.common.core.domain.entity.UserInfo;
|
|
import com.miaxis.common.enums.OrderStatusEnum;
|
|
import com.miaxis.common.enums.OrderStatusEnum;
|
|
import com.miaxis.common.exception.CustomException;
|
|
import com.miaxis.common.exception.CustomException;
|
|
import com.miaxis.common.utils.SecurityUtils;
|
|
import com.miaxis.common.utils.SecurityUtils;
|
|
|
|
+import com.miaxis.common.utils.XmlUtil;
|
|
import com.miaxis.common.utils.uuid.CommonUtils;
|
|
import com.miaxis.common.utils.uuid.CommonUtils;
|
|
import com.miaxis.system.service.ISysDictDataService;
|
|
import com.miaxis.system.service.ISysDictDataService;
|
|
|
|
+import com.miaxis.wx.domain.WxExtract;
|
|
import com.miaxis.wx.domain.WxOrder;
|
|
import com.miaxis.wx.domain.WxOrder;
|
|
import com.miaxis.wx.dto.WxOrderDTO;
|
|
import com.miaxis.wx.dto.WxOrderDTO;
|
|
|
|
+import com.miaxis.wx.service.IWxExtractService;
|
|
import com.miaxis.wx.service.IWxOrderService;
|
|
import com.miaxis.wx.service.IWxOrderService;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.ApiOperation;
|
|
import io.swagger.annotations.ApiOperation;
|
|
@@ -40,6 +48,8 @@ import java.io.File;
|
|
import java.security.PrivateKey;
|
|
import java.security.PrivateKey;
|
|
import java.security.Signature;
|
|
import java.security.Signature;
|
|
import java.util.Base64;
|
|
import java.util.Base64;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.TreeMap;
|
|
|
|
|
|
import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
|
|
import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
|
|
|
|
|
|
@@ -69,6 +79,10 @@ public class WxController extends BaseController {
|
|
@Autowired
|
|
@Autowired
|
|
private ISysDictDataService dictDataService;
|
|
private ISysDictDataService dictDataService;
|
|
|
|
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IWxExtractService wxExtractService;
|
|
|
|
+
|
|
@Value("${app.appid}")
|
|
@Value("${app.appid}")
|
|
private String appid;
|
|
private String appid;
|
|
@Value("${wxpay.notifyUrl}")
|
|
@Value("${wxpay.notifyUrl}")
|
|
@@ -79,6 +93,7 @@ public class WxController extends BaseController {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 微信支付获取预订单id
|
|
* 微信支付获取预订单id
|
|
*/
|
|
*/
|
|
@@ -191,6 +206,64 @@ public class WxController extends BaseController {
|
|
return jsonObject;
|
|
return jsonObject;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 微信提现
|
|
|
|
+ */
|
|
|
|
+ @PostMapping(value = "/withdraw")
|
|
|
|
+ @ApiOperation("微信提现")
|
|
|
|
+ public Response getPrepareOrder(Integer amount) throws Exception{
|
|
|
|
+
|
|
|
|
+ if (amount == null){
|
|
|
|
+ throw new CustomException("提现金额不能为空");
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if (amount > 200 && amount <0){
|
|
|
|
+ throw new CustomException("提现金额必须在200以内");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return Response.success(withdrawal(amount));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private String withdrawal(Integer amount) throws Exception {
|
|
|
|
+
|
|
|
|
+ Map<String, String> sortMap = new TreeMap<String, String>();
|
|
|
|
+ sortMap.put("mch_appid",appid);
|
|
|
|
+ sortMap.put("mchid",wxpayConfig.getMerchantId());
|
|
|
|
+ sortMap.put("nonce_str",RandomStringUtils.randomAlphanumeric(32));
|
|
|
|
+ sortMap.put("partner_trade_no",getOrderCode(null));
|
|
|
|
+ sortMap.put("openid",SecurityUtils.getLoginUser().getStudent().getOpenid());
|
|
|
|
+ sortMap.put("check_name","NO_CHECK");
|
|
|
|
+ sortMap.put("amount",String.valueOf(amount));
|
|
|
|
+ sortMap.put("desc","用户提现");
|
|
|
|
+
|
|
|
|
+ WXPayConfig config = new WxPayConfigImpl();
|
|
|
|
+ String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.MD5);
|
|
|
|
+ sortMap.put("sign", sign);
|
|
|
|
+ WXPay pay = new WXPay(config);
|
|
|
|
+
|
|
|
|
+ String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
|
|
|
|
+ Map<String, String> resMap;
|
|
|
|
+ String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
|
|
|
|
+ resMap = XmlUtil.xmlToMap(xmlStr);
|
|
|
|
+ if (!"SUCCESS".equals(resMap.get("return_code"))||!"SUCCESS".equals(resMap.get("result_code"))){
|
|
|
|
+ throw new CustomException(resMap.get("return_msg"));
|
|
|
|
+ }
|
|
|
|
+ //新增提现记录
|
|
|
|
+ WxExtract wxExtract = new WxExtract();
|
|
|
|
+ wxExtract.setOpenid(SecurityUtils.getLoginUser().getStudent().getOpenid());
|
|
|
|
+ wxExtract.setExtractPrice(amount);
|
|
|
|
+ wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
|
|
|
|
+ wxExtract.setStatus("1");
|
|
|
|
+ wxExtractService.save(wxExtract);
|
|
|
|
+
|
|
|
|
+ return resMap.get("return_msg");
|
|
|
|
+ }
|
|
|
|
+
|
|
private HttpPost initHttpPost() {
|
|
private HttpPost initHttpPost() {
|
|
HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
|
|
HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
|
|
httpPost.addHeader("Accept", "application/json");
|
|
httpPost.addHeader("Accept", "application/json");
|