注意事项:
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);