PPS业务逻辑流程事项-JAY

注意事项:

1.调用支付之前,收款方会调用匹配member是否有对应结算账户,如果没有会新建一个。如(就算有基本账户也会新建)

100000060023 200100200410000006002300001USD USD-美元 SETTLEMENT 1.1700 USD 正常 USD

2.对应支付币种和账户要保持一致,不然通不过。

pps测试代码如下:

测试代码  折叠源码
package  com.netfinworks.ws.api.pps;
 
/**
  * Please modify this class to meet your needs
  * This class is not complete
  */
 
import  com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl;
import  org.omg.CORBA.FREE_MEM;
 
import  java.io.File;
import  java.math.BigDecimal;
import  java.net.MalformedURLException;
import  java.net.URL;
import  java.util.Date;
import  java.util.GregorianCalendar;
import  javax.xml.datatype.DatatypeFactory;
import  javax.xml.namespace.QName;
import  javax.jws.WebMethod;
import  javax.jws.WebParam;
import  javax.jws.WebResult;
import  javax.jws.WebService;
import  javax.xml.bind.annotation.XmlSeeAlso;
import  javax.xml.ws.RequestWrapper;
import  javax.xml.ws.ResponseWrapper;
 
/**
  * This class was generated by Apache CXF 3.2.6
  * 2018-09-10T18:08:05.509+08:00
  * Generated source version: 3.2.6
  */
public  final  class  PaymentFacade_PaymentFacadeImplPort_Client {
 
     private  static  final  QName SERVICE_NAME =  new  QName( "http://pps.api.ws.netfinworks.com" "PaymentFacadeImplService" );
 
     private  PaymentFacade_PaymentFacadeImplPort_Client() {
     }
 
