|
|
|
@ -11,6 +11,7 @@ import com.hai.config.CommonSysConst; |
|
|
|
|
import com.hai.config.TelConfig; |
|
|
|
|
import com.hai.dao.HighGasOrderPushMapper; |
|
|
|
|
import com.hai.entity.*; |
|
|
|
|
import com.hai.enum_type.OrderPushType; |
|
|
|
|
import com.hai.model.ResultProfitSharing; |
|
|
|
|
import com.hai.service.*; |
|
|
|
|
import com.hai.service.pay.PayService; |
|
|
|
@ -69,149 +70,13 @@ public class RechargeOrderServiceImpl implements PayService { |
|
|
|
|
if (payType.equals("WechatPay")) { |
|
|
|
|
// 查询订单信息
|
|
|
|
|
OutRechargeOrder order = outRechargeOrderService.findByOrderNo(map.get("out_trade_no")); |
|
|
|
|
if (order == null) { |
|
|
|
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_ORDER, ""); |
|
|
|
|
} |
|
|
|
|
if (order.getStatus() == 1) { |
|
|
|
|
if (order != null && order.getStatus() == 1) { |
|
|
|
|
order.setPaySerialNo(map.get("transaction_id")); // 支付流水号
|
|
|
|
|
order.setPayRealPrice(new BigDecimal(map.get("total_fee")).divide(new BigDecimal("100"))); // 实付金额
|
|
|
|
|
order.setPayTime(new Date()); // 支付时间
|
|
|
|
|
order.setStatus(2); // 订单状态 : 1.待支付 2.已支付 3.已完成 4.已取消 5.已退款
|
|
|
|
|
outRechargeOrderService.updateOrder(order); |
|
|
|
|
|
|
|
|
|
OutRechargePrice outRechargePrice = outRechargePriceService.findById(order.getObjectId()); |
|
|
|
|
|
|
|
|
|
Map<String, Object> mapOrder = new HashMap<>(); |
|
|
|
|
mapOrder.put("cardPhone", order.getRechargeContent()); |
|
|
|
|
// mapOrder.put("channel", outRechargePrice.getChannel());
|
|
|
|
|
// mapOrder.put("goodsId", outRechargePrice.getGoodsId());
|
|
|
|
|
mapOrder.put("orderAmount", order.getOrderPrice()); |
|
|
|
|
mapOrder.put("orderNumber", order.getOrderNo()); |
|
|
|
|
mapOrder.put("callbackUrl", CommonSysConst.getSysConfig().getCzOrderNotify()); |
|
|
|
|
mapOrder.put("orderTime", order.getCreateTimed()); |
|
|
|
|
mapOrder.put("paymentAmount", order.getPayPrice()); |
|
|
|
|
|
|
|
|
|
JSONObject data = TelConfig.order(mapOrder); |
|
|
|
|
|
|
|
|
|
// 推送订单记录
|
|
|
|
|
HighGasOrderPush highGasOrderPush = new HighGasOrderPush(); |
|
|
|
|
highGasOrderPush.setCreateTime(new Date()); |
|
|
|
|
highGasOrderPush.setCode(data.getString("code")); |
|
|
|
|
highGasOrderPush.setRequestContent(JSONObject.toJSONString(mapOrder)); |
|
|
|
|
highGasOrderPush.setReturnContent(data.toJSONString()); |
|
|
|
|
highGasOrderPushMapper.insert(highGasOrderPush); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
new Thread(() -> { |
|
|
|
|
try { |
|
|
|
|
Thread.sleep(60*1000); |
|
|
|
|
BigDecimal rake = new BigDecimal("0.01"); |
|
|
|
|
|
|
|
|
|
// 计算微信收取的手续费 支付金额 * 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); |
|
|
|
|
} 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" , "1607303848"); // 九龙坡区烨歌百货经营部
|
|
|
|
|
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", "1611202250"); |
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|