U支付

@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 );
}

猜你喜欢

转载自blog.csdn.net/programmer188/article/details/110223196
今日推荐