package com.yc.abc.utils;
|
|
import com.abc.pay.client.Constants;
|
import com.abc.pay.client.JSON;
|
import com.abc.pay.client.ebus.AlipayRequest;
|
import com.abc.pay.client.ebus.PaymentRequest;
|
import com.abc.pay.client.ebus.QRPayCode;
|
import com.abc.pay.client.ebus.UnifiedPaymentRequest;
|
import com.yc.abc.entity.MerchantEntity;
|
import com.yc.abc.entity.OrderEntity;
|
import com.yc.entity.DataSourceEntity;
|
import com.yc.exception.ApplicationException;
|
import com.yc.factory.FactoryBean;
|
import com.yc.multiData.MultiDataSource;
|
import com.yc.multiData.SpObserver;
|
import com.yc.open.mutual.controller.MutualController;
|
import com.yc.sdk.weixinmp.util.MD5Util;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.poi.ss.formula.functions.FactDouble;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.LocalTime;
|
import java.time.format.DateTimeFormatter;
|
import java.util.Base64;
|
import java.util.LinkedHashMap;
|
|
/**
|
* 农行支付接口
|
*/
|
public class AbcPayUtils {
|
/**
|
* 01:未支付
|
* 02:无回应
|
* 03:微信和支付宝支付成功
|
* 04:选择微信、支付宝支付时,表示农行清算成功;
|
* 选择我行支付通道支付时,表示农行支付成功
|
* 05:已退款
|
* 07:授权确认成功
|
* 00:授权已取消
|
* 99:失败
|
*/
|
public static String getOrderStatus(String status,String payType) {
|
String result="";
|
switch (status) {
|
|
case "01":
|
result= "未支付";
|
break;
|
case "02":
|
result= "无回应";
|
break;
|
case "03":
|
case "04":
|
result= "支付成功";
|
break;
|
case "05":
|
result= "已退款";
|
break;
|
case "07":
|
result= "授权确认成功";
|
break;
|
case "00":
|
result= "授权已取消";
|
break;
|
default:
|
result= "支付失败";
|
}
|
String payTypeId="";
|
if("ALI_PAY".equalsIgnoreCase(payType)){
|
payTypeId="支付宝";
|
}else if("weixinpay".equalsIgnoreCase(payType)){
|
payTypeId="微信";
|
}else{
|
payTypeId="掌银";
|
}
|
return payTypeId+result;
|
}
|
|
/**
|
* 根据数据源id匹配TrustMerchant.properties所定义的多商户信息(商户号,商户证书储存目录,商户私钥加密密码)
|
* 由配置文件定义决定,从1开始
|
* MerchantID=103100070113810,123456789012345,103456464564564
|
* MerchantCertFile =C:\cert\3810.pfx,C:\cert\2345.pfx,C:\cert\4564.pfx
|
* MerchantCertPassword =11111111,22222222,12345678
|
* //TODO 开通客户需要在这里设置好对应关系,因为1已经是卤江南使用,所以从2开始指定
|
* @return
|
*/
|
public static MerchantEntity getMerchantInfo(int dbid,int formid,String userCode,String docCode){
|
//商户证书列表
|
String merchantStr =AbcMerchantConfig.get("MerchantCertFile");
|
if(StringUtils.isBlank(merchantStr)){
|
throw new ApplicationException("商户证书列表不能为空");
|
}
|
final String[] merchantList = merchantStr.split(",");
|
int index=0;//证书的位置
|
for(int i=0;i<merchantList.length;i++){
|
//根据数据源id定位对应的证书
|
if(merchantList[i].contains("CA/"+dbid+"/")){
|
index=i+1;
|
break;
|
}
|
}
|
if(index==0){
|
final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbid + "");
|
throw new ApplicationException(dataSourceMap.getSystemID()+"-商户证书找不到,请检查配置文件");
|
}
|
//域名
|
MutualController mutualController =(MutualController)FactoryBean.getBean("mutualController");
|
String domain = "http://demo.onbus.cn:9010";//测试环境
|
//String domain = "http://yc100.xicp.net:9001";//测试环境
|
//String domain = mutualController.getSystemUrlByDataSource(MultiDataSource.getDataSourceMap(dbid+"")); //正式环境
|
return new MerchantEntity(index,String.format("%s/abc/%s/%s/%s/%s/orderPayCallback.do",domain,dbid,formid,docCode,userCode));
|
|
}
|
/**
|
* 向农行发送订单请求,把订单提交到网上支付平台,成功后导向支付界面,然后发起支付操作,这里只是生成支付订单,实际交易还需要调用其他接口
|
*
|
* @return
|
*/
|
public static JSON createPostOrder(OrderEntity entity) {
|
|
final DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(entity.getDbid());
|
final MerchantEntity merchantEntity = getMerchantInfo(dataSource.getDbId(),150101,entity.getInfo(),entity.getOrderNo());
|
if(merchantEntity==null){
|
throw new ApplicationException(String.format("请维护好【%s】和商户信息之间的映射关系",dataSource.getSystemDescribe()));
|
}
|
//订单日期和时间
|
LocalDate localDate = LocalDate.now();
|
String date = localDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
|
LocalTime localTime = LocalTime.now();
|
String time = localTime.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
|
String orderNo = entity.getOrderNo();
|
//todo 订单金额
|
BigDecimal orderAmount = entity.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP);
|
if(entity.getPayType()==0) {
|
return getPaymentRequest(entity, merchantEntity, date, time, orderNo, orderAmount);
|
}else{
|
return createOrder(entity, merchantEntity, date, time, orderNo, orderAmount);
|
}
|
|
}
|
|
public static JSON getPaymentRequest(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
|
//1、生成订单对象
|
PaymentRequest tPaymentRequest = new PaymentRequest();
|
|
tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY); //设定交易类型
|
tPaymentRequest.dicOrder.put("OrderDate", date); //设定订单日期 (必要信息 - YYYY/MM/DD)
|
tPaymentRequest.dicOrder.put("OrderTime", time); //设定订单时间 (必要信息 - HH:MM:SS)
|
//tPaymentRequest.dicOrder.put("orderTimeoutDate", LocalDateTime.now().plusMinutes(10).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 设置订单过期时间,10分钟
|
tPaymentRequest.dicOrder.put("OrderNo", orderNo); //设定订单编号 (必要信息)
|
tPaymentRequest.dicOrder.put("CurrencyCode", "156"); //设定交易币种
|
tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString()); //设定交易金额
|
tPaymentRequest.dicOrder.put("InstallmentMark", "0"); // 分期标识
|
tPaymentRequest.dicOrder.put("CommodityType", "0202"); // 设置商品种类
|
tPaymentRequest.dicOrder.put("BuyIP", entity.getIp()); // 设置商品种类
|
tPaymentRequest.dicOrder.put("OrderDesc", "收款单:"+orderNo); // 设置商品种类
|
//2、订单明细
|
LinkedHashMap orderitem = new LinkedHashMap();
|
orderitem.put("ProductName", orderNo);//商品名称
|
tPaymentRequest.orderitems.put(1, orderitem);
|
//3、生成支付请求对象
|
tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_ALL); //设定支付类型
|
tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET); //设定支付接入方式
|
tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER); //设定通知方式
|
tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity)); // 附言
|
//--测试环境
|
//tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do"); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL()); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO); //设定交易是否分账、交易是否支持向二级商户入账
|
System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
|
return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
|
|
}
|
|
private static JSON createOrder(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
|
String payChannel=getChannelType(entity.getQrCode());
|
if("wechat".equalsIgnoreCase(payChannel)){
|
//微信支付
|
return getPaymentRequestByWx(entity, merchantEntity, date, time, orderNo, orderAmount);
|
}else if("alipay".equalsIgnoreCase(payChannel)){
|
//支付宝支付
|
return getPaymentRequestByAliPay(entity, merchantEntity, date, time, orderNo, orderAmount);
|
|
}else{
|
//银联支付
|
return getPaymentRequestByUnionPay(entity, merchantEntity, date, time, orderNo, orderAmount);
|
|
}
|
}
|
public static JSON getPaymentRequestByWx(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
|
//1、生成订单对象
|
UnifiedPaymentRequest tPaymentRequest = new UnifiedPaymentRequest();
|
|
tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_MICROPAY); //设定交易类型
|
tPaymentRequest.dicOrder.put("OrderDate", date); //设定订单日期 (必要信息 - YYYY/MM/DD)
|
tPaymentRequest.dicOrder.put("OrderTime", time); //设定订单时间 (必要信息 - HH:MM:SS)
|
tPaymentRequest.dicOrder.put("OrderNo", orderNo); //设定订单编号 (必要信息)
|
tPaymentRequest.dicOrder.put("CurrencyCode", "156"); //设定交易币种
|
tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString()); //设定交易金额
|
tPaymentRequest.dicOrder.put("BuyIP", entity.getIp()); // 客户IP
|
tPaymentRequest.dicOrder.put("AccountNo", entity.getQrCode()); // 付款码
|
tPaymentRequest.dicOrder.put("OrderDesc", "收款单:"+orderNo); // 商品描述
|
tPaymentRequest.dicOrder.put("CommodityType", "0202");
|
//3、生成支付请求对象
|
tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_WX); //设定微信支付
|
tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET); //设定支付接入方式
|
tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER); //设定通知方式
|
tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity)); // 附言
|
tPaymentRequest.dicRequest.put("CommodityType", "0202"); // 设置商品种类
|
//--测试环境
|
//tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do"); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL()); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO); //设定交易是否分账、交易是否支持向二级商户入账
|
System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
|
return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
|
}
|
|
public static String getMerchantRemarks(OrderEntity entity) {
|
return String.format("单号:%s,客户编号:%s,[%s]", entity.getOrderNo(), entity.getCltCode(), entity.getCompanyName());
|
}
|
|
public static JSON getPaymentRequestByAliPay(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
|
//1、生成订单对象
|
AlipayRequest tPaymentRequest = new AlipayRequest();
|
|
tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_ALI_PAY); //设定交易类型
|
tPaymentRequest.dicOrder.put("OrderDate", date); //设定订单日期 (必要信息 - YYYY/MM/DD)
|
tPaymentRequest.dicOrder.put("OrderTime", time); //设定订单时间 (必要信息 - HH:MM:SS)
|
tPaymentRequest.dicOrder.put("OrderNo", orderNo); //设定订单编号 (必要信息)
|
tPaymentRequest.dicOrder.put("CurrencyCode", "156"); //设定交易币种
|
tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString()); //设定交易金额
|
tPaymentRequest.dicOrder.put("BuyIP", entity.getIp()); // 客户IP
|
tPaymentRequest.dicOrder.put("AccountNo", entity.getQrCode()); // 付款码
|
tPaymentRequest.dicOrder.put("OrderDesc", "收款单:"+orderNo); // 商品描述
|
tPaymentRequest.dicOrder.put("CommodityType", "0202"); // 设置商品种类
|
|
//3、生成支付请求对象
|
tPaymentRequest.dicRequest.put("CommodityType", "0202"); // 设置商品种类
|
tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_ALIPAY); //设定支付类型
|
tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET); //设定支付接入方式
|
tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER); //设定通知方式
|
tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity));
|
//--测试环境
|
//tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do"); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL()); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO); //设定交易是否分账、交易是否支持向二级商户入账
|
System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
|
return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
|
}
|
public static JSON getPaymentRequestByUnionPay(OrderEntity entity, MerchantEntity merchantEntity, String date, String time, String orderNo, BigDecimal orderAmount) {
|
//1、生成订单对象
|
QRPayCode tPaymentRequest = new QRPayCode();
|
|
tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY); //设定交易类型
|
tPaymentRequest.dicOrder.put("OrderDate", date); //设定订单日期 (必要信息 - YYYY/MM/DD)
|
tPaymentRequest.dicOrder.put("OrderTime", time); //设定订单时间 (必要信息 - HH:MM:SS)
|
tPaymentRequest.dicOrder.put("OrderNo", orderNo); //设定订单编号 (必要信息)
|
tPaymentRequest.dicOrder.put("CurrencyCode", "156"); //设定交易币种
|
tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString()); //设定交易金额
|
tPaymentRequest.dicOrder.put("InstallmentMark", "0"); // 分期标识
|
tPaymentRequest.dicOrder.put("CommodityType", "0202"); // 设置商品种类
|
tPaymentRequest.dicOrder.put("BuyIP", entity.getIp()); // IP
|
tPaymentRequest.dicOrder.put("QRPayCode", entity.getQrCode()); // 付款码
|
//2、订单明细
|
LinkedHashMap orderitem = new LinkedHashMap();
|
orderitem.put("ProductName", orderNo);//商品名称
|
tPaymentRequest.orderitems.put(1, orderitem);
|
//3、生成支付请求对象
|
tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_ALL); //设定支付类型
|
tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_NET); //设定支付接入方式
|
tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER); //设定通知方式
|
tPaymentRequest.dicRequest.put("MerchantRemarks", getMerchantRemarks(entity));
|
//--测试环境
|
//tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do"); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("ResultNotifyURL", merchantEntity.getResultNotifyURL()); //设定通知URL地址
|
tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO); //设定交易是否分账、交易是否支持向二级商户入账
|
System.out.println(com.alibaba.fastjson.JSON.toJSONString(tPaymentRequest));
|
return tPaymentRequest.extendPostRequest(merchantEntity.getIndex());
|
}
|
/**
|
* 获取支付渠道(微信,支付宝,银联)
|
* @return
|
* @throws Exception
|
*/
|
private static String getChannelType(String qrCode){
|
String payChannel;
|
String wx[] = { "10", "11", "12", "13", "14", "15" };
|
String ali[] = { "25", "26", "27", "28", "29", "30" };
|
String yl[] = {"62"};
|
if (StringUtils.startsWithAny(qrCode.substring(0, 2), wx)) {
|
payChannel= "wechat";
|
} else if (StringUtils.startsWithAny(qrCode.substring(0, 2), ali)) {
|
payChannel= "alipay";
|
}else {
|
payChannel= "unoinpay";
|
}
|
return payChannel;
|
}
|
|
}
|