     public  static  void  main(String args[])  throws  java.lang.Exception {
         URL wsdlURL = PaymentFacadeImplService.WSDL_LOCATION;
         if  (args.length >  0  && args[ 0 ] !=  null  && ! "" .equals(args[ 0 ])) {
             File wsdlFile =  new  File(args[ 0 ]);
             try  {
                 if  (wsdlFile.exists()) {
                     wsdlURL = wsdlFile.toURI().toURL();
                 else  {
                     wsdlURL =  new  URL(args[ 0 ]);
                 }
             catch  (MalformedURLException e) {
                 e.printStackTrace();
             }
         }
 
         PaymentFacadeImplService ss =  new  PaymentFacadeImplService(wsdlURL, SERVICE_NAME);
         PaymentFacade port = ss.getPaymentFacadeImplPort();
 
         {
             System.out.println( "Invoking pay..." );
             com.netfinworks.ws.api.pps.OperationEnvironment _pay_arg0 =  new  OperationEnvironment();
             com.netfinworks.ws.api.pps.PaymentRequest paymentRequest =  new  PaymentRequest();
             paymentRequest.setAccessChannel( "WAP" );
             paymentRequest.setBizProductCode( "10310" );
             paymentRequest.setCallbackAddress( "TRADE_PAY_RESULT_NOTICE" );
             GregorianCalendar gc =  new  GregorianCalendar();
             gc.setTimeInMillis(System.currentTimeMillis());
             paymentRequest.setInitiateTime(DatatypeFactory.newInstance().newXMLGregorianCalendar(gc));
             paymentRequest.setPayerId( "200000060034" );
             PaymentInfo paymentInfo =  new  PaymentInfo();
             BalancePayMethod PM =  new  BalancePayMethod();
             //amount
             Money amount =  new  Money();
             amount.setAmount( new  BigDecimal( "1.1666" ));
             amount.setCurrency( "CNY" );
             amount.setRoundingMode(RoundingMode.HALF_UP);
             PM.setAmount(amount);
             //fee
             Money fee =  new  Money();
             fee.setAmount( new  BigDecimal( "0.0000" ));
             fee.setCurrency( "CNY" );
             fee.setRoundingMode(RoundingMode.HALF_UP);
             PM.setFee(fee);
             PM.setPayChannel( "01" );
             PM.setPayMode( "BALANCE" );
             PM.setExtension( "shippingCity\":\"杭州\",\"billState\":\"浙江\",\"shippingPostalCode\":\"310000\",\"orderTerminal\":\"WAP\",\"billFirstName\":\"Adaline\",\"billCountryCode\":\"CN\",\"deviceFingerprintID\":\"\",\"shippingPhoneNumber\":\"13512548545\",\"goodsName\":\"用户转账\",\"goodsDesc\":\"用户转账\",\"customerIp\":\"127.0.0.1\",\"shippingLastName\":\"Zhu\",\"ip\":\"127.0.0.1\",\"tradeOrderNo\":\"20180910055911999300000904131\",\"userAgent\":\"PostmanRuntime/7.2.0\",\"billLastName\":\"Zhu\",\"billEmail\":\"[email protected]\",\"billCity\":\"杭州\",\"billPhoneNumber\":\"13512548545\",\"userId\":\"100015820004\",\"3DCHECK\":\"FALSE\",\"shippingCountryCode\":\"CN\",\"billAddress\":\"祥茂路\",\"shippingFirstName\":\"Adaline\",\"siteId\":\"www.jollychic.com\",\"shippingAddress\":\"祥茂路\",\"shippingState\":\"浙江\",\"billPostalCode\":\"310000\",\"shippingEmail\":\"[email protected]" );
             PM.setPayerAccountNo( "200100100120000006003400001CNY" );
             PM.setPayerId( "200000060034" );
             paymentInfo.setPayMethod(PM);
             paymentInfo.setSettlementCurrency( "CNY" );
             paymentInfo.setExtension( "" );
             paymentRequest.setPaymentInfo(paymentInfo);
             paymentRequest.setPaymentVoucherNo( "20181016171117558500001442952" );
             paymentRequest.setTradeOrderNo( "20181016171117551100001442951" );
             paymentRequest.setSettleId( "100000060023" );
 
             com.netfinworks.ws.api.pps.PaymentResponse _pay__return = port.pay(_pay_arg0, paymentRequest);
             System.out.println( "pay.result="  + _pay__return.getReturnCode() + _pay__return.getPaymentVoucherNo());
 
 
         }
 
         /*{
             System.out.println("Invoking pay...");
             com.netfinworks.ws.api.pps.OperationEnvironment _pay_arg0 = new OperationEnvironment();
             com.netfinworks.ws.api.pps.PaymentRequest paymentRequest = new PaymentRequest();
             paymentRequest.setAccessChannel("WAP");
             paymentRequest.setBizProductCode("20201");
             paymentRequest.setCallbackAddress("TRADE_PAY_RESULT_NOTICE");
             GregorianCalendar gc = new GregorianCalendar();
             gc.setTimeInMillis(System.currentTimeMillis());
             paymentRequest.setInitiateTime(DatatypeFactory.newInstance().newXMLGregorianCalendar(gc));
             paymentRequest.setPayerId("200000060034");
             PaymentInfo paymentInfo = new PaymentInfo();
             //BalancePayMethod PM = new BalancePayMethod();
             QuickPayMethod PM=new QuickPayMethod();
             //amount
             Money amount = new Money();
             amount.setAmount(new BigDecimal("10.000"));
             amount.setCurrency("SAR");
             amount.setRoundingMode(RoundingMode.HALF_UP);
             PM.setAmount(amount);
             PM.setBankCardNo("421234");
             PM.setBankCode("MASTERCARD");
             PM.setCompanyOrPersonal("C");
             PM.setDbcr("CC");
             //fee
             Money fee = new Money();
             fee.setAmount(new BigDecimal("0.0000"));
             fee.setCurrency("SAR");
             fee.setRoundingMode(RoundingMode.HALF_UP);
             PM.setFee(fee);
             PM.setPayChannel("01");
             PM.setPayMode("QPAY");
             PM.setExtension("");
             //PM.setPayerAccountNo("200100200110001582000400001SAR");
             //PM.setPayerId("100015820004");
             paymentInfo.setPayMethod(PM);
             paymentInfo.setSettlementCurrency("SAR");
             paymentInfo.setExtension("");
             paymentRequest.setPaymentInfo(paymentInfo);
             paymentRequest.setPaymentVoucherNo("20181030190342013500000000891");
             paymentRequest.setTradeOrderNo("20181030190337895100000000890");
             paymentRequest.setSettleId("200000180001");
 
             com.netfinworks.ws.api.pps.PaymentResponse _pay__return = port.pay(_pay_arg0, paymentRequest);
             System.out.println("pay.result=" + _pay__return.getReturnCode() + _pay__return.getPaymentVoucherNo());
 
 
         }*/
 
 
         /*{
             System.out.println("Invoking settle...");
             com.netfinworks.ws.api.pps.OperationEnvironment _settle_arg0 = null;
             com.netfinworks.ws.api.pps.SettlementRequest settlementRequest = new SettlementRequest();
             settlementRequest.setAccessChannel("WAP");
             settlementRequest.setBizProductCode("10310");
             settlementRequest.setCallbackAddress("TRADE_SETTLE_RESULT_NOTICE");
             GregorianCalendar gc = new GregorianCalendar();
             gc.setTimeInMillis(System.currentTimeMillis());
             settlementRequest.setInitiateTime(DatatypeFactory.newInstance().newXMLGregorianCalendar(gc));
             SettlementInfo settlementInfo = new SettlementInfo();
             //amount
             Money amount = new Money();
             amount.setAmount(new BigDecimal("5.5000"));
             amount.setCurrency("SAR");
             amount.setRoundingMode(RoundingMode.HALF_UP);
             settlementInfo.setAmount(amount);
             //fee
             Money fee = new Money();
             fee.setAmount(new BigDecimal("0.0000"));
             fee.setCurrency("SAR");
             fee.setRoundingMode(RoundingMode.HALF_UP);
             settlementInfo.setFee(fee);
             //payeeFunds
             BalanceFunds payeeFunds=new BalanceFunds();
             payeeFunds.setAccessChannel("WEB");
             payeeFunds.setCompanyOrPersonal("C");
             payeeFunds.setDbcr("DC");
             payeeFunds.setExtension("d");
             payeeFunds.setPayeeAccountNo("200100200110001592000200001SAR");
             payeeFunds.setPayeeId("100015920002");
             payeeFunds.setTargetBankCode("g");
             settlementInfo.setPayeeFunds(payeeFunds);
 
             settlementRequest.setPaymentVoucherNo("20180910055912000500000904139");
             settlementRequest.setTradeOrderNo("20180910055911999300000904139");
             settlementRequest.setSettlementInfo(settlementInfo);
             com.netfinworks.ws.api.pps.SettlementResponse response = port.settle(_settle_arg0, settlementRequest);
             System.out.println("settle.result=" + response.getState()+"result:"+response.getExtension()+response.getReturnCode());
 
 
         }*/
         /*{
             System.out.println("Invoking advance...");
             com.netfinworks.ws.api.pps.OperationEnvironment _advance_arg0 = null;
             com.netfinworks.ws.api.pps.AdvanceRequest _advance_arg1 = null;
             com.netfinworks.ws.response.pps.AdvanceResponse _advance__return = port.advance(_advance_arg0, _advance_arg1);
             System.out.println("advance.result=" + _advance__return);
 
 
         }*/
 
         System.exit( 0 );
     }
 
}

3.清算通知由三个地方组成:

一、PaymentServiceImpl-》pay-》afterPayment(result, request);   //同步请求返回支付成功,则发送MQ进行清算处理

判断条件为支付成功,并且未重复支付。如果重复支付则退款

二、ReconciliationResultMessageHandler-》PAYMENT   //对账结果异步通知,刚发送MQ进行清算处理

判断条件为支付,会返回settlementAmount和settlementCurrency和paymentSeqNo

三、PaymentResultMessageHandler-》payment-》paymentService.handlePaymentResult(paymentResult);-》sendClearingNotifyMessage(paymentResult.getPaymentState().getCode(), paymentVoucherNo);   //异步支付消息返回成功,发送MQ到pps清算通知处理

判断条件为异步支付消息返回支付成功。paymentVoucherNo和paymentState作为条件     //ppsNotifyClient.sendClearingNotifyMessage(new ClearingNotifyMessage(paymentVoucherNo, paymentState), paymentSuccessQueueName);

清算条件构成:

paymode为大类:

NETBANK("ONLINE_BANK", "网银支付"),
DIRECTDEBT("DIRECTDEBT", "一点充支付"),
BALANCE("BALANCE", "余额支付"),
MPCARD("MOBILE_CARD", "手机充值卡支付"),
MPEXPENSE("MOBILE_BALANCE", "手机话费支付"),
TEL("PHONE_PAY", "固话支付"),
PREPAIDCARD("PRE_CARD", "预付费卡支付"),
ROYALPOINTS("ROYAL_POINT", "积分支付"),
UNIONPAYEXPRESS("CP_FAST_PAY", "银联快捷支付"),
OFFLINE("OFFLINE", "线下支付"),
BROADBAND("BROADBAND_PAY", "宽带支付"),
COUPON("COUPON", "红包"),
PPC("PPC", "磁条卡支付"),
POSC("POSC", "无磁无密支付"),
POS("POS", "POS支付"),
EPAY("EPAY", "无卡支付"),
QUICKPAY("QPAY", "快捷支付"),
BANKSIGNQUICKPAY("BSQPAY", "银签快捷支付"),
CREDITPAY("CRPAY", "信用支付"),
CASH("CASH", "现金支付"),
CONFIRMEDFUND("CFMFUND", "确定性入款"),
GROUP("GROUP", "团购支付"),
TRUSTCOLLECT("TRUST_COLLECT", "代扣"),
PREAUTH("PRE_AUTH", "预授权");
BizProductCode为对应小类:
DEPOSIT("10101","会员充值", new String[]{"02"}),
WITHDRAW("10210","普通提现", new String[]{""}),
TRANSFER("10310", "会员转账", new String[]{""}),
INSTANT("20201", "即时到帐", new String[]{"01", "02"}),
ENSURE("20202","担保交易", new String[]{"01", "02"}),
EXCHANGE("50201","换汇业务", new String[]{"01", "02"}),
PREAUTH("60103","预授权支付", new String[]{"01", "02"});

//比如 QUICKPAY 大类对应小类有  20201 即时到帐 和 20202 担保交易   ,BANKSIGNQUICKPAY 大类 有  10101小类 会员充值

目前有清算的为:BALANCE、NETBANK、QUICKPAY、BANKSIGNQUICKPAY(新加10101 会员充值 )

NETBANK 和 QUICKPAY 支付如果不是20201即时到帐和20202担保交易,则根据支付流水号查对账状态(counterClient服务去查可用金额)

结算方式为:

smData.setSettleable(true);
// 如果可结算金额币种 = 支付金额币种,那么可结算金额 = 支付金额-费用金额
clearingCarrier.setAvailableSettlementAmount(payAmount.subtract(getFeeAmount(paymentOrderDO)));
smData.setClearingCarrier(clearingCarrier);

猜你喜欢

转载自www.cnblogs.com/jay-wu/p/9944920.html
PPS