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