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

Commit 5a7178e2 authored by zhengfuxin's avatar zhengfuxin

修改银联支付,app支付。

parent a593c8d9
...@@ -43,6 +43,8 @@ liquidnet: ...@@ -43,6 +43,8 @@ liquidnet:
acpsdk: acpsdk:
## 消费接口 ## 消费接口
frontTransUrl: ${liquidnet.dragon.unionpay.gateway-url}/gateway/api/frontTransReq.do frontTransUrl: ${liquidnet.dragon.unionpay.gateway-url}/gateway/api/frontTransReq.do
## app 消费接口
appTransUrl: ${liquidnet.dragon.unionpay.gateway-url}/gateway/api/appTransReq.do
## 交易状态查询 ## 交易状态查询
backTransUrl: ${liquidnet.dragon.unionpay.gateway-url}/gateway/api/backTransReq.do backTransUrl: ${liquidnet.dragon.unionpay.gateway-url}/gateway/api/backTransReq.do
## 退款路径 (https://gateway.95516.com/gateway/api/backTransReq.do) ## 退款路径 (https://gateway.95516.com/gateway/api/backTransReq.do)
......
...@@ -66,7 +66,7 @@ public class UnionpayBiz { ...@@ -66,7 +66,7 @@ public class UnionpayBiz {
/***商户接入参数***/ /***商户接入参数***/
requestData.put("merId", payReq.getMerId()); //商户号码,请改成自己申请的正式商户号或者open上注册得来的777测试商户号 requestData.put("merId", payReq.getMerId()); //商户号码,请改成自己申请的正式商户号或者open上注册得来的777测试商户号
requestData.put("accessType", "0"); //接入类型,0:直连商户 requestData.put("accessType", "0"); //接入类型,0:直连商户
requestData.put("orderId",orderId); //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则 requestData.put("orderId",payReq.getOrderId()); //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则
requestData.put("txnTime", txnTime); //订单发送时间,取系统时间,格式为yyyyMMddHHmmss,必须取当前时间,否则会报txnTime无效 requestData.put("txnTime", txnTime); //订单发送时间,取系统时间,格式为yyyyMMddHHmmss,必须取当前时间,否则会报txnTime无效
requestData.put("currencyCode", "156"); //交易币种(境内商户一般是156 人民币) requestData.put("currencyCode", "156"); //交易币种(境内商户一般是156 人民币)
requestData.put("txnAmt", payReq.getTxnAmt()); //交易金额,单位分,不要带小数点 requestData.put("txnAmt", payReq.getTxnAmt()); //交易金额,单位分,不要带小数点
...@@ -111,13 +111,9 @@ public class UnionpayBiz { ...@@ -111,13 +111,9 @@ public class UnionpayBiz {
*/ */
public Map<String, String> tradeAppPay(UnionpayTradePayReq payReq) { public Map<String, String> tradeAppPay(UnionpayTradePayReq payReq) {
log.info("UnionpayBiz.tradeAppPay-->> req : {}",payReq.toString()); log.info("UnionpayBiz.tradeAppPay-->> req : {}",payReq.toString());
String txnAmt = "100";
String orderId = IDGenerator.payCode();
//设置订单过期时间 //设置订单过期时间
String txnTime = DateUtil.format(LocalDateTime.now(),DateUtil.Formatter.yyyyMMddHHmmssTrim); String txnTime = DateUtil.format(LocalDateTime.now(),DateUtil.Formatter.yyyyMMddHHmmssTrim);
Map<String, String> contentData = new HashMap<String, String>(); Map<String, String> contentData = new HashMap<String, String>();
/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/ /***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
contentData.put("version", sdkConfig.getVersion()); //版本号 全渠道默认值 contentData.put("version", sdkConfig.getVersion()); //版本号 全渠道默认值
contentData.put("encoding", UnionpayConstant.encoding); //字符集编码 可以使用UTF-8,GBK两种方式 contentData.put("encoding", UnionpayConstant.encoding); //字符集编码 可以使用UTF-8,GBK两种方式
...@@ -130,10 +126,10 @@ public class UnionpayBiz { ...@@ -130,10 +126,10 @@ public class UnionpayBiz {
/***商户接入参数***/ /***商户接入参数***/
contentData.put("merId", payReq.getMerId()); //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试 contentData.put("merId", payReq.getMerId()); //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
contentData.put("accessType", "0"); //接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户) contentData.put("accessType", "0"); //接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)
contentData.put("orderId", orderId); //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则 contentData.put("orderId", payReq.getOrderId()); //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则
contentData.put("txnTime", txnTime); //订单发送时间,取系统时间,格式为yyyyMMddHHmmss,必须取当前时间,否则会报txnTime无效 contentData.put("txnTime", txnTime); //订单发送时间,取系统时间,格式为yyyyMMddHHmmss,必须取当前时间,否则会报txnTime无效
contentData.put("accType", "01"); //账号类型 01:银行卡02:存折03:IC卡帐号类型(卡介质) contentData.put("accType", "01"); //账号类型 01:银行卡02:存折03:IC卡帐号类型(卡介质)
contentData.put("txnAmt", txnAmt); //交易金额 单位为分,不能带小数点 contentData.put("txnAmt", payReq.getTxnAmt()); //交易金额 单位为分,不能带小数点
contentData.put("currencyCode", "156"); //境内商户固定 156 人民币 contentData.put("currencyCode", "156"); //境内商户固定 156 人民币
// 请求方保留域, // 请求方保留域,
...@@ -153,13 +149,13 @@ public class UnionpayBiz { ...@@ -153,13 +149,13 @@ public class UnionpayBiz {
//注意:1.需设置为外网能访问,否则收不到通知 2.http https均可 3.收单后台通知后需要10秒内返回http200或302状态码 //注意:1.需设置为外网能访问,否则收不到通知 2.http https均可 3.收单后台通知后需要10秒内返回http200或302状态码
// 4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200或302,那么银联会间隔一段时间再次发送。总共发送5次,银联后续间隔1、2、4、5 分钟后会再次通知。 // 4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200或302,那么银联会间隔一段时间再次发送。总共发送5次,银联后续间隔1、2、4、5 分钟后会再次通知。
// 5.后台通知地址如果上送了带有?的参数,例如:http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签,否则将会验签失败 // 5.后台通知地址如果上送了带有?的参数,例如:http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签,否则将会验签失败
contentData.put("backUrl", sdkConfig.getBackUrl()); contentData.put("backUrl", payReq.getBackUrl());
/**对请求参数进行签名并发送http post请求,接收同步应答报文**/ /**对请求参数进行签名并发送http post请求,接收同步应答报文**/
Map<String, String> reqData = acpService.sign(contentData,UnionpayConstant.encoding); //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。 Map<String, String> reqData = acpService.sign(contentData,UnionpayConstant.encoding); //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
String requestAppUrl = sdkConfig.getAppTransUrl(); //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.backTransUrl String requestAppUrl = sdkConfig.getAppTransUrl(); //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.backTransUrl
Map<String, String> rspData = acpService.post(reqData,requestAppUrl,UnionpayConstant.encoding); //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过 Map<String, String> rspData = acpService.post(reqData,requestAppUrl,UnionpayConstant.encoding); //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过
log.info("银联App支付返参{}",rspData);
/**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/ /**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
//应答码规范参考open.unionpay.com帮助中心 下载 产品接口规范 《平台接入接口规范-第5部分-附录》 //应答码规范参考open.unionpay.com帮助中心 下载 产品接口规范 《平台接入接口规范-第5部分-附录》
if(!rspData.isEmpty()){ if(!rspData.isEmpty()){
...@@ -169,26 +165,25 @@ public class UnionpayBiz { ...@@ -169,26 +165,25 @@ public class UnionpayBiz {
if(("00").equals(respCode)){ if(("00").equals(respCode)){
//成功,获取tn号 //成功,获取tn号
//String tn = resmap.get("tn"); //String tn = resmap.get("tn");
//TODO
log.info("成功返回结果 :{}");
}else{ }else{
//其他应答码为失败请排查原因或做失败处理 //其他应答码为失败请排查原因或做失败处理
//TODO //TODO
String respMsg = rspData.get("respMsg") ; String respMsg = rspData.get("respMsg") ;
log.info("失败返回结果 respMsg:{}",respMsg); log.info("失败返回结果 respMsg:{}",respMsg);
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_PARAM_ERROR.getCode(),DragonErrorCodeEnum.TRADE_PARAM_ERROR.getMessage());
} }
}else{ }else{
log.error("验证签名失败"); log.error("验证签名失败");
//TODO 检查验证签名失败的原因 throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_UNIONPAY_SIGN_ERROR.getCode(),DragonErrorCodeEnum.TRADE_UNIONPAY_SIGN_ERROR.getMessage());
} }
}else{ }else{
//未返回正确的http状态 //未返回正确的http状态
log.error("未获取到返回报文或返回http状态码非200"); log.error("未获取到返回报文或返回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 rspData; return rspData;
} }
......
...@@ -43,25 +43,27 @@ public abstract class AbstractUnionPayStrategy implements IUnionpayStrategy { ...@@ -43,25 +43,27 @@ public abstract class AbstractUnionPayStrategy implements IUnionpayStrategy {
@Override @Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) { public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
try {
//构造公共请求参数 //构造公共请求参数
UnionpayTradePayReq payReq = this.buildRequestParamMap(dragonPayBaseReqDto); UnionpayTradePayReq payReq = this.buildRequestParamMap(dragonPayBaseReqDto);
//构造个性化参数 //构造个性化参数
payReq = this.appendRequestParam(payReq,dragonPayBaseReqDto); payReq = this.appendRequestParam(payReq,dragonPayBaseReqDto);
//调用支付 //调用支付
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
Map<String, String> result = this.executePay(payReq); Map<String, String> result = this.executePay(payReq);
log.debug("dragonPay:unionpay:"+dragonPayBaseReqDto.getDeviceFrom()+" response xmlStr: {} ", JSON.toJSONString(result)); log.debug("dragonPay:unionpay:"+dragonPayBaseReqDto.getDeviceFrom()+" response : {} ", JSON.toJSONString(result));
log.info("unionpay-dragonPay->耗时:{}",(System.currentTimeMillis() - startTime)+"毫秒"); log.info("unionpay-dragonPay->耗时:{}",(System.currentTimeMillis() - startTime)+"毫秒");
//拼接返回参数 //拼接返回参数
DragonPayBaseRespDto respDto = buildCommonRespDto(dragonPayBaseReqDto); DragonPayBaseRespDto respDto = buildCommonRespDto(dragonPayBaseReqDto);
respDto = this.buildResponseDto(respDto,result); respDto = this.buildResponseDto(respDto,result);
//支付订单持久化
//支付订单持久化 dragonServiceCommonBiz.buildPayOrders(dragonPayBaseReqDto,null);
dragonServiceCommonBiz.buildPayOrders(dragonPayBaseReqDto,null); return ResponseDto.success(respDto);
}catch (Exception e){
return ResponseDto.success(respDto); e.printStackTrace();
}
return null;
} }
/** /**
......
package com.liquidnet.service.dragon.channel.unionpay.strategy.impl; package com.liquidnet.service.dragon.channel.unionpay.strategy.impl;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.StringUtil; import com.liquidnet.commons.lang.util.StringUtil;
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.req.UnionpayTradePayReq; import com.liquidnet.service.dragon.channel.unionpay.req.UnionpayTradePayReq;
import com.liquidnet.service.dragon.channel.unionpay.sdk.SDKConfig;
import com.liquidnet.service.dragon.channel.unionpay.strategy.annotation.StrategyUnionpayHandler; import com.liquidnet.service.dragon.channel.unionpay.strategy.annotation.StrategyUnionpayHandler;
import com.liquidnet.service.dragon.constant.DragonConstant; import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto; import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
...@@ -37,6 +39,9 @@ public class UnionpayStrategyAppImpl extends AbstractUnionPayStrategy { ...@@ -37,6 +39,9 @@ public class UnionpayStrategyAppImpl extends AbstractUnionPayStrategy {
@Autowired @Autowired
private UnionpayBiz unionpayBiz; private UnionpayBiz unionpayBiz;
@Autowired
private SDKConfig sdkConfig;
@Override @Override
protected Map<String, String> executePay(UnionpayTradePayReq payReq) { protected Map<String, String> executePay(UnionpayTradePayReq payReq) {
return unionpayBiz.tradeAppPay(payReq); return unionpayBiz.tradeAppPay(payReq);
...@@ -56,9 +61,14 @@ public class UnionpayStrategyAppImpl extends AbstractUnionPayStrategy { ...@@ -56,9 +61,14 @@ public class UnionpayStrategyAppImpl extends AbstractUnionPayStrategy {
@Override @Override
DragonPayBaseRespDto buildResponseDto(DragonPayBaseRespDto payBaseRespDto, Map<String, String> respResult) { DragonPayBaseRespDto buildResponseDto(DragonPayBaseRespDto payBaseRespDto, Map<String, String> respResult) {
if(StringUtil.isNotNull(respResult)&&respResult.get("tn")!=null){ /* if(StringUtil.isNotNull(respResult)&&respResult.get("tn")!=null){
payBaseRespDto.getPayData().setPrepayId(respResult.get("tn")); payBaseRespDto.getPayData().setPrepayId(respResult.get("tn"));
}*/
payBaseRespDto.getPayData().setRedirectUrl(sdkConfig.getFrontTransUrl());
if(StringUtil.isNotNull(respResult)){
payBaseRespDto.getPayData().setOrderStr(JsonUtils.toJson(respResult));
} }
return payBaseRespDto; return payBaseRespDto;
} }
} }
...@@ -159,7 +159,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService ...@@ -159,7 +159,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
data.put("signMethod", sdkConfig.getSignMethod()); //签名方法 data.put("signMethod", sdkConfig.getSignMethod()); //签名方法
data.put("txnType", "04"); //交易类型 04-退货 data.put("txnType", "04"); //交易类型 04-退货
data.put("txnSubType", "00"); //交易子类型 默认00 data.put("txnSubType", "00"); //交易子类型 默认00
data.put("bizType", "0201"); //业务类型 data.put("bizType", "000201"); //业务类型
data.put("channelType", "08"); //渠道类型,07-PC,08-手机 data.put("channelType", "08"); //渠道类型,07-PC,08-手机
/***商户接入参数***/ /***商户接入参数***/
data.put("merId", unionMerchantId); //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试 data.put("merId", unionMerchantId); //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
......
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