解决chongtu \

dev-discount
袁野 4 years ago
commit f3bf9f4dac
  1. 4
      hai-cweb/src/main/java/com/cweb/controller/pay/OrderController.java
  2. 148
      hai-cweb/src/main/java/com/cweb/controller/pay/WechatPayController.java
  3. BIN
      hai-cweb/src/main/resources/privatekey/1289663601_apiclient_cert.p12
  4. BIN
      hai-cweb/src/main/resources/privatekey/1604968055_apiclient_cert.p12
  5. 9
      hai-service/src/main/java/com/hai/common/pay/entity/WeChatPayReqInfo.java
  6. 159
      hai-service/src/main/java/com/hai/common/utils/HttpsUtils.java
  7. 12
      hai-service/src/main/java/com/hai/common/utils/WxUtils.java
  8. 110
      hai-service/src/main/java/com/hai/dao/HighProfitSharingRecordMapper.java
  9. 7
      hai-service/src/main/java/com/hai/dao/HighProfitSharingRecordMapperExt.java
  10. 276
      hai-service/src/main/java/com/hai/dao/HighProfitSharingRecordSqlProvider.java
  11. 178
      hai-service/src/main/java/com/hai/entity/HighProfitSharingRecord.java
  12. 754
      hai-service/src/main/java/com/hai/entity/HighProfitSharingRecordExample.java
  13. 98
      hai-service/src/main/java/com/hai/model/ResultProfitSharing.java
  14. 12
      hai-service/src/main/java/com/hai/service/HighProfitSharingRecordService.java
  15. 20
      hai-service/src/main/java/com/hai/service/impl/HighProfitSharingRecordServiceImpl.java
  16. 1
      hai-service/src/main/java/com/hai/service/pay/PayService.java
  17. 227
      hai-service/src/main/java/com/hai/service/pay/impl/GoodsOrderServiceImpl.java
  18. BIN
      hai-service/src/main/java/privatekey/apiclient_cert.p12
  19. 23
      hai-service/src/main/java/privatekey/apiclient_cert.pem
  20. 28
      hai-service/src/main/java/privatekey/apiclient_key.pem

@ -160,7 +160,9 @@ public class OrderController {
weChatPayReqInfo.setSpbill_create_ip("139.159.177.244"); //终端ip weChatPayReqInfo.setSpbill_create_ip("139.159.177.244"); //终端ip
weChatPayReqInfo.setNotify_url(SysConst.getSysConfig().getNotifyUrl()); //通知url weChatPayReqInfo.setNotify_url(SysConst.getSysConfig().getNotifyUrl()); //通知url
weChatPayReqInfo.setTrade_type("JSAPI"); //交易类型 weChatPayReqInfo.setTrade_type("JSAPI"); //交易类型
weChatPayReqInfo.setAttach(map.get("orderScene").toString()); //附加数据,区分订单类型 weChatPayReqInfo.setAttach(map.get("orderScene").toString());
weChatPayReqInfo.setProfit_sharing("Y");
//附加数据,区分订单类型
Map<String,String> payMap = new HashMap<>(); Map<String,String> payMap = new HashMap<>();
payMap.put("app_id",SysConst.getSysConfig().getWxSubAppId()); payMap.put("app_id",SysConst.getSysConfig().getWxSubAppId());

@ -1,33 +1,55 @@
package com.cweb.controller.pay; package com.cweb.controller.pay;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cweb.config.SysConst;
import com.hai.common.pay.WechatPayUtil; import com.hai.common.pay.WechatPayUtil;
import com.hai.common.pay.entity.WechatCallBackInfo;
import com.hai.common.pay.util.IOUtil; import com.hai.common.pay.util.IOUtil;
import com.hai.common.pay.util.XmlUtil; import com.hai.common.pay.util.XmlUtil;
import com.hai.common.pay.util.sdk.WXPayConstants; import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.utils.HttpsUtils; import com.hai.common.utils.HttpsUtils;
import com.hai.common.utils.ResponseMsgUtil; import com.hai.common.utils.ResponseMsgUtil;
import com.hai.common.utils.WxUtils; import com.hai.common.utils.WxUtils;
import com.hai.entity.BsCompany;
import com.hai.entity.HighProfitSharingRecord;
import com.hai.entity.SecRegion;
import com.hai.model.ResponseData; import com.hai.model.ResponseData;
import com.hai.model.WxSharingOrderRequestModel; import com.hai.model.WxSharingOrderRequestModel;
import com.hai.model.WxSharingReceiversVO; import com.hai.model.WxSharingReceiversVO;
import com.hai.service.TelApiService; import com.hai.service.HighProfitSharingRecordService;
import com.hai.service.pay.NotifyService; import com.hai.service.pay.NotifyService;
import com.hai.service.pay.PayRecordService; import com.hai.service.pay.PayRecordService;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import net.sf.cglib.beans.BeanMap; import net.sf.cglib.beans.BeanMap;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.net.ssl.SSLContext;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.security.*;
import java.util.*; import java.util.*;
@Controller @Controller
@ -47,7 +69,7 @@ public class WechatPayController {
private WechatPayUtil wechatPayUtil; private WechatPayUtil wechatPayUtil;
@Resource @Resource
private TelApiService telApiService; private HighProfitSharingRecordService highProfitSharingRecordService;
@RequestMapping(value = "/notify", method = RequestMethod.POST) @RequestMapping(value = "/notify", method = RequestMethod.POST)
@ApiOperation(value = "微信支付 -> 异步回调") @ApiOperation(value = "微信支付 -> 异步回调")
@ -87,95 +109,21 @@ public class WechatPayController {
} }
} }
/*@RequestMapping(value = "/testCreateOrder", method = RequestMethod.GET)
@ApiOperation(value = "微信测试 创建支付信息(发版时注释此接口)")
@ResponseBody
public SortedMap<Object, Object> testCreateOrder(@RequestParam(value = "subject", required = true) String subject,
@RequestParam(value = "orderNo", required = true) String orderNo,
@RequestParam(value = "totalPrice", required = true) Integer totalPrice,
HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
try {
String nonce_str = MD5Util.MD5Encode(String.valueOf(ThreadLocalRandom.current().nextInt(10000)), "UTF-8");
WeChatPayReqInfo weChatPayReqInfo = new WeChatPayReqInfo();
weChatPayReqInfo.setAppid(wechatConfig.getApp_id()); //公众号id
weChatPayReqInfo.setMch_id(wechatConfig.getMch_id()); //商户号
weChatPayReqInfo.setNonce_str(nonce_str); //随机字符串
weChatPayReqInfo.setBody(subject); //商品描述
weChatPayReqInfo.setOut_trade_no(orderNo); //商户订单号
weChatPayReqInfo.setTotal_fee(totalPrice); //总
weChatPayReqInfo.setSpbill_create_ip("182.43.154.4"); //终端ip
weChatPayReqInfo.setNotify_url(wechatConfig.getNotify_url()); //通知url
//weChatPayReqInfo.setTrade_type("APP"); //交易类型
weChatPayReqInfo.setTrade_type("JSAPI");
//weChatPayReqInfo.setOpenid("");
weChatPayReqInfo.setAttach("Test");
*//** 获取沙箱key start *//*
String sandboxKey = GetSignKey();
*//** 获取沙箱key end *//*
String sign = SignatureUtil.createSign(weChatPayReqInfo, sandboxKey, "UTF-8"); // 测试 todo del
weChatPayReqInfo.setSign(sign);
String unifiedXmL = XmlUtil.toSplitXml(weChatPayReqInfo);
String unifiedOrderResultXmL = HttpReqUtil.HttpsDefaultExecute("POST", wechatConfig.getUnified_order_url(), null, unifiedXmL, null);
log.error("支付信息:" + unifiedOrderResultXmL);
// 签名校验
SortedMap<Object,Object> sortedMap = null;
// 组装支付参数
WechatCallBackInfo wechatCallBackInfo = XmlUtil.getObjectFromXML(unifiedOrderResultXmL, WechatCallBackInfo.class);
Long timeStamp = System.currentTimeMillis()/1000;
sortedMap = new TreeMap<>();
sortedMap.put("appid",wechatConfig.getApp_id());
sortedMap.put("partnerid",wechatConfig.getMch_id());
sortedMap.put("prepayid",wechatCallBackInfo.getPrepay_id());
sortedMap.put("noncestr",wechatCallBackInfo.getNonce_str());
sortedMap.put("timestamp",timeStamp);
sortedMap.put("package","Sign=WXPay");
String secondSign = SignatureUtil.createSign(sortedMap, wechatConfig.getApi_key(), "UTF-8");
sortedMap.put("sign",secondSign);
return sortedMap;
} catch (Exception e) {
log.error("AlipayTest -> createOrder:生成订单错误", e);
}
return null;
}*/
/**
* @desc 获取沙箱key
*/
/*public String GetSignKey() throws Exception {
String nonce_str = WXPayUtil.generateNonceStr(); //生成随机字符
Map<String, String> param = new HashMap<>();
param.put("mch_id", wechatConfig.getMch_id()); //需要真实商户号
param.put("nonce_str", nonce_str); //随机字符
String sign = WXPayUtil.generateSignature(param, wechatConfig.getApi_key(), WXPayConstants.SignType.MD5); //通过SDK生成签名其中API_KEY为商户对应的真实密钥
param.put("sign", sign);
String xml = WXPayUtil.mapToXml(param); //将map转换为xml格式
String url = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey"; //沙箱密钥获取api
String signKey = HttpUtil.post(url, xml);
System.out.println("signkey+"+signKey);
Map<String, String> param1 = new HashMap<String, String>();
param1 = WXPayUtil.xmlToMap(signKey.toString());
String key = param1.get("sandbox_signkey");
return key;
}*/
@RequestMapping(value = "/addLedgerReceiver", method = RequestMethod.POST) @RequestMapping(value = "/addLedgerReceiver", method = RequestMethod.POST)
@ApiOperation(value = "微信支付 -> 添加分账接收方") @ApiOperation(value = "微信支付 -> 添加分账接收方")
public void addLedgerReceiver(HttpServletRequest request, HttpServletResponse response) { public void addLedgerReceiver(HttpServletRequest request, HttpServletResponse response) {
try { try {
WxSharingReceiversVO receiversVO = new WxSharingReceiversVO(); WxSharingReceiversVO receiversVO = new WxSharingReceiversVO();
receiversVO.setAccount("1609882817"); receiversVO.setAccount("1603942866");
receiversVO.setType("MERCHANT_ID"); receiversVO.setType("MERCHANT_ID");
receiversVO.setName("嗨加油"); receiversVO.setName("重庆惠昕石化有限责任公司");
receiversVO.setRelation_type("SERVICE_PROVIDER"); receiversVO.setRelation_type("SERVICE_PROVIDER");
Map<String , String> map = new HashMap<>(); Map<String , String> map = new HashMap<>();
map.put("mch_id" , "1289663601"); map.put("mch_id" , "1289663601");
map.put("sub_mch_id" , "1609882817");
map.put("appid" , "wx637bd6f7314daa46"); map.put("appid" , "wx637bd6f7314daa46");
map.put("nonce_str" , WxUtils.makeNonStr()); map.put("nonce_str" , WxUtils.makeNonStr());
map.put("sign_type" , "HMAC-SHA256"); map.put("sign_type" , "HMAC-SHA256");
@ -196,16 +144,38 @@ public class WechatPayController {
} }
} }
@RequestMapping(value = "/telApi", method = RequestMethod.GET)
@ApiOperation(value = "电话查询") String getToken(String method, String url, String body) throws UnsupportedEncodingException, SignatureException, NoSuchAlgorithmException, InvalidKeyException, FileNotFoundException {
public ResponseData addLedgerReceiver(@RequestParam(value = "tel", required = true) String tel) {
try { long timeMillis = System.currentTimeMillis();
JSONObject jsonObject = telApiService.outApiTel(tel); String nonceStr = String.valueOf(timeMillis);
return ResponseMsgUtil.success(jsonObject); long timestamp = System.currentTimeMillis() / 1000;
} catch (Exception e) { String message = buildMessage(method, url, timestamp, nonceStr, body);
log.error("WechatPayController --> wechatNotify() error!", e); PrivateKey privateKey = PemUtil.loadPrivateKey(new FileInputStream("G:/hurui-project/hai-parent/hai-cweb/src/main/resources/privatekey/apiclient_key.pem"));
return ResponseMsgUtil.exception(e); String signature = sign(privateKey,message.getBytes("utf-8"));
}
return "mchid=\"" + SysConst.getSysConfig().getWxSubMchId() + "\","
+ "nonce_str=\"" + nonceStr + "\","
+ "timestamp=\"" + timestamp + "\","
+ "serial_no=\"" + "1B08DC2A078B0B1F77A65C97C445AAD545B5EAA6" + "\","
+ "signature=\"" + signature + "\"";
}
String sign(PrivateKey privateKey,byte[] message) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException {
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(privateKey);
sign.update(message);
return Base64.getEncoder().encodeToString(sign.sign());
} }
String buildMessage(String method, String url, long timestamp, String nonceStr, String body) {
return method + "\n"
+ url + "\n"
+ timestamp + "\n"
+ nonceStr + "\n"
+ body + "\n";
}
} }

@ -30,6 +30,15 @@ public class WeChatPayReqInfo implements Serializable {
private String limit_pay; // 指定支付方式 no_credit--可限制用户不能使用信用卡支付 private String limit_pay; // 指定支付方式 no_credit--可限制用户不能使用信用卡支付
private String openid; // 用户标识(trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识) private String openid; // 用户标识(trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识)
private String sub_openid; // 用户标识(trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识) private String sub_openid; // 用户标识(trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识)
private String profit_sharing;
public String getProfit_sharing() {
return profit_sharing;
}
public void setProfit_sharing(String profit_sharing) {
this.profit_sharing = profit_sharing;
}
public String getSub_openid() { public String getSub_openid() {
return sub_openid; return sub_openid;

@ -3,6 +3,7 @@ package com.hai.common.utils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.hai.common.pay.util.IOUtil;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
@ -14,6 +15,7 @@ import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity; import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
@ -28,10 +30,13 @@ import org.slf4j.LoggerFactory;
import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
@ -121,47 +126,6 @@ public class HttpsUtils {
return null; return null;
} }
public static JSONObject doGet(String url, Map<String, String> params , Map<String , String> headers) {
String apiUrl = url;
StringBuffer param = new StringBuffer();
int i = 0;
for (String key : params.keySet()) {
if (i == 0)
param.append("?");
else
param.append("&");
param.append(key).append("=").append(params.get(key));
i++;
}
apiUrl += param;
String result = null;
HttpClient httpClient = null;
try {
if (apiUrl.startsWith("https")) {
httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory())
.setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
} else {
httpClient = HttpClients.createDefault();
}
HttpGet httpGet = new HttpGet(apiUrl);
for (Map.Entry<String, String> e : headers.entrySet()) {
httpGet.addHeader(e.getKey(), e.getValue());
}
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
result = IOUtils.toString(instream, "UTF-8");
}
return JSON.parseObject(result);
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return null;
}
public static JSONObject doWxGet(String url, Map<String, Object> params) { public static JSONObject doWxGet(String url, Map<String, Object> params) {
String apiUrl = url; String apiUrl = url;
StringBuffer param = new StringBuffer(); StringBuffer param = new StringBuffer();
@ -199,8 +163,6 @@ public class HttpsUtils {
} }
return null; return null;
} }
// public static JSONObject doGet(String url ,)
/** /**
* 发送 POST 请求HTTP不带输入数据 * 发送 POST 请求HTTP不带输入数据
@ -302,6 +264,45 @@ public class HttpsUtils {
return null; return null;
} }
public static JSONObject doWxPost(String apiUrl, Map<String,String> body, Map<String,Object> header) {
CloseableHttpClient httpClient = null;
if (apiUrl.startsWith("https")) {
httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory())
.setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
} else {
httpClient = HttpClients.createDefault();
}
String httpStr = null;
CloseableHttpResponse response = null;
try {
HttpPost httpPost = new HttpPost(apiUrl);
httpPost.setConfig(requestConfig);
for (Map.Entry<String, Object> entry : header.entrySet()) {
httpPost.setHeader(entry.getKey(), entry.getValue().toString());
}
StringEntity stringEntity = new StringEntity(JSON.toJSONString(body), "UTF-8");// 解决中文乱码问题
stringEntity.setContentEncoding("UTF-8");
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
httpStr = EntityUtils.toString(entity, "UTF-8");
return JSON.parseObject(httpStr);
} catch (Exception e) {
log.error(e.getMessage(),e);
} finally {
if (response != null) {
try {
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
log.error(e.getMessage(),e);
}
}
}
return null;
}
public static JSONObject doPost(String apiUrl, Map<String,Object> body, Map<String,Object> header) { public static JSONObject doPost(String apiUrl, Map<String,Object> body, Map<String,Object> header) {
CloseableHttpClient httpClient = null; CloseableHttpClient httpClient = null;
if (apiUrl.startsWith("https")) { if (apiUrl.startsWith("https")) {
@ -501,11 +502,12 @@ public class HttpsUtils {
} }
/** /**
* @Author Sum1Dream
* * @Description // 不带证书请求xml
* @param url API地址 * @Date 11:42 2021/6/8
* @return * @Param [url, str]
*/ * @return com.alibaba.fastjson.JSONObject
**/
public static JSONObject postData(String url, String str) { public static JSONObject postData(String url, String str) {
CloseableHttpClient httpClient = null; CloseableHttpClient httpClient = null;
if (url.startsWith("https")) { if (url.startsWith("https")) {
@ -522,6 +524,7 @@ public class HttpsUtils {
httpPost.setConfig(requestConfig); httpPost.setConfig(requestConfig);
StringEntity stringEntity = new StringEntity(str, "UTF-8");// 解决中文乱码问题 StringEntity stringEntity = new StringEntity(str, "UTF-8");// 解决中文乱码问题
stringEntity.setContentEncoding("UTF-8");
httpPost.addHeader("Content-Type", "text/xml"); httpPost.addHeader("Content-Type", "text/xml");
httpPost.setEntity(stringEntity); httpPost.setEntity(stringEntity);
response = httpClient.execute(httpPost); response = httpClient.execute(httpPost);
@ -542,7 +545,67 @@ public class HttpsUtils {
return null; return null;
} }
/**
* @Author Sum1Dream
* @Description // 带证书请求 xml
* @Date 11:45 2021/6/8
* @Param [url, mchId, str]
* @return com.alibaba.fastjson.JSONObject
**/
public static JSONObject postData(String url, String mchId , String str) {
CloseableHttpClient httpClient = null;
if (url.startsWith("https")) {
httpClient = HttpClients.custom().setSSLSocketFactory(readCertificate(mchId))
.setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
} else {
httpClient = HttpClients.createDefault();
}
String httpStr = null;
CloseableHttpResponse response = null;
try {
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(requestConfig);
StringEntity stringEntity = new StringEntity(str, "UTF-8");// 解决中文乱码问题
stringEntity.setContentEncoding("UTF-8");
httpPost.addHeader("Content-Type", "text/xml");
httpPost.setEntity(stringEntity);
response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
httpStr = EntityUtils.toString(entity, "UTF-8");
return JSON.parseObject(httpStr);
} catch (Exception e) {
log.error(e.getMessage(),e);
} finally {
if (response != null) {
try {
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
log.error(e.getMessage(),e);
}
}
}
return null;
}
public static SSLConnectionSocketFactory readCertificate(String mchId) {
try {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream stream = new FileInputStream( "F:/mine/hai-server/hai-service/src/main/java/privatekey/apiclient_cert.p12");
keyStore.load(stream , mchId.toCharArray());
stream.close();
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();
return new SSLConnectionSocketFactory(
sslcontext,
new String[]{"TLSv1"},
null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
} catch (Exception e) {
System.out.println("证书双向认证出现异常" + e);
}
return null;
}
/** /**
* 创建SSL安全连接 * 创建SSL安全连接

@ -1,5 +1,6 @@
package com.hai.common.utils; package com.hai.common.utils;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.hai.common.pay.util.sdk.WXPayConstants; import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.pay.util.sdk.WXPayXmlUtil; import com.hai.common.pay.util.sdk.WXPayXmlUtil;
@ -7,15 +8,23 @@ import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.naming.NoNameCoder; import com.thoughtworks.xstream.io.naming.NoNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver; import com.thoughtworks.xstream.io.xml.XppDriver;
import net.sf.cglib.beans.BeanMap; import net.sf.cglib.beans.BeanMap;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.xml.transform.OutputKeys; import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer; import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource; import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileInputStream;
import java.io.StringWriter; import java.io.StringWriter;
import java.security.KeyStore;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.*; import java.util.*;
@ -292,4 +301,7 @@ public class WxUtils {
return output; return output;
} }
} }

@ -0,0 +1,110 @@
package com.hai.dao;
import com.hai.entity.HighProfitSharingRecord;
import com.hai.entity.HighProfitSharingRecordExample;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.UpdateProvider;
import org.apache.ibatis.type.JdbcType;
import org.springframework.stereotype.Repository;
/**
*
* 代码由工具生成,请勿修改!!!
* 如果需要扩展请在其父类进行扩展
*
**/
@Repository
public interface HighProfitSharingRecordMapper extends HighProfitSharingRecordMapperExt {
@SelectProvider(type=HighProfitSharingRecordSqlProvider.class, method="countByExample")
long countByExample(HighProfitSharingRecordExample example);
@DeleteProvider(type=HighProfitSharingRecordSqlProvider.class, method="deleteByExample")
int deleteByExample(HighProfitSharingRecordExample example);
@Delete({
"delete from high_profit_sharing_record",
"where id = #{id,jdbcType=BIGINT}"
})
int deleteByPrimaryKey(Long id);
@Insert({
"insert into high_profit_sharing_record (transaction_id, out_order_no, ",
"order_id, price, ",
"content, create_time, ",
"`status`)",
"values (#{transactionId,jdbcType=VARCHAR}, #{outOrderNo,jdbcType=VARCHAR}, ",
"#{orderId,jdbcType=VARCHAR}, #{price,jdbcType=DECIMAL}, ",
"#{content,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, ",
"#{status,jdbcType=VARCHAR})"
})
@Options(useGeneratedKeys=true,keyProperty="id")
int insert(HighProfitSharingRecord record);
@InsertProvider(type=HighProfitSharingRecordSqlProvider.class, method="insertSelective")
@Options(useGeneratedKeys=true,keyProperty="id")
int insertSelective(HighProfitSharingRecord record);
@SelectProvider(type=HighProfitSharingRecordSqlProvider.class, method="selectByExample")
@Results({
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="transaction_id", property="transactionId", jdbcType=JdbcType.VARCHAR),
@Result(column="out_order_no", property="outOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="order_id", property="orderId", jdbcType=JdbcType.VARCHAR),
@Result(column="price", property="price", jdbcType=JdbcType.DECIMAL),
@Result(column="content", property="content", jdbcType=JdbcType.VARCHAR),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="status", property="status", jdbcType=JdbcType.VARCHAR)
})
List<HighProfitSharingRecord> selectByExample(HighProfitSharingRecordExample example);
@Select({
"select",
"id, transaction_id, out_order_no, order_id, price, content, create_time, `status`",
"from high_profit_sharing_record",
"where id = #{id,jdbcType=BIGINT}"
})
@Results({
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="transaction_id", property="transactionId", jdbcType=JdbcType.VARCHAR),
@Result(column="out_order_no", property="outOrderNo", jdbcType=JdbcType.VARCHAR),
@Result(column="order_id", property="orderId", jdbcType=JdbcType.VARCHAR),
@Result(column="price", property="price", jdbcType=JdbcType.DECIMAL),
@Result(column="content", property="content", jdbcType=JdbcType.VARCHAR),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="status", property="status", jdbcType=JdbcType.VARCHAR)
})
HighProfitSharingRecord selectByPrimaryKey(Long id);
@UpdateProvider(type=HighProfitSharingRecordSqlProvider.class, method="updateByExampleSelective")
int updateByExampleSelective(@Param("record") HighProfitSharingRecord record, @Param("example") HighProfitSharingRecordExample example);
@UpdateProvider(type=HighProfitSharingRecordSqlProvider.class, method="updateByExample")
int updateByExample(@Param("record") HighProfitSharingRecord record, @Param("example") HighProfitSharingRecordExample example);
@UpdateProvider(type=HighProfitSharingRecordSqlProvider.class, method="updateByPrimaryKeySelective")
int updateByPrimaryKeySelective(HighProfitSharingRecord record);
@Update({
"update high_profit_sharing_record",
"set transaction_id = #{transactionId,jdbcType=VARCHAR},",
"out_order_no = #{outOrderNo,jdbcType=VARCHAR},",
"order_id = #{orderId,jdbcType=VARCHAR},",
"price = #{price,jdbcType=DECIMAL},",
"content = #{content,jdbcType=VARCHAR},",
"create_time = #{createTime,jdbcType=TIMESTAMP},",
"`status` = #{status,jdbcType=VARCHAR}",
"where id = #{id,jdbcType=BIGINT}"
})
int updateByPrimaryKey(HighProfitSharingRecord record);
}

@ -0,0 +1,7 @@
package com.hai.dao;
/**
* mapper扩展类
*/
public interface HighProfitSharingRecordMapperExt {
}

@ -0,0 +1,276 @@
package com.hai.dao;
import com.hai.entity.HighProfitSharingRecord;
import com.hai.entity.HighProfitSharingRecordExample.Criteria;
import com.hai.entity.HighProfitSharingRecordExample.Criterion;
import com.hai.entity.HighProfitSharingRecordExample;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.jdbc.SQL;
public class HighProfitSharingRecordSqlProvider {
public String countByExample(HighProfitSharingRecordExample example) {
SQL sql = new SQL();
sql.SELECT("count(*)").FROM("high_profit_sharing_record");
applyWhere(sql, example, false);
return sql.toString();
}
public String deleteByExample(HighProfitSharingRecordExample example) {
SQL sql = new SQL();
sql.DELETE_FROM("high_profit_sharing_record");
applyWhere(sql, example, false);
return sql.toString();
}
public String insertSelective(HighProfitSharingRecord record) {
SQL sql = new SQL();
sql.INSERT_INTO("high_profit_sharing_record");
if (record.getTransactionId() != null) {
sql.VALUES("transaction_id", "#{transactionId,jdbcType=VARCHAR}");
}
if (record.getOutOrderNo() != null) {
sql.VALUES("out_order_no", "#{outOrderNo,jdbcType=VARCHAR}");
}
if (record.getOrderId() != null) {
sql.VALUES("order_id", "#{orderId,jdbcType=VARCHAR}");
}
if (record.getPrice() != null) {
sql.VALUES("price", "#{price,jdbcType=DECIMAL}");
}
if (record.getContent() != null) {
sql.VALUES("content", "#{content,jdbcType=VARCHAR}");
}
if (record.getCreateTime() != null) {
sql.VALUES("create_time", "#{createTime,jdbcType=TIMESTAMP}");
}
if (record.getStatus() != null) {
sql.VALUES("`status`", "#{status,jdbcType=VARCHAR}");
}
return sql.toString();
}
public String selectByExample(HighProfitSharingRecordExample example) {
SQL sql = new SQL();
if (example != null && example.isDistinct()) {
sql.SELECT_DISTINCT("id");
} else {
sql.SELECT("id");
}
sql.SELECT("transaction_id");
sql.SELECT("out_order_no");
sql.SELECT("order_id");
sql.SELECT("price");
sql.SELECT("content");
sql.SELECT("create_time");
sql.SELECT("`status`");
sql.FROM("high_profit_sharing_record");
applyWhere(sql, example, false);
if (example != null && example.getOrderByClause() != null) {
sql.ORDER_BY(example.getOrderByClause());
}
return sql.toString();
}
public String updateByExampleSelective(Map<String, Object> parameter) {
HighProfitSharingRecord record = (HighProfitSharingRecord) parameter.get("record");
HighProfitSharingRecordExample example = (HighProfitSharingRecordExample) parameter.get("example");
SQL sql = new SQL();
sql.UPDATE("high_profit_sharing_record");
if (record.getId() != null) {
sql.SET("id = #{record.id,jdbcType=BIGINT}");
}
if (record.getTransactionId() != null) {
sql.SET("transaction_id = #{record.transactionId,jdbcType=VARCHAR}");
}
if (record.getOutOrderNo() != null) {
sql.SET("out_order_no = #{record.outOrderNo,jdbcType=VARCHAR}");
}
if (record.getOrderId() != null) {
sql.SET("order_id = #{record.orderId,jdbcType=VARCHAR}");
}
if (record.getPrice() != null) {
sql.SET("price = #{record.price,jdbcType=DECIMAL}");
}
if (record.getContent() != null) {
sql.SET("content = #{record.content,jdbcType=VARCHAR}");
}
if (record.getCreateTime() != null) {
sql.SET("create_time = #{record.createTime,jdbcType=TIMESTAMP}");
}
if (record.getStatus() != null) {
sql.SET("`status` = #{record.status,jdbcType=VARCHAR}");
}
applyWhere(sql, example, true);
return sql.toString();
}
public String updateByExample(Map<String, Object> parameter) {
SQL sql = new SQL();
sql.UPDATE("high_profit_sharing_record");
sql.SET("id = #{record.id,jdbcType=BIGINT}");
sql.SET("transaction_id = #{record.transactionId,jdbcType=VARCHAR}");
sql.SET("out_order_no = #{record.outOrderNo,jdbcType=VARCHAR}");
sql.SET("order_id = #{record.orderId,jdbcType=VARCHAR}");
sql.SET("price = #{record.price,jdbcType=DECIMAL}");
sql.SET("content = #{record.content,jdbcType=VARCHAR}");
sql.SET("create_time = #{record.createTime,jdbcType=TIMESTAMP}");
sql.SET("`status` = #{record.status,jdbcType=VARCHAR}");
HighProfitSharingRecordExample example = (HighProfitSharingRecordExample) parameter.get("example");
applyWhere(sql, example, true);
return sql.toString();
}
public String updateByPrimaryKeySelective(HighProfitSharingRecord record) {
SQL sql = new SQL();
sql.UPDATE("high_profit_sharing_record");
if (record.getTransactionId() != null) {
sql.SET("transaction_id = #{transactionId,jdbcType=VARCHAR}");
}
if (record.getOutOrderNo() != null) {
sql.SET("out_order_no = #{outOrderNo,jdbcType=VARCHAR}");
}
if (record.getOrderId() != null) {
sql.SET("order_id = #{orderId,jdbcType=VARCHAR}");
}
if (record.getPrice() != null) {
sql.SET("price = #{price,jdbcType=DECIMAL}");
}
if (record.getContent() != null) {
sql.SET("content = #{content,jdbcType=VARCHAR}");
}
if (record.getCreateTime() != null) {
sql.SET("create_time = #{createTime,jdbcType=TIMESTAMP}");
}
if (record.getStatus() != null) {
sql.SET("`status` = #{status,jdbcType=VARCHAR}");
}
sql.WHERE("id = #{id,jdbcType=BIGINT}");
return sql.toString();
}
protected void applyWhere(SQL sql, HighProfitSharingRecordExample example, boolean includeExamplePhrase) {
if (example == null) {
return;
}
String parmPhrase1;
String parmPhrase1_th;
String parmPhrase2;
String parmPhrase2_th;
String parmPhrase3;
String parmPhrase3_th;
if (includeExamplePhrase) {
parmPhrase1 = "%s #{example.oredCriteria[%d].allCriteria[%d].value}";
parmPhrase1_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
parmPhrase2 = "%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}";
parmPhrase2_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
parmPhrase3 = "#{example.oredCriteria[%d].allCriteria[%d].value[%d]}";
parmPhrase3_th = "#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
} else {
parmPhrase1 = "%s #{oredCriteria[%d].allCriteria[%d].value}";
parmPhrase1_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
parmPhrase2 = "%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}";
parmPhrase2_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
parmPhrase3 = "#{oredCriteria[%d].allCriteria[%d].value[%d]}";
parmPhrase3_th = "#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
}
StringBuilder sb = new StringBuilder();
List<Criteria> oredCriteria = example.getOredCriteria();
boolean firstCriteria = true;
for (int i = 0; i < oredCriteria.size(); i++) {
Criteria criteria = oredCriteria.get(i);
if (criteria.isValid()) {
if (firstCriteria) {
firstCriteria = false;
} else {
sb.append(" or ");
}
sb.append('(');
List<Criterion> criterions = criteria.getAllCriteria();
boolean firstCriterion = true;
for (int j = 0; j < criterions.size(); j++) {
Criterion criterion = criterions.get(j);
if (firstCriterion) {
firstCriterion = false;
} else {
sb.append(" and ");
}
if (criterion.isNoValue()) {
sb.append(criterion.getCondition());
} else if (criterion.isSingleValue()) {
if (criterion.getTypeHandler() == null) {
sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j));
} else {
sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j,criterion.getTypeHandler()));
}
} else if (criterion.isBetweenValue()) {
if (criterion.getTypeHandler() == null) {
sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j));
} else {
sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j, criterion.getTypeHandler(), i, j, criterion.getTypeHandler()));
}
} else if (criterion.isListValue()) {
sb.append(criterion.getCondition());
sb.append(" (");
List<?> listItems = (List<?>) criterion.getValue();
boolean comma = false;
for (int k = 0; k < listItems.size(); k++) {
if (comma) {
sb.append(", ");
} else {
comma = true;
}
if (criterion.getTypeHandler() == null) {
sb.append(String.format(parmPhrase3, i, j, k));
} else {
sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler()));
}
}
sb.append(')');
}
}
sb.append(')');
}
}
if (sb.length() > 0) {
sql.WHERE(sb.toString());
}
}
}

