记得上下班打卡 | git大法好,push需谨慎

Commit 2599db37 authored by zhengfuxin's avatar zhengfuxin

银联订单查询。

parent 2035c8db
...@@ -27,6 +27,8 @@ public enum DragonErrorCodeEnum { ...@@ -27,6 +27,8 @@ public enum DragonErrorCodeEnum {
TRADE_ALIPAY_QUERY_ERROR("PAY0010010","支付宝订单查询失败!"), TRADE_ALIPAY_QUERY_ERROR("PAY0010010","支付宝订单查询失败!"),
TRADE_UNIONPAY_QUERY_ERROR("PAY0040002","银联订单查询失败,因缓存消失,查询不到订单导致!"),
TRADE_WEPAY_SIGN_ERROR("PAY0020001","微信签名异常!"), TRADE_WEPAY_SIGN_ERROR("PAY0020001","微信签名异常!"),
TRADE_UNIONPAY_SIGN_ERROR("PAY0040001","银联签名异常!"), TRADE_UNIONPAY_SIGN_ERROR("PAY0040001","银联签名异常!"),
......
...@@ -8,6 +8,7 @@ import com.liquidnet.service.dragon.channel.alipay.constant.AlipayConstant; ...@@ -8,6 +8,7 @@ import com.liquidnet.service.dragon.channel.alipay.constant.AlipayConstant;
import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler; import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz; import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.channel.unionpay.biz.UnionpayBiz; import com.liquidnet.service.dragon.channel.unionpay.biz.UnionpayBiz;
import com.liquidnet.service.dragon.channel.unionpay.constant.UnionpayConstant;
import com.liquidnet.service.dragon.channel.unionpay.sdk.AcpService; import com.liquidnet.service.dragon.channel.unionpay.sdk.AcpService;
import com.liquidnet.service.dragon.channel.unionpay.sdk.SDKConstants; import com.liquidnet.service.dragon.channel.unionpay.sdk.SDKConstants;
import com.liquidnet.service.dragon.channel.unionpay.strategy.UnionpayStrategyContext; import com.liquidnet.service.dragon.channel.unionpay.strategy.UnionpayStrategyContext;
...@@ -118,9 +119,37 @@ public class PayChannelStrategyUnionpayImpl extends AbstractPayChannelStrategyIm ...@@ -118,9 +119,37 @@ public class PayChannelStrategyUnionpayImpl extends AbstractPayChannelStrategyIm
@Override @Override
public DragonPayOrderQueryRespDto checkOrderStatus(String code) { public DragonPayOrderQueryRespDto checkOrderStatus(String code) {
// 查看是哪个deviceForm 的支付
DragonOrdersDto ordersDto = dataUtils.getPayOrderByCode(code); DragonOrdersDto ordersDto = dataUtils.getPayOrderByCode(code);
Map<String, Object> resultMap = unionpayBiz.tradeQuery(code); if(null==ordersDto){
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_UNIONPAY_QUERY_ERROR.getCode(),DragonErrorCodeEnum.TRADE_UNIONPAY_QUERY_ERROR.getMessage());
}
DragonPayOrderQueryRespDto respDto = dragonPayBiz.buildPayOrderQueryRespDto(ordersDto); DragonPayOrderQueryRespDto respDto = dragonPayBiz.buildPayOrderQueryRespDto(ordersDto);
//判断是wap还是app
if(ordersDto.getPaymentType().contains("WAP")){
//wap类型查询订单
Map<String, String> resultMap = unionpayBiz.tradeQuery(code);
if(("00").equals(resultMap.get("respCode"))){//如果查询交易成功
String origRespCode = resultMap.get("origRespCode");
if((UnionpayConstant.UnionTradeStateEnum.TRADE_SUCCESS).equals(origRespCode)||UnionpayConstant.UnionTradeStateEnum.TRADE_DEFECTIVENESS_SUCCESS.equals(origRespCode)){
//交易成功
respDto.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
}else if(("03").equals(origRespCode)||
("04").equals(origRespCode)||
("05").equals(origRespCode)){
//订单处理中或交易状态未明,需稍后发起交易状态查询交易 【如果最终尚未确定交易是否成功请以对账文件为准】
respDto.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_UNPAID.getCode()));
}else{
//其他应答码为交易失败
//TODO
respDto.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_PAY_FAIL.getCode()));
}
}
}else{
//app类型查询订单
}
/* DragonPayOrderQueryRespDto respDto = dragonPayBiz.buildPayOrderQueryRespDto(ordersDto);
if ("10000".equals(resultMap.get("code"))) { if ("10000".equals(resultMap.get("code"))) {
// 当返回状态为“TRADE_FINISHED”交易成功结束和“TRADE_SUCCESS”支付成功时更新交易状态 // 当返回状态为“TRADE_FINISHED”交易成功结束和“TRADE_SUCCESS”支付成功时更新交易状态
if (AlipayConstant.AlipayTradeStateEnum.TRADE_SUCCESS.getCode().equals(resultMap.get("tradeStatus")) if (AlipayConstant.AlipayTradeStateEnum.TRADE_SUCCESS.getCode().equals(resultMap.get("tradeStatus"))
...@@ -134,7 +163,7 @@ public class PayChannelStrategyUnionpayImpl extends AbstractPayChannelStrategyIm ...@@ -134,7 +163,7 @@ public class PayChannelStrategyUnionpayImpl extends AbstractPayChannelStrategyIm
respDto.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_UNPAID.getCode())); respDto.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_UNPAID.getCode()));
}else{ }else{
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ALIPAY_QUERY_ERROR.getCode(),DragonErrorCodeEnum.TRADE_ALIPAY_QUERY_ERROR.getMessage()); throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ALIPAY_QUERY_ERROR.getCode(),DragonErrorCodeEnum.TRADE_ALIPAY_QUERY_ERROR.getMessage());
} }*/
return respDto; return respDto;
} }
} }
package com.liquidnet.service.dragon.channel.unionpay.biz; package com.liquidnet.service.dragon.channel.unionpay.biz;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.DateUtil; import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator; import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.dragon.channel.unionpay.constant.UnionpayConstant; import com.liquidnet.service.dragon.channel.unionpay.constant.UnionpayConstant;
...@@ -7,6 +8,7 @@ import com.liquidnet.service.dragon.channel.unionpay.req.UnionpayTradePayReq; ...@@ -7,6 +8,7 @@ import com.liquidnet.service.dragon.channel.unionpay.req.UnionpayTradePayReq;
import com.liquidnet.service.dragon.channel.unionpay.sdk.AcpService; import com.liquidnet.service.dragon.channel.unionpay.sdk.AcpService;
import com.liquidnet.service.dragon.channel.unionpay.sdk.SDKConfig; import com.liquidnet.service.dragon.channel.unionpay.sdk.SDKConfig;
import com.liquidnet.service.dragon.channel.unionpay.sdk.SDKConstants; import com.liquidnet.service.dragon.channel.unionpay.sdk.SDKConstants;
import com.liquidnet.service.dragon.constant.DragonErrorCodeEnum;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -190,16 +192,14 @@ public class UnionpayBiz { ...@@ -190,16 +192,14 @@ public class UnionpayBiz {
/** /**
* 订单查询 * wap 银联订单查询
* *
* @return * @return
*/ */
public Map<String, Object> tradeQuery(String outTradeNo) { public Map<String, String> tradeQuery(String outTradeNo) {
log.info("UnionpayBiz.tradeQuery-->> "); log.info("UnionpayBiz.tradeQuery-->> ");
String txnTime = DateUtil.format(LocalDateTime.now(),DateUtil.Formatter.yyyyMMddHHmmssTrim); String txnTime = DateUtil.format(LocalDateTime.now(),DateUtil.Formatter.yyyyMMddHHmmssTrim);
Map<String, String> data = new HashMap<String, String>(); Map<String, String> data = new HashMap<String, String>();
/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/ /***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
data.put("version", sdkConfig.getVersion()); //版本号 data.put("version", sdkConfig.getVersion()); //版本号
data.put("encoding", UnionpayConstant.encoding); //字符集编码 可以使用UTF-8,GBK两种方式 data.put("encoding", UnionpayConstant.encoding); //字符集编码 可以使用UTF-8,GBK两种方式
...@@ -207,27 +207,21 @@ public class UnionpayBiz { ...@@ -207,27 +207,21 @@ public class UnionpayBiz {
data.put("txnType", "00"); //交易类型 00-默认 data.put("txnType", "00"); //交易类型 00-默认
data.put("txnSubType", "00"); //交易子类型 默认00 data.put("txnSubType", "00"); //交易子类型 默认00
data.put("bizType", "000201"); //业务类型 data.put("bizType", "000201"); //业务类型
/***商户接入参数***/ /***商户接入参数***/
data.put("merId", merchantId); //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试 data.put("merId", merchantId); //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
data.put("accessType", "0"); //接入类型,商户接入固定填0,不需修改 data.put("accessType", "0"); //接入类型,商户接入固定填0,不需修改
/***要调通交易以下字段必须修改***/ /***要调通交易以下字段必须修改***/
data.put("orderId", outTradeNo); //****商户订单号,每次发交易测试需修改为被查询的交易的订单号 data.put("orderId", outTradeNo); //****商户订单号,每次发交易测试需修改为被查询的交易的订单号
data.put("txnTime", txnTime); //****订单发送时间,每次发交易测试需修改为被查询的交易的订单发送时间 data.put("txnTime", txnTime); //****订单发送时间,每次发交易测试需修改为被查询的交易的订单发送时间
/**请求参数设置完毕,以下对请求参数进行签名并发送http post请求,接收同步应答报文------------->**/ /**请求参数设置完毕,以下对请求参数进行签名并发送http post请求,接收同步应答报文------------->**/
Map<String, String> reqData = acpService.sign(data,UnionpayConstant.encoding); //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。 Map<String, String> reqData = acpService.sign(data,UnionpayConstant.encoding); //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
String url = sdkConfig.getSingleQueryUrl(); //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.singleQueryUrl String url = sdkConfig.getBackTransUrl(); //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.singleQueryUrl
Map<String, String> rspData = acpService.post(reqData, url,UnionpayConstant.encoding); //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过 Map<String, String> rspData = acpService.post(reqData, url,UnionpayConstant.encoding); //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过
/**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/ /**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
//应答码规范参考open.unionpay.com帮助中心 下载 产品接口规范 《平台接入接口规范-第5部分-附录》 //应答码规范参考open.unionpay.com帮助中心 下载 产品接口规范 《平台接入接口规范-第5部分-附录》
if(!rspData.isEmpty()){ if(!rspData.isEmpty()){
if(acpService.validate(rspData, UnionpayConstant.encoding)){ if(acpService.validate(rspData, UnionpayConstant.encoding)){
log.info("验证签名成功"); /* if(("00").equals(rspData.get("respCode"))){//如果查询交易成功
if(("00").equals(rspData.get("respCode"))){//如果查询交易成功
String origRespCode = rspData.get("origRespCode"); String origRespCode = rspData.get("origRespCode");
if(("00").equals(origRespCode)){ if(("00").equals(origRespCode)){
//交易成功,更新商户订单状态 //交易成功,更新商户订单状态
...@@ -246,21 +240,20 @@ public class UnionpayBiz { ...@@ -246,21 +240,20 @@ public class UnionpayBiz {
}else{//查询交易本身失败,如应答码10/11检查查询报文是否正确 }else{//查询交易本身失败,如应答码10/11检查查询报文是否正确
//TODO //TODO
} }*/
}else{ }else{
log.error("验证签名失败"); log.error("wap 银联订单查询,验证签名失败");
//TODO 检查验证签名失败的原因 throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_UNIONPAY_SIGN_ERROR.TRADE_ALIPAY_QUERY_ERROR.getCode(),DragonErrorCodeEnum.TRADE_UNIONPAY_SIGN_ERROR.getMessage());
} }
}else{ }else{
//未返回正确的http状态 //未返回正确的http状态
log.error("未获取到返回报文或返回http状态码非200"); log.error("wap 银联订单查询,未获取到返回报文或返回http状态码非200");
} }
/*String reqMessage = this.genHtmlResult(reqData);
String reqMessage = this.genHtmlResult(reqData);
String rspMessage = this.genHtmlResult(rspData); String rspMessage = this.genHtmlResult(rspData);
log.info("请求报文:<br/>"+reqMessage+"<br/>"); log.info("请求报文:<br/>"+reqMessage+"<br/>");
log.info("应答报文:</br>"+rspMessage+""); log.info("应答报文:</br>"+rspMessage+"");*/
return null; return rspData;
} }
public Map<String, Object> appSingleRefund() public Map<String, Object> appSingleRefund()
......
...@@ -12,4 +12,24 @@ package com.liquidnet.service.dragon.channel.unionpay.constant; ...@@ -12,4 +12,24 @@ package com.liquidnet.service.dragon.channel.unionpay.constant;
public class UnionpayConstant { public class UnionpayConstant {
//默认配置的是UTF-8 //默认配置的是UTF-8
public static String encoding = "UTF-8"; public static String encoding = "UTF-8";
public enum UnionTradeStateEnum {
TRADE_CLOSED ("TRADE_CLOSED","交易关闭"),
TRADE_FINISHED ("TRADE_FINISHED","支付完成"),
TRADE_DEFECTIVENESS_SUCCESS ("A6","有缺陷的成功"),
TRADE_SUCCESS ("00","支付成功"),
WAIT_BUYER_PAY ("WAIT_BUYER_PAY","交易创建"),
FAIL("01","支付失败");
private String code;
private String message;
UnionTradeStateEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
}
} }
...@@ -316,7 +316,7 @@ public class AcpService { ...@@ -316,7 +316,7 @@ public class AcpService {
return null; return null;
} }
Map<String,String> result = SDKUtil.parseRespString(new String(respBytes, encoding)); Map<String,String> result = SDKUtil.parseRespString(new String(respBytes, encoding));
log.info("应答参数:" + result); log.info("银联应答参数:" + result);
return result; return result;
} catch (Exception e) { } catch (Exception e) {
log.error("post失败:" + e.getMessage(), e); log.error("post失败:" + e.getMessage(), e);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment