From 45d0a24bf02d64da4f2b1ad149dccd1aa7034772 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 10 Sep 2021 18:41:54 +0800 Subject: [PATCH] =?UTF-8?q?'=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cweb/controller/HighTestController.java | 141 ++++++++++++++++-- 1 file changed, 129 insertions(+), 12 deletions(-) diff --git a/hai-cweb/src/main/java/com/cweb/controller/HighTestController.java b/hai-cweb/src/main/java/com/cweb/controller/HighTestController.java index a9807b4f..e659e90c 100644 --- a/hai-cweb/src/main/java/com/cweb/controller/HighTestController.java +++ b/hai-cweb/src/main/java/com/cweb/controller/HighTestController.java @@ -6,6 +6,7 @@ import com.cweb.config.SysConst; import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorHelp; 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.*; import com.hai.config.*; @@ -13,10 +14,20 @@ import com.hai.entity.*; import com.hai.model.HighMerchantModel; import com.hai.model.HighMerchantStoreModel; import com.hai.model.ResponseData; +import com.hai.model.ResultProfitSharing; import com.hai.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; +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.beans.BeanUtils; @@ -24,6 +35,10 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.net.ssl.SSLContext; +import java.io.FileInputStream; +import java.math.BigDecimal; +import java.security.KeyStore; import java.util.*; /** @@ -47,6 +62,11 @@ public class HighTestController { @Resource private HighGasOilPriceService highGasOilPriceService; + @Resource + private HighOrderService highOrderService; + + @Resource + private HighProfitSharingRecordService highProfitSharingRecordService; @RequestMapping(value = "/initTYMerchantStore", method = RequestMethod.GET) @ResponseBody @@ -218,26 +238,123 @@ public class HighTestController { } } - @RequestMapping(value = "/test3", method = RequestMethod.GET) + @RequestMapping(value = "/splitSccount", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "测试") - public ResponseData test3() { + public ResponseData splitSccount() { try { - // return ResponseMsgUtil.success(HuiLianTongUnionCardConfig.resolveResponse("T3xbPEKEXV9+CbBw8D1B+N2jk8xwa55s0Bde48c49YDMmj1rv5nOrkawWt8fskSihNw0wugKUT1x\\nWjHhIN8af7NylRVfhJvbeja2Zjjxnwk3FEKgyvIvJnk3QgiY4aghqQcGKxDOlAxT/kjrkDd2ESu1\\nIWkpi+0HGnG3rKSL6+a1Nu7aW+rPHwXUOmHSgWFZFb9HhlfKI/jml3GhMZBWsZFirayyMMi8UKrd\\nYN7ANPEB/6uV9iVtpLF5Kz8M2+GpI0EqRhPFAH2u3Q/RSgW8ei2ZbOY9NnbkdwuOjU93wgJxdY1Y\\n93hvLYNe1i9QkSM1")); - // 获取token - JSONObject tokenObject = HuiLianTongConfig.getToken(); - if (!tokenObject.getString("result").equals("success")) { - log.error("HighCouponController -> insertCoupon() error!","获取token失败"); - throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "获取token失败"); - } - // 推送给高速 - JSONObject returnParam = HuiLianTongConfig.couJointDist(tokenObject.getString("data"), "20JY000251", 4, "15932678659", "HF"+new Date().getTime()); + //List list = highOrderService.getErrorOrder(); + /* HighOrder order = highOrderService.getOrderByOrderNo("20210827003355621063330"); + BigDecimal rake = new BigDecimal("0.01"); - return ResponseMsgUtil.success(returnParam); + // 计算微信收取的手续费 支付金额 * 0.002 注:如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 + BigDecimal wxHandlingFee = order.getPayRealPrice().multiply(new BigDecimal("0.002")).setScale(2,BigDecimal.ROUND_HALF_DOWN); + BigDecimal price = order.getPayRealPrice().subtract(wxHandlingFee); + + // 计算分账金额 手续费后的价格 * 0.01 注:如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 + BigDecimal profitSharingAmount = price.multiply(rake).setScale(2,BigDecimal.ROUND_DOWN); + this.wxProfitsharing(order.getPaySerialNo(),order.getOrderNo(),profitSharingAmount);*/ + return ResponseMsgUtil.success("分账成功"); } catch (Exception e) { log.error("HighOrderController --> getOrderById() error!", e); return ResponseMsgUtil.exception(e); } } + + public void wxProfitsharing(String transaction_id,String out_order_no, BigDecimal amount) { + try { + Map 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> receiversList = new ArrayList<>(); + Map receiversMap = new LinkedHashMap<>(); + receiversMap.put("type", "MERCHANT_ID"); + receiversMap.put("account", "1603942866"); + receiversMap.put("amount", porofitSharingAmount.multiply(new BigDecimal("100")).intValue()); + receiversMap.put("description", "分给商户【惠昕石化】"); + 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); + + if (!resultProfitSharing.getResult_code().equals("FAIL")) { + 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); + } + } + + + public 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"); + // FileInputStream instream = new FileInputStream("G:\\hurui-project/hai-parent/hai-service/src/main/java/privatekey/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(); + } + } + }