@Repository( value = ConstantsPay.U_PAY + "Processor" ) @Log4j2 public class UPayProcessor extends AbstractPay { @Override public String orderPay( PayChannelNew payChannelNew, PayPlatformNew payPlatformNew, ReqPayRechargeNew reqPayRecharge ) { SortedMap<String, String> params = new TreeMap<>(); params.put( "pid", payPlatformNew.getMerId() ); params.put( "cid", payChannelNew.getPayMethod() ); params.put( "type", "" ); params.put( "oid", reqPayRecharge.getOrderNo() ); params.put( "uid", reqPayRecharge.getRealIp() ); params.put( "amount", reqPayRecharge.getMoney().multiply( BigDecimal.valueOf( 100 ) ).setScale( 0, BigDecimal.ROUND_HALF_UP ).toString() ); params.put( "burl", global.getWebSetVal( "payReturnUrl" )); params.put( "nurl", global.getWebSetVal( "payCallbackUrl" ) + ConstantsPay.U_PAY ); params.put( "eparam", "" ); params.put( "ip", reqPayRecharge.getRealIp() ); params.put( "stype", "MD5" ); String signStr = this.assemblyUrl( params ) + "&key=" + payPlatformNew.getSignMd5(); log.warn( signStr ); String sign = DigestUtils.md5Hex( signStr ).toLowerCase(); params.put( "sign", sign ); log.warn( JsonUtil.object2Json( params ) ); StringBuilder sb = new StringBuilder( "<form id='Form1' name='Form1' method='post' action='" + payPlatformNew.getPlatPayUrl() + "'>" ); params.forEach( ( k, v ) -> sb.append( "<input type='hidden' name='" ).append( k ).append( "' value='" ) .append( v ).append( "'>" ) ); sb.append( "<script>var form = document.getElementById('Form1');form.submit();</script>" ); return sb.toString(); } @Override public boolean queryPay( MemberPayJour payJour, PayPlatformNew payPlatformNew, PayChannelNew payChannelNew ) { Map<String, String> params = new LinkedHashMap<>(); params.put( "pid", payPlatformNew.getMerId() ); params.put( "oid", payJour.getOrderNo() ); String signStr = this.assemblyUrl( params ) + "&key=" + payPlatformNew.getSignMd5(); String sign = DigestUtils.md5Hex( signStr ).toLowerCase(); params.put( "sign", sign ); MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>(); requestMap.setAll( params ); log.warn( JsonUtil.object2Json( requestMap ) ); UriComponents uriComponents = UriComponentsBuilder.fromUriString( payPlatformNew.getPlatQueryUrl() ) .queryParams( requestMap ).build(); Map<String, Object> resultMap = null; try { resultMap = restTemplate.getForObject( uriComponents.toUriString(), Map.class ); } catch ( Exception e ) { log.error( e.getMessage(), e ); } log.warn( "U支付查询结果 - orderNo:{};result:{}", payJour.getOrderNo(), JsonUtil.object2Json( resultMap ) ); if ( !CollectionUtils.isEmpty( resultMap ) && "101".equals( resultMap.getOrDefault( "code", "0" ).toString() ) ) { Map<String, Object> dataMap = ( Map<String, Object> ) resultMap.get( "data" ); BigDecimal ramount = new BigDecimal( dataMap.getOrDefault( "ramount", "0" ).toString() ); if ( ramount.compareTo( BigDecimal.ZERO ) > 0 ) { payJour.setSubMoney( ramount.divide( new BigDecimal( 100 ), 2, RoundingMode.HALF_UP ) ); payJour.setTradeSn( dataMap.getOrDefault( "sid", "" ).toString() ); return true; } } return false; } @Override public String callbackPay( Map<String, Object> requestMap, String realIp ) { // 订单id String oid = requestMap.getOrDefault( "oid", "" ).toString(); // 上游订单ID String sid = requestMap.getOrDefault( "sid", "" ).toString(); MemberPayJour payJour = payJourMapper.findByOrderNo( oid ); if ( "1".equals( payJour.getStatus() ) ) { log.warn( "订单已成功,无需继续回调 - orderNo:{}", oid ); return "success"; } PayPlatformNew payPlatformNew = payPlatformNewMapper.selectById( payJour.getPlatformId() ); PayChannelNew payChannelNew = payChannelNewMapper.selectById( payJour.getChannelId() ); if ( this.verifyIP( requestMap, realIp, payPlatformNew ) ) { return "fail"; } if ( this.diffPayTime12Hour( payJour.getPayTime(), oid ) ) { return "fail"; } if ( !payChannelNew.getIsCanCallback() ) { log.warn( "平台已拒绝三方支付通道回调 - 三方支付平台:{};三方支付编码:{};orderNo:{}", payPlatformNew.getName(), payChannelNew.getName(), oid ); return "fail"; } String pid = requestMap.getOrDefault( "pid", "" ).toString(); String cid = requestMap.getOrDefault( "cid", "" ).toString(); String uid = requestMap.getOrDefault( "uid", "" ).toString(); String amount = requestMap.getOrDefault( "amount", 0 ).toString(); String ramount = requestMap.getOrDefault( "ramount", 0 ).toString(); String stime = requestMap.getOrDefault( "stime", "" ).toString(); String code = requestMap.getOrDefault( "code", "" ).toString(); String sign = requestMap.getOrDefault( "sign", "" ).toString(); Map<String, Object> bodyMap = new LinkedHashMap<>(); bodyMap.put( "pid", pid ); bodyMap.put( "cid", cid ); bodyMap.put( "oid", oid ); bodyMap.put( "sid", sid ); bodyMap.put( "uid", uid ); bodyMap.put( "amount", amount ); bodyMap.put( "stime", stime ); bodyMap.put( "code", code ); bodyMap.put( "key", payPlatformNew.getSignMd5() ); String signStr = this.assemblyUrl( bodyMap ); log.warn( signStr ); String rel = DigestUtils.md5Hex( signStr ).toLowerCase(); log.warn( rel + ":" + sign ); //验签 if ( rel.equalsIgnoreCase( sign ) ) { if ( "101".equals( code ) && this.queryPay( payJour, payPlatformNew, payChannelNew ) ) { payJour.setSubMoney( new BigDecimal( ramount ).divide( new BigDecimal( 100 ), 2, RoundingMode.HALF_UP ) ); payJour.setTradeSn( sid ); return payService.updatePayJourStatus( payJour, new String[]{ "success", "fail" }, payChannelNew.getName() ); } } return "fail"; } }
protected String assemblyUrl( Map<String, ?> bodyMap ) { StringBuilder sb = new StringBuilder(); bodyMap.forEach( ( k, v ) -> sb.append( k ).append( "=" ).append( v ).append( "&" ) ); return sb.substring( 0, sb.length() - 1 ); }