|
|
@ -6,6 +6,7 @@ import com.cweb.config.SysConst; |
|
|
|
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.pay.util.sdk.WXPayConstants; |
|
|
|
import com.hai.common.utils.*; |
|
|
|
import com.hai.common.utils.*; |
|
|
|
import com.hai.config.*; |
|
|
|
import com.hai.config.*; |
|
|
@ -13,10 +14,20 @@ import com.hai.entity.*; |
|
|
|
import com.hai.model.HighMerchantModel; |
|
|
|
import com.hai.model.HighMerchantModel; |
|
|
|
import com.hai.model.HighMerchantStoreModel; |
|
|
|
import com.hai.model.HighMerchantStoreModel; |
|
|
|
import com.hai.model.ResponseData; |
|
|
|
import com.hai.model.ResponseData; |
|
|
|
|
|
|
|
import com.hai.model.ResultProfitSharing; |
|
|
|
import com.hai.service.*; |
|
|
|
import com.hai.service.*; |
|
|
|
import io.swagger.annotations.Api; |
|
|
|
import io.swagger.annotations.Api; |
|
|
|
import io.swagger.annotations.ApiOperation; |
|
|
|
import io.swagger.annotations.ApiOperation; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
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.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
@ -24,6 +35,10 @@ import org.springframework.stereotype.Controller; |
|
|
|
import org.springframework.web.bind.annotation.*; |
|
|
|
import org.springframework.web.bind.annotation.*; |
|
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
import javax.annotation.Resource; |
|
|
|
|
|
|
|
import javax.net.ssl.SSLContext; |
|
|
|
|
|
|
|
import java.io.FileInputStream; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
|
|
|
import java.security.KeyStore; |
|
|
|
import java.util.*; |
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -47,6 +62,11 @@ public class HighTestController { |
|
|
|
@Resource |
|
|
|
@Resource |
|
|
|
private HighGasOilPriceService highGasOilPriceService; |
|
|
|
private HighGasOilPriceService highGasOilPriceService; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Resource |
|
|
|
|
|
|
|
private HighOrderService highOrderService; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Resource |
|
|
|
|
|
|
|
private HighProfitSharingRecordService highProfitSharingRecordService; |
|
|
|
|
|
|
|
|
|
|
|
@RequestMapping(value = "/initTYMerchantStore", method = RequestMethod.GET) |
|
|
|
@RequestMapping(value = "/initTYMerchantStore", method = RequestMethod.GET) |
|
|
|
@ResponseBody |
|
|
|
@ResponseBody |
|
|
@ -218,26 +238,123 @@ public class HighTestController { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@RequestMapping(value = "/test3", method = RequestMethod.GET) |
|
|
|
@RequestMapping(value = "/splitSccount", method = RequestMethod.GET) |
|
|
|
@ResponseBody |
|
|
|
@ResponseBody |
|
|
|
@ApiOperation(value = "测试") |
|
|
|
@ApiOperation(value = "测试") |
|
|
|
public ResponseData test3() { |
|
|
|
public ResponseData splitSccount() { |
|
|
|
try { |
|
|
|
try { |
|
|
|
// return ResponseMsgUtil.success(HuiLianTongUnionCardConfig.resolveResponse("T3xbPEKEXV9+CbBw8D1B+N2jk8xwa55s0Bde48c49YDMmj1rv5nOrkawWt8fskSihNw0wugKUT1x\\nWjHhIN8af7NylRVfhJvbeja2Zjjxnwk3FEKgyvIvJnk3QgiY4aghqQcGKxDOlAxT/kjrkDd2ESu1\\nIWkpi+0HGnG3rKSL6+a1Nu7aW+rPHwXUOmHSgWFZFb9HhlfKI/jml3GhMZBWsZFirayyMMi8UKrd\\nYN7ANPEB/6uV9iVtpLF5Kz8M2+GpI0EqRhPFAH2u3Q/RSgW8ei2ZbOY9NnbkdwuOjU93wgJxdY1Y\\n93hvLYNe1i9QkSM1"));
|
|
|
|
//List<HighOrder> list = highOrderService.getErrorOrder();
|
|
|
|
// 获取token
|
|
|
|
/* HighOrder order = highOrderService.getOrderByOrderNo("20210827003355621063330"); |
|
|
|
JSONObject tokenObject = HuiLianTongConfig.getToken(); |
|
|
|
BigDecimal rake = new BigDecimal("0.01"); |
|
|
|
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()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) { |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("HighOrderController --> getOrderById() error!", e); |
|
|
|
log.error("HighOrderController --> getOrderById() error!", e); |
|
|
|
return ResponseMsgUtil.exception(e); |
|
|
|
return ResponseMsgUtil.exception(e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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", "分给商户【惠昕石化】"); |
|
|
|
|
|
|
|
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(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|