@ -0,0 +1,178 @@
package com.hai.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* high_profit_sharing_record
* @author
*/
/**
*
* 代码由工具生成
*
**/
public class HighProfitSharingRecord implements Serializable {
/**
* 主键ID
*/
private Long id;
/**
* 微信订单号
*/
private String transactionId;
/**
* 商户分账单号
*/
private String outOrderNo;
/**
* 微信分账单号
*/
private String orderId;
/**
* 分账金额
*/
private BigDecimal price;
/**
* 报文内容
*/
private String content;
/**
* 创建时间
*/
private Date createTime;
/**
* 状态以微信返回为准
*/
private String status;
private static final long serialVersionUID = 1L;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTransactionId() {
return transactionId;
}
public void setTransactionId(String transactionId) {
this.transactionId = transactionId;
}
public String getOutOrderNo() {
return outOrderNo;
}
public void setOutOrderNo(String outOrderNo) {
this.outOrderNo = outOrderNo;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
HighProfitSharingRecord other = (HighProfitSharingRecord) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getTransactionId() == null ? other.getTransactionId() == null : this.getTransactionId().equals(other.getTransactionId()))
&& (this.getOutOrderNo() == null ? other.getOutOrderNo() == null : this.getOutOrderNo().equals(other.getOutOrderNo()))
&& (this.getOrderId() == null ? other.getOrderId() == null : this.getOrderId().equals(other.getOrderId()))
&& (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
&& (this.getContent() == null ? other.getContent() == null : this.getContent().equals(other.getContent()))
&& (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
&& (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getTransactionId() == null) ? 0 : getTransactionId().hashCode());
result = prime * result + ((getOutOrderNo() == null) ? 0 : getOutOrderNo().hashCode());
result = prime * result + ((getOrderId() == null) ? 0 : getOrderId().hashCode());
result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
result = prime * result + ((getContent() == null) ? 0 : getContent().hashCode());
result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
return result;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id);
sb.append(", transactionId=").append(transactionId);
sb.append(", outOrderNo=").append(outOrderNo);
sb.append(", orderId=").append(orderId);
sb.append(", price=").append(price);
sb.append(", content=").append(content);
sb.append(", createTime=").append(createTime);
sb.append(", status=").append(status);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}

@ -0,0 +1,754 @@
package com.hai.entity;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class HighProfitSharingRecordExample {
protected String orderByClause;
protected boolean distinct;
protected List<Criteria> oredCriteria;
private Integer limit;
private Long offset;
public HighProfitSharingRecordExample() {
oredCriteria = new ArrayList<Criteria>();
}
public void setOrderByClause(String orderByClause) {
this.orderByClause = orderByClause;
}
public String getOrderByClause() {
return orderByClause;
}
public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
public boolean isDistinct() {
return distinct;
}
public List<Criteria> getOredCriteria() {
return oredCriteria;
}
public void or(Criteria criteria) {
oredCriteria.add(criteria);
}
public Criteria or() {
Criteria criteria = createCriteriaInternal();
oredCriteria.add(criteria);
return criteria;
}
public Criteria createCriteria() {
Criteria criteria = createCriteriaInternal();
if (oredCriteria.size() == 0) {
oredCriteria.add(criteria);
}
return criteria;
}
protected Criteria createCriteriaInternal() {
Criteria criteria = new Criteria();
return criteria;
}
public void clear() {
oredCriteria.clear();
orderByClause = null;
distinct = false;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
public Integer getLimit() {
return limit;
}
public void setOffset(Long offset) {
this.offset = offset;
}
public Long getOffset() {
return offset;
}
protected abstract static class GeneratedCriteria {
protected List<Criterion> criteria;
protected GeneratedCriteria() {
super();
criteria = new ArrayList<Criterion>();
}
public boolean isValid() {
return criteria.size() > 0;
}
public List<Criterion> getAllCriteria() {
return criteria;
}
public List<Criterion> getCriteria() {
return criteria;
}
protected void addCriterion(String condition) {
if (condition == null) {
throw new RuntimeException("Value for condition cannot be null");
}
criteria.add(new Criterion(condition));
}
protected void addCriterion(String condition, Object value, String property) {
if (value == null) {
throw new RuntimeException("Value for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value));
}
protected void addCriterion(String condition, Object value1, Object value2, String property) {
if (value1 == null || value2 == null) {
throw new RuntimeException("Between values for " + property + " cannot be null");
}
criteria.add(new Criterion(condition, value1, value2));
}
public Criteria andIdIsNull() {
addCriterion("id is null");
return (Criteria) this;
}
public Criteria andIdIsNotNull() {
addCriterion("id is not null");
return (Criteria) this;
}
public Criteria andIdEqualTo(Long value) {
addCriterion("id =", value, "id");
return (Criteria) this;
}
public Criteria andIdNotEqualTo(Long value) {
addCriterion("id <>", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThan(Long value) {
addCriterion("id >", value, "id");
return (Criteria) this;
}
public Criteria andIdGreaterThanOrEqualTo(Long value) {
addCriterion("id >=", value, "id");
return (Criteria) this;
}
public Criteria andIdLessThan(Long value) {
addCriterion("id <", value, "id");
return (Criteria) this;
}
public Criteria andIdLessThanOrEqualTo(Long value) {
addCriterion("id <=", value, "id");
return (Criteria) this;
}
public Criteria andIdIn(List<Long> values) {
addCriterion("id in", values, "id");
return (Criteria) this;
}
public Criteria andIdNotIn(List<Long> values) {
addCriterion("id not in", values, "id");
return (Criteria) this;
}
public Criteria andIdBetween(Long value1, Long value2) {
addCriterion("id between", value1, value2, "id");
return (Criteria) this;
}
public Criteria andIdNotBetween(Long value1, Long value2) {
addCriterion("id not between", value1, value2, "id");
return (Criteria) this;
}
public Criteria andTransactionIdIsNull() {
addCriterion("transaction_id is null");
return (Criteria) this;
}
public Criteria andTransactionIdIsNotNull() {
addCriterion("transaction_id is not null");
return (Criteria) this;
}
public Criteria andTransactionIdEqualTo(String value) {
addCriterion("transaction_id =", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdNotEqualTo(String value) {
addCriterion("transaction_id <>", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdGreaterThan(String value) {
addCriterion("transaction_id >", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdGreaterThanOrEqualTo(String value) {
addCriterion("transaction_id >=", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdLessThan(String value) {
addCriterion("transaction_id <", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdLessThanOrEqualTo(String value) {
addCriterion("transaction_id <=", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdLike(String value) {
addCriterion("transaction_id like", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdNotLike(String value) {
addCriterion("transaction_id not like", value, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdIn(List<String> values) {
addCriterion("transaction_id in", values, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdNotIn(List<String> values) {
addCriterion("transaction_id not in", values, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdBetween(String value1, String value2) {
addCriterion("transaction_id between", value1, value2, "transactionId");
return (Criteria) this;
}
public Criteria andTransactionIdNotBetween(String value1, String value2) {
addCriterion("transaction_id not between", value1, value2, "transactionId");
return (Criteria) this;
}
public Criteria andOutOrderNoIsNull() {
addCriterion("out_order_no is null");
return (Criteria) this;
}
public Criteria andOutOrderNoIsNotNull() {
addCriterion("out_order_no is not null");
return (Criteria) this;
}
public Criteria andOutOrderNoEqualTo(String value) {
addCriterion("out_order_no =", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoNotEqualTo(String value) {
addCriterion("out_order_no <>", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoGreaterThan(String value) {
addCriterion("out_order_no >", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoGreaterThanOrEqualTo(String value) {
addCriterion("out_order_no >=", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoLessThan(String value) {
addCriterion("out_order_no <", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoLessThanOrEqualTo(String value) {
addCriterion("out_order_no <=", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoLike(String value) {
addCriterion("out_order_no like", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoNotLike(String value) {
addCriterion("out_order_no not like", value, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoIn(List<String> values) {
addCriterion("out_order_no in", values, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoNotIn(List<String> values) {
addCriterion("out_order_no not in", values, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoBetween(String value1, String value2) {
addCriterion("out_order_no between", value1, value2, "outOrderNo");
return (Criteria) this;
}
public Criteria andOutOrderNoNotBetween(String value1, String value2) {
addCriterion("out_order_no not between", value1, value2, "outOrderNo");
return (Criteria) this;
}
public Criteria andOrderIdIsNull() {
addCriterion("order_id is null");
return (Criteria) this;
}
public Criteria andOrderIdIsNotNull() {
addCriterion("order_id is not null");
return (Criteria) this;
}
public Criteria andOrderIdEqualTo(String value) {
addCriterion("order_id =", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdNotEqualTo(String value) {
addCriterion("order_id <>", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdGreaterThan(String value) {
addCriterion("order_id >", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdGreaterThanOrEqualTo(String value) {
addCriterion("order_id >=", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdLessThan(String value) {
addCriterion("order_id <", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdLessThanOrEqualTo(String value) {
addCriterion("order_id <=", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdLike(String value) {
addCriterion("order_id like", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdNotLike(String value) {
addCriterion("order_id not like", value, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdIn(List<String> values) {
addCriterion("order_id in", values, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdNotIn(List<String> values) {
addCriterion("order_id not in", values, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdBetween(String value1, String value2) {
addCriterion("order_id between", value1, value2, "orderId");
return (Criteria) this;
}
public Criteria andOrderIdNotBetween(String value1, String value2) {
addCriterion("order_id not between", value1, value2, "orderId");
return (Criteria) this;
}
public Criteria andPriceIsNull() {
addCriterion("price is null");
return (Criteria) this;
}
public Criteria andPriceIsNotNull() {
addCriterion("price is not null");
return (Criteria) this;
}
public Criteria andPriceEqualTo(BigDecimal value) {
addCriterion("price =", value, "price");
return (Criteria) this;
}
public Criteria andPriceNotEqualTo(BigDecimal value) {
addCriterion("price <>", value, "price");
return (Criteria) this;
}
public Criteria andPriceGreaterThan(BigDecimal value) {
addCriterion("price >", value, "price");
return (Criteria) this;
}
public Criteria andPriceGreaterThanOrEqualTo(BigDecimal value) {
addCriterion("price >=", value, "price");
return (Criteria) this;
}
public Criteria andPriceLessThan(BigDecimal value) {
addCriterion("price <", value, "price");
return (Criteria) this;
}
public Criteria andPriceLessThanOrEqualTo(BigDecimal value) {
addCriterion("price <=", value, "price");
return (Criteria) this;
}
public Criteria andPriceIn(List<BigDecimal> values) {
addCriterion("price in", values, "price");
return (Criteria) this;
}
public Criteria andPriceNotIn(List<BigDecimal> values) {
addCriterion("price not in", values, "price");
return (Criteria) this;
}
public Criteria andPriceBetween(BigDecimal value1, BigDecimal value2) {
addCriterion("price between", value1, value2, "price");
return (Criteria) this;
}
public Criteria andPriceNotBetween(BigDecimal value1, BigDecimal value2) {
addCriterion("price not between", value1, value2, "price");
return (Criteria) this;
}
public Criteria andContentIsNull() {
addCriterion("content is null");
return (Criteria) this;
}
public Criteria andContentIsNotNull() {
addCriterion("content is not null");
return (Criteria) this;
}
public Criteria andContentEqualTo(String value) {
addCriterion("content =", value, "content");
return (Criteria) this;
}
public Criteria andContentNotEqualTo(String value) {
addCriterion("content <>", value, "content");
return (Criteria) this;
}
public Criteria andContentGreaterThan(String value) {
addCriterion("content >", value, "content");
return (Criteria) this;
}
public Criteria andContentGreaterThanOrEqualTo(String value) {
addCriterion("content >=", value, "content");
return (Criteria) this;
}
public Criteria andContentLessThan(String value) {
addCriterion("content <", value, "content");
return (Criteria) this;
}
public Criteria andContentLessThanOrEqualTo(String value) {
addCriterion("content <=", value, "content");
return (Criteria) this;
}
public Criteria andContentLike(String value) {
addCriterion("content like", value, "content");
return (Criteria) this;
}
public Criteria andContentNotLike(String value) {
addCriterion("content not like", value, "content");
return (Criteria) this;
}
public Criteria andContentIn(List<String> values) {
addCriterion("content in", values, "content");
return (Criteria) this;
}
public Criteria andContentNotIn(List<String> values) {
addCriterion("content not in", values, "content");
return (Criteria) this;
}
public Criteria andContentBetween(String value1, String value2) {
addCriterion("content between", value1, value2, "content");
return (Criteria) this;
}
public Criteria andContentNotBetween(String value1, String value2) {
addCriterion("content not between", value1, value2, "content");
return (Criteria) this;
}
public Criteria andCreateTimeIsNull() {
addCriterion("create_time is null");
return (Criteria) this;
}
public Criteria andCreateTimeIsNotNull() {
addCriterion("create_time is not null");
return (Criteria) this;
}
public Criteria andCreateTimeEqualTo(Date value) {
addCriterion("create_time =", value, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeNotEqualTo(Date value) {
addCriterion("create_time <>", value, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeGreaterThan(Date value) {
addCriterion("create_time >", value, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
addCriterion("create_time >=", value, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeLessThan(Date value) {
addCriterion("create_time <", value, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
addCriterion("create_time <=", value, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeIn(List<Date> values) {
addCriterion("create_time in", values, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeNotIn(List<Date> values) {
addCriterion("create_time not in", values, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeBetween(Date value1, Date value2) {
addCriterion("create_time between", value1, value2, "createTime");
return (Criteria) this;
}
public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
addCriterion("create_time not between", value1, value2, "createTime");
return (Criteria) this;
}
public Criteria andStatusIsNull() {
addCriterion("`status` is null");
return (Criteria) this;
}
public Criteria andStatusIsNotNull() {
addCriterion("`status` is not null");
return (Criteria) this;
}
public Criteria andStatusEqualTo(String value) {
addCriterion("`status` =", value, "status");
return (Criteria) this;
}
public Criteria andStatusNotEqualTo(String value) {
addCriterion("`status` <>", value, "status");
return (Criteria) this;
}
public Criteria andStatusGreaterThan(String value) {
addCriterion("`status` >", value, "status");
return (Criteria) this;
}
public Criteria andStatusGreaterThanOrEqualTo(String value) {
addCriterion("`status` >=", value, "status");
return (Criteria) this;
}
public Criteria andStatusLessThan(String value) {
addCriterion("`status` <", value, "status");
return (Criteria) this;
}
public Criteria andStatusLessThanOrEqualTo(String value) {
addCriterion("`status` <=", value, "status");
return (Criteria) this;
}
public Criteria andStatusLike(String value) {
addCriterion("`status` like", value, "status");
return (Criteria) this;
}
public Criteria andStatusNotLike(String value) {
addCriterion("`status` not like", value, "status");
return (Criteria) this;
}
public Criteria andStatusIn(List<String> values) {
addCriterion("`status` in", values, "status");
return (Criteria) this;
}
public Criteria andStatusNotIn(List<String> values) {
addCriterion("`status` not in", values, "status");
return (Criteria) this;
}
public Criteria andStatusBetween(String value1, String value2) {
addCriterion("`status` between", value1, value2, "status");
return (Criteria) this;
}
public Criteria andStatusNotBetween(String value1, String value2) {
addCriterion("`status` not between", value1, value2, "status");
return (Criteria) this;
}
}
/**
*/
public static class Criteria extends GeneratedCriteria {
protected Criteria() {
super();
}
}
public static class Criterion {
private String condition;
private Object value;
private Object secondValue;
private boolean noValue;
private boolean singleValue;
private boolean betweenValue;
private boolean listValue;
private String typeHandler;
public String getCondition() {
return condition;
}
public Object getValue() {
return value;
}
public Object getSecondValue() {
return secondValue;
}
public boolean isNoValue() {
return noValue;
}
public boolean isSingleValue() {
return singleValue;
}
public boolean isBetweenValue() {
return betweenValue;
}
public boolean isListValue() {
return listValue;
}
public String getTypeHandler() {
return typeHandler;
}
protected Criterion(String condition) {
super();
this.condition = condition;
this.typeHandler = null;
this.noValue = true;
}
protected Criterion(String condition, Object value, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.typeHandler = typeHandler;
if (value instanceof List<?>) {
this.listValue = true;
} else {
this.singleValue = true;
}
}
protected Criterion(String condition, Object value) {
this(condition, value, null);
}
protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
super();
this.condition = condition;
this.value = value;
this.secondValue = secondValue;
this.typeHandler = typeHandler;
this.betweenValue = true;
}
protected Criterion(String condition, Object value, Object secondValue) {
this(condition, value, secondValue, null);
}
}
}

@ -0,0 +1,98 @@
package com.hai.model;
/**
* 分账结果
*/
public class ResultProfitSharing {
private String return_code;
private String result_code;
private String mch_id;
private String sub_mch_id;
private String appid;
private String nonce_str;
private String sign;
private String transaction_id;
private String out_order_no;
private String order_id;
public String getReturn_code() {
return return_code;
}
public void setReturn_code(String return_code) {
this.return_code = return_code;
}
public String getResult_code() {
return result_code;
}
public void setResult_code(String result_code) {
this.result_code = result_code;
}
public String getMch_id() {
return mch_id;
}
public void setMch_id(String mch_id) {
this.mch_id = mch_id;
}
public String getSub_mch_id() {
return sub_mch_id;
}
public void setSub_mch_id(String sub_mch_id) {
this.sub_mch_id = sub_mch_id;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getNonce_str() {
return nonce_str;
}
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getTransaction_id() {
return transaction_id;
}
public void setTransaction_id(String transaction_id) {
this.transaction_id = transaction_id;
}
public String getOut_order_no() {
return out_order_no;
}
public void setOut_order_no(String out_order_no) {
this.out_order_no = out_order_no;
}
public String getOrder_id() {
return order_id;
}
public void setOrder_id(String order_id) {
this.order_id = order_id;
}
}

@ -0,0 +1,12 @@
package com.hai.service;
import com.hai.entity.HighProfitSharingRecord;
/**
* 分账记录
*/
public interface HighProfitSharingRecordService {
void insert(HighProfitSharingRecord highProfitSharingRecord);
}

@ -0,0 +1,20 @@
package com.hai.service.impl;
import com.hai.dao.HighProfitSharingRecordMapper;
import com.hai.entity.HighProfitSharingRecord;
import com.hai.service.HighProfitSharingRecordService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("highProfitSharingRecord")
public class HighProfitSharingRecordServiceImpl implements HighProfitSharingRecordService {
@Resource
private HighProfitSharingRecordMapper highProfitSharingRecordMapper;
@Override
public void insert(HighProfitSharingRecord highProfitSharingRecord) {
highProfitSharingRecordMapper.insert(highProfitSharingRecord);
}
}

@ -18,4 +18,5 @@ public interface PayService {
*/ */
void paySuccess(Map<String, String> map, String payType) throws Exception; void paySuccess(Map<String, String> map, String payType) throws Exception;
} }

@ -1,21 +1,38 @@
package com.hai.service.pay.impl; package com.hai.service.pay.impl;
import com.alibaba.fastjson.JSONObject;
import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp; import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode; import com.hai.common.exception.SysCode;
import com.hai.common.pay.util.XmlUtil;
import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.utils.WxUtils;
import com.hai.dao.HighUserCouponMapper; import com.hai.dao.HighUserCouponMapper;
import com.hai.entity.*; import com.hai.entity.*;
import com.hai.model.ResultProfitSharing;
import com.hai.service.*; import com.hai.service.*;
import com.hai.service.pay.PayService; import com.hai.service.pay.PayService;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.net.ssl.SSLContext;
import java.io.FileInputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Calendar; import java.security.KeyStore;
import java.util.Date; import java.util.*;
import java.util.Map;
/** /**
* @Auther: 胡锐 * @Auther: 胡锐
@ -25,6 +42,8 @@ import java.util.Map;
@Service("goodsOrderService") @Service("goodsOrderService")
public class GoodsOrderServiceImpl implements PayService { public class GoodsOrderServiceImpl implements PayService {
private static Logger log = LoggerFactory.getLogger(GoodsOrderServiceImpl.class);
@Resource @Resource
private HighOrderService highOrderService; private HighOrderService highOrderService;
@ -40,6 +59,9 @@ public class GoodsOrderServiceImpl implements PayService {
@Resource @Resource
private HighUserCouponMapper highUserCouponMapper; private HighUserCouponMapper highUserCouponMapper;
@Resource
private HighProfitSharingRecordService highProfitSharingRecordService;
@Override @Override
@Transactional(propagation= Propagation.REQUIRES_NEW) @Transactional(propagation= Propagation.REQUIRES_NEW)
public void paySuccess(Map<String, String> map, String payType) throws Exception { public void paySuccess(Map<String, String> map, String payType) throws Exception {
@ -53,59 +75,164 @@ public class GoodsOrderServiceImpl implements PayService {
if (order == null) { if (order == null) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_ORDER, ""); throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_ORDER, "");
} }
order.setPaySerialNo(map.get("transaction_id")); // 支付流水号 if (order.getOrderStatus() == 1) {
order.setPayRealPrice(new BigDecimal(map.get("total_fee")).divide(new BigDecimal("100"))); // 实付金额 order.setPaySerialNo(map.get("transaction_id")); // 支付流水号
order.setPayTime(new Date()); // 支付时间 order.setPayRealPrice(new BigDecimal(map.get("total_fee")).divide(new BigDecimal("100"))); // 实付金额
order.setPayModel(2); // 支付模式:1 金币,2 第三方平台,3 混合 order.setPayTime(new Date()); // 支付时间
order.setPayType(2); // 支付方式: 1:支付宝 2:微信 3:金币 order.setPayModel(2); // 支付模式:1 金币,2 第三方平台,3 混合
order.setOrderStatus(2); // 订单状态:1 待支付 2 已支付 3.已完成 4. 已退款 5.已取消 order.setPayType(2); // 支付方式: 1:支付宝 2:微信 3:金币
order.setOrderStatus(2); // 订单状态:1 待支付 2 已支付 3.已完成 4. 已退款 5.已取消
for (HighChildOrder highChildOrder : order.getHighChildOrderList()) {
// 商品类型 商品类型 1:卡卷 2:金币充值 for (HighChildOrder highChildOrder : order.getHighChildOrderList()) {
if (highChildOrder.getGoodsType() == 1) { // 商品类型 商品类型 1:卡卷 2:金币充值
highChildOrder.setChildOrdeStatus(2); // 子订单状态:1 待支付 2 已支付 3.已完成 4. 已退款 5.已取消 if (highChildOrder.getGoodsType() == 1) {
HighCouponCode code = highCouponCodeService.getCouponCodeByOrderId(highChildOrder.getId()); highChildOrder.setChildOrdeStatus(2); // 子订单状态:1 待支付 2 已支付 3.已完成 4. 已退款 5.已取消
code.setStatus(2); // 状态:1.待销售 2.未使用 3.已使用 99.预支付 HighCouponCode code = highCouponCodeService.getCouponCodeByOrderId(highChildOrder.getId());
code.setReceiveTime(new Date()); code.setStatus(2); // 状态:1.待销售 2.未使用 3.已使用 99.预支付
highCouponCodeService.updateCouponCode(code); code.setReceiveTime(new Date());
highCouponCodeService.updateCouponCode(code);
HighCoupon coupon = highCouponService.getCouponById(highChildOrder.getGoodsId());
HighCoupon coupon = highCouponService.getCouponById(highChildOrder.getGoodsId());
// 卡卷关联用户
HighUserCoupon highUserCoupon = new HighUserCoupon(); // 卡卷关联用户
highUserCoupon.setMerchantId(code.getMerchantId()); HighUserCoupon highUserCoupon = new HighUserCoupon();
highUserCoupon.setCouponId(code.getCouponId()); highUserCoupon.setMerchantId(code.getMerchantId());
highUserCoupon.setUserId(order.getMemId()); highUserCoupon.setCouponId(code.getCouponId());
highUserCoupon.setCouponCodeId(code.getId()); highUserCoupon.setUserId(order.getMemId());
highUserCoupon.setCreateTime(new Date()); highUserCoupon.setCouponCodeId(code.getId());
highUserCoupon.setQrCodeImg(code.getExt1()); highUserCoupon.setCreateTime(new Date());
highUserCoupon.setQrCodeImg(code.getExt1());
// 计算使用有效期
Calendar userEndTime = Calendar.getInstance(); // 计算使用有效期
userEndTime.setTime(new Date()); Calendar userEndTime = Calendar.getInstance();
userEndTime.set(Calendar.HOUR_OF_DAY, 23); userEndTime.setTime(new Date());
userEndTime.set(Calendar.MINUTE, 59); userEndTime.set(Calendar.HOUR_OF_DAY, 23);
userEndTime.set(Calendar.SECOND, 59); userEndTime.set(Calendar.MINUTE, 59);
userEndTime.add(Calendar.DATE, coupon.getRecycleDay()); userEndTime.set(Calendar.SECOND, 59);
if (userEndTime.getTime().compareTo(code.getUseEndTime()) == 1) { userEndTime.add(Calendar.DATE, coupon.getRecycleDay());
highUserCoupon.setUseEndTime(code.getUseEndTime()); if (userEndTime.getTime().compareTo(code.getUseEndTime()) == 1) {
} else { highUserCoupon.setUseEndTime(code.getUseEndTime());
highUserCoupon.setUseEndTime(userEndTime.getTime()); } else {
highUserCoupon.setUseEndTime(userEndTime.getTime());
}
highUserCoupon.setStatus(1); // 状态 0:已过期 1:未使用 2:已使用
highUserCouponMapper.insert(highUserCoupon);
} }
highUserCoupon.setStatus(1); // 状态 0:已过期 1:未使用 2:已使用
highUserCouponMapper.insert(highUserCoupon);
}
if (highChildOrder.getGoodsType() == 2) { if (highChildOrder.getGoodsType() == 2) {
highChildOrder.setChildOrdeStatus(3); // 子订单状态:1 待支付 2 已支付 3.已完成 4. 已退款 5.已取消 highChildOrder.setChildOrdeStatus(3); // 子订单状态:1 待支付 2 已支付 3.已完成 4. 已退款 5.已取消
// 金币 1:100 // 金币 1:100
Integer goldNum = new BigDecimal(highChildOrder.getTotalPrice().toString()).multiply(new BigDecimal("100")).intValue(); Integer goldNum = new BigDecimal(highChildOrder.getTotalPrice().toString()).multiply(new BigDecimal("100")).intValue();
highUserService.goldHandle(highChildOrder.getGoodsId(), goldNum, 1, 1, highChildOrder.getId()); highUserService.goldHandle(highChildOrder.getGoodsId(), goldNum, 1, 1, highChildOrder.getId());
}
} }
highOrderService.updateOrder(order);
new Thread(() -> {
try {
Thread.sleep(60*1000);
BigDecimal rake = new BigDecimal("0.01");
BigDecimal profitSharingAmount = order.getPayRealPrice().multiply(rake);
this.wxProfitsharing(order.getPaySerialNo(),order.getOrderNo(),profitSharingAmount);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
} }
}
}
public void wxProfitsharing(String transaction_id,String out_order_no, BigDecimal amount) {
try {
Map<String,String> param = new LinkedHashMap<>();
param.put("appid", "wx637bd6f7314daa46");
param.put("mch_id", "1289663601");
param.put("sub_mch_id" , "1609882817");
param.put("transaction_id" , transaction_id);
param.put("out_order_no" , out_order_no);
param.put("nonce_str" , WxUtils.makeNonStr());
// 分账金额
BigDecimal porofitSharingAmount = amount;
List<Map<String,Object>> receiversList = new ArrayList<>();
Map<String,Object> receiversMap = new LinkedHashMap<>();
receiversMap.put("type", "MERCHANT_ID");
receiversMap.put("account", "1603942866");
receiversMap.put("amount", porofitSharingAmount.multiply(new BigDecimal("100")).intValue());
receiversMap.put("description", "分给商户1603942866");
receiversList.add(receiversMap);
param.put("receivers" , JSONObject.toJSONString(receiversList));
String signStr = WxUtils.generateSignature(param, "Skufk5oi85wDFGl888i6wsRSTkdd5df5" , WXPayConstants.SignType.HMACSHA256);
param.put("sign" , signStr);
String resultXmL = this.doRefundRequest(param.get("mch_id"),null, WxUtils.mapToXml(param));
// 请求分账返回的结果
ResultProfitSharing resultProfitSharing = XmlUtil.getObjectFromXML(resultXmL, ResultProfitSharing.class);
HighProfitSharingRecord sharingRecord = new HighProfitSharingRecord();
sharingRecord.setOutOrderNo(resultProfitSharing.getOut_order_no());
sharingRecord.setTransactionId(resultProfitSharing.getTransaction_id());
sharingRecord.setOrderId(resultProfitSharing.getOrder_id());
sharingRecord.setStatus(resultProfitSharing.getResult_code());
sharingRecord.setPrice(amount);
sharingRecord.setCreateTime(new Date());
sharingRecord.setContent(resultXmL);
highProfitSharingRecordService.insert(sharingRecord);
} catch (Exception e) {
log.error("CmsContentController --> getCorporateAdvertising() error!", e);
}
}
highOrderService.updateOrder(order); //微信小程序读取双向证书
private static CloseableHttpClient readCertificate(String mchId) throws Exception{
/**
* 注意PKCS12证书 是从微信商户平台-账户设置- API安全 中下载的
*/
KeyStore keyStore = KeyStore.getInstance("PKCS12");
//P12文件目录 证书路径,这里需要你自己修改,linux下还是windows下的根路径
FileInputStream instream = new FileInputStream("/home/project/wx_cert/1289663601_apiclient_cert.p12");
try {
keyStore.load(instream, "1289663601".toCharArray());//这里写密码..默认是你的MCHID
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "1289663601".toCharArray()).build();//这里也是写密码的
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
// Allow TLSv1 protocol only
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
}
public String doRefundRequest(String mchId, String url, String data) throws Exception {
//小程序退款需要调用双向证书的认证
CloseableHttpClient httpClient = readCertificate(mchId);
try {
HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/profitsharing"); // 设置响应头信息
httpost.addHeader("Connection", "keep-alive");
httpost.addHeader("Accept", "*/*");
httpost.addHeader("Content-Type", "text/xml");
httpost.addHeader("Host", "api.mch.weixin.qq.com");
httpost.addHeader("X-Requested-With", "XMLHttpRequest");
httpost.addHeader("Cache-Control", "max-age=0");
httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
httpost.setEntity(new StringEntity(data, "UTF-8"));
CloseableHttpResponse response = httpClient.execute(httpost);
try {
HttpEntity entity = response.getEntity();
String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
EntityUtils.consume(entity);
return jsonStr;
} finally {
response.close();
}
} catch (Exception e){
throw new RuntimeException(e);
} finally {
httpClient.close();
} }
} }
} }

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID2jCCAsKgAwIBAgIUUPi1hMq87bxzKky00MSigY+1IZswDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjAxMjMxMTAyNDAzWhcNMjUxMjMwMTAyNDAzWjBsMRMwEQYDVQQDDAox
NjA0OTY4MDU1MRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xGDAWBgNVBAsM
D+S4quS9k+aIt+aWuea2mzELMAkGA1UEBgwCQ04xETAPBgNVBAcMCFNoZW5aaGVu
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDjbxytOraNz5QkibnZN
6Q8fBPA11FQyEducTlOxFTXEN2mVIlPrnDJMZ8jQ0fBTHpWsuPMdLY6quEpnBUhf
vzip0giRCo8HAbT8TO2KiQSB0cPiW4HBGvHLI447EXG/xpisHAk6TR1rvdvGtjih
nRpnTLrDTK6TLDKi/hwDGYu2fzGYsXiN++bP45FSLiOn4T29o8PDG2zTpvcrsHEe
lerNltWzPbk5TXnnMDvcoUq/AgvhQjXRpLtOtkhegBBOHJFdTo/ldyV2YJkb/Yjp
SBGA+C/iuXkA5G7QW79LGa5Y0j5YNNHPlLHlxp5jfX+SZyBwmGtlHLFY44xwCN23
oQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwZQYDVR0fBF4wXDBa
oFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9D
QT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyMA0GCSqG
SIb3DQEBCwUAA4IBAQAkPTsxOuOj2BMLj7EzRmx3e3KCjvnz0Y9bmT9ahpgwX4hS
Dv+iHL6urT6FBnGVfE0Ejyymk/zq8DGSG7l7lsCU7s4ul5aaWFpjF30CCGqo4n2B
RRDHaC+Mw2MvUttHvnwR5SB4Exot4Nc1jVqOMos9FVyh3EWkUExVPRSJcdHSANLo
WgiJcuqE7cnvm+njM4ZhywI/HUvSp7+Y7dbQfA5pjh8vEVI9j8+l+7fhD/wCIeoA
zLfCVhdPsJnVdJW31yXQLped2HoQXhFagYNc2/6LR8imF3CUfI+LCIg+SZeGGsdY
ADnqbf9JGLxbXTfjvoOWFUDiWE8mMWuhwki0EI2W
-----END CERTIFICATE-----

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0ONvHK06to3Pl
CSJudk3pDx8E8DXUVDIR25xOU7EVNcQ3aZUiU+ucMkxnyNDR8FMelay48x0tjqq4
SmcFSF+/OKnSCJEKjwcBtPxM7YqJBIHRw+JbgcEa8csjjjsRcb/GmKwcCTpNHWu9
28a2OKGdGmdMusNMrpMsMqL+HAMZi7Z/MZixeI375s/jkVIuI6fhPb2jw8MbbNOm
9yuwcR6V6s2W1bM9uTlNeecwO9yhSr8CC+FCNdGku062SF6AEE4ckV1Oj+V3JXZg
mRv9iOlIEYD4L+K5eQDkbtBbv0sZrljSPlg00c+UseXGnmN9f5JnIHCYa2UcsVjj
jHAI3behAgMBAAECggEANZGRAiqFQGeNU07bxSm1DslH1xfvaCV+nIBCfaWyxTMu
F6pygbmgFtV8kHzIVR6yFi03IeJhkeEOLakv5goVK6mUELIrKpBI7OD2/Ya93uxQ
CiHHbpuq4m9sii0EsbK15joLLmovwiw0kkJ5VkCPCTuH6O66jlh1tnV2rUF2SmkU
9kfuEx+Id2fK+RK2+K8dCXQmYiS9R3mLQk9OSbanujVyQhlcKg7oPR6ko6UsI+jt
OGlkqxhPNFOuEKDbAsuKWp6kbvM1oWFb36oLpu+wzI0mUfbVatnsRKyE/ltH8xGY
Cm0T98Zic3kHb+k1PHPqm9Cn6olj1nk4A+o7BGAB4QKBgQDjjMqh4mz4G68PVgxI
0FXsEiFv8dr13MnwTzDd1dzPUksPqvPlTThn3I1IwLveDTx8+0SHknPyaJbz3a1d
gFfCCc5/MtK2n12PwwluiPHKNYvHnm/SFI6i5B/V5h5Ngk3g2WJi3shsQrdi620E
vfjSs8SJLLKpOncOfASitFCUqwKBgQDKwT2W4w1TVx7N5LSpVbvJJ01MPtoyHg90
e0aqCuAycjw6Fwta4OcwHQrfzGoGPSYbvYTW126uZF7HE7Rl+/SCvZcKFfYa6Y/L
sBeSUW6LGAQpbzwhcYOO6B4RwuX6/BMMruITwtGjUnVfurK4xeyir/Oq7VWCYKMG
AAy0bpWs4wKBgB6Ak/UJVhQYGepTXYgxLSNc9tB7uh80/njRFLrX3SaJYHh0MQdu
x33cqa+z7jsAyTfzsqb9sb8v1/ROpdufxaPEDsMsO+SxDiikO1Ju1wKFFPyoN1MQ
4GHjdIUGuM8pBWl7ml2ogXNJqi1/Y3i8Qmt0H4dHz5cxuB3f7/sjcp3LAoGAA+qr
t+h27281ZyDN5J+FWyNpONnV+TXfco6XFN3U6uSOCUk8rOq/TIyjEyOtwKUZwVtt
34CV4MSLmCjnSTkOxh/HdShrcqWkY3jpW6g7DHDQU8SUUskQk4gkXI95RdnsvEf8
kgknZ5JGNi0zGqKoKZRgjqK7DiOzwn/pvuqL9aUCgYEAzJVZIOW5fBmyZgA3VrCd
TUl84gldhg9bcqOUmPYOQdOlLx2gZeLqVWi2Lni66h8gz7Vka4OQGtjgULx96ggL
aV9ZHMSWXYxWj7dpF2QrM72vlybGs1VKCf/j/CGWJAzE1t5Uj/TAShtO3egS/4bk
dsTO2NlRDbN+Ty/TSN36l6o=
-----END PRIVATE KEY-----
Loading…
Cancel
Save