在公司业务中,对接汇潮支付,--------该需求是调用汇潮的支付接口,他们作为中台,由他们调用支付宝接口
在异步回调的时候,遇到了“参数通过 post 方式提交, Content-Type: application/x-www-form-urlencoded ”,回调参数接收不到,无法转化,的问题。
解决思路如下,以往都是用json的方式,所以在controller里面写了@RequestBody,实际是,直接用一个对象接收,不用写@RequestBody,然后下面在serviceImpl里面,代码转换。
贴出代码
/**
* 支付方式异步通知接口
* @param getHcPayRequest 异步通知获得json字符串
* @return 异步通知结果 success/fail
*/
/*汇潮支付--支付方式异步通知接口*/
public String notifyInfos(HcPayRequest getHcPayRequest) {
logger.info("汇潮异步回调参数" + JSON.toJSONString(getHcPayRequest));
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);//针对fastjson解析 mq里面的redis获取值的解析,不然会出错
String merchantOutOrderNo =getHcPayRequest.getMerchantOutOrderNo();;//商户订单号
String merid = getHcPayRequest.getMerid();//商户号
String msg =getHcPayRequest.getMsg();//订单的详细信息 msg->pay Money
String res = null;
try {
res = URLDecoder.decode(msg,"UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("汇潮异步回调参数解码失败-" + JSON.toJSONString(msg));
e.printStackTrace();
}
JSONObject jsonObject = JSON.parseObject(res);
System.out.println(getHcPayRequest.toString());
String orderNo =getHcPayRequest.getOrderNo();//平台订单号
String orderMoney = (String)jsonObject.get( "payMoney" );// 支付金额
/**
* 通知参数样例:
* 在汇潮的接口文档里面有这个
* merchantOutOrderNo=2017091316410597&merid=
* yft2017082500005&msg={"payMoney":"1.00"}&noncestr=adfasdfqwer&orderNo=20170913164
* 1128501&payResult=1&sign= 078c2637c96d714880fdb3364d440b51
*/
String trasactionId = orderNo;//平台订单编号 比如支付宝平台
try {
if (redisTemplate.hasKey(Constants.HC_PREFIX + trasactionId)) { //放进Redis
logger.info("hcpay有重复通知" + trasactionId);
return "success";
} else {
redisTemplate.opsForValue().set(Constants.HC_PREFIX + trasactionId, "1", 2880, TimeUnit.MINUTES);
}
} catch (Exception e) {
e.printStackTrace();
logger.error("hcpay写redis出错" + e.getMessage());
}
HcPayRequest hcPayRequestnew = new HcPayRequest();
hcPayRequestnew.setMerchantOutOrderNo(merchantOutOrderNo);
hcPayRequestnew.setOrderNo(orderNo);
hcPayRequestnew.setAmount(orderMoney);
EvaFeeInfo evaFeeInfoNew =(EvaFeeInfo)redisTemplate.opsForValue().get(Constants.HC_PREFIX +Constants.PAY_PG+ merchantOutOrderNo);
if(evaFeeInfoNew!=null){
logger.info("hc汇潮支付redis获取的param" + JSON.toJSONString(evaFeeInfoNew));
if (Constants.PAY_PG.equals(evaFeeInfoNew.getFlag())) {//评估费
EvaFeeInfo evaFeeInfo = new EvaFeeInfo();
evaFeeInfo.setEvaAmount(evaFeeInfoNew.getEvaAmount());//
evaFeeInfo.setUserId(evaFeeInfoNew.getUserId());//
evaFeeInfo.setMobile(evaFeeInfoNew.getMobile());//
evaFeeInfo.setCouponId(evaFeeInfoNew.getCouponId());//
evaFeeInfo.setRepayNo(orderNo);
evaFeeInfo.setTradeNo(evaFeeInfoNew.getTradeNo());//商家唯一标示 订单号
evaFeeInfo.setCurrentCash(evaFeeInfoNew.getCurrentCash());//
evaFeeInfo.setIsUseCash(evaFeeInfoNew.getIsUseCash());//
hcPayRequestnew.setFlag(Constants.PAY_PG);
try {
logger.info("评估费发送rabbitmq");
rabbitmqProducerProxy.convertAndSend("evaFee.ibank", evaFeeInfo);
} catch (Exception e) {
e.printStackTrace();
}
}
}
RecFeeInfo recFeeInfoNew =(RecFeeInfo)redisTemplate.opsForValue().get(Constants.HC_PREFIX +Constants.PAY_TJ+merchantOutOrderNo);
if(recFeeInfoNew!=null){
logger.info("hc汇潮支付redis获取的param" + JSON.toJSONString(recFeeInfoNew));
if (Constants.PAY_TJ.equals(recFeeInfoNew.getFlag())) {//推荐费
RecFeeInfo recFeeInfo = new RecFeeInfo();
recFeeInfo.setRecAmount(recFeeInfoNew.getRecAmount());//
recFeeInfo.setUserId(recFeeInfoNew.getUserId());//
recFeeInfo.setMobile(recFeeInfoNew.getMobile());//
recFeeInfo.setBorrowPeriods(recFeeInfoNew.getBorrowPeriods());//借款周期//
recFeeInfo.setLoanAmount(recFeeInfoNew.getLoanAmount());//
// recFeeInfo.setType(hcPayRequest.getType());--------------------------------------------
recFeeInfo.setRepayNo(orderNo);//
recFeeInfo.setTradeNo(recFeeInfoNew.getTradeNo());//商家唯一标示 订单号
recFeeInfo.setCouponId(recFeeInfoNew.getCouponId());//
recFeeInfo.setAppCodeList(recFeeInfoNew.getAppCodeList());//
recFeeInfo.setCurrentCash(recFeeInfoNew.getCurrentCash());//
recFeeInfo.setIsUseCash(recFeeInfoNew.getIsUseCash());//
hcPayRequestnew.setFlag(Constants.PAY_TJ);
try {
logger.info("推荐费发送rabbitmq order");
rabbitmqProducerProxy.convertAndSend("recFee.ibank", recFeeInfo);
//去掉 发给 user的推荐费
// logger.info("推荐费发送rabbitmq user");
// rabbitmqProducerProxy.convertAndSend("recUser.ibank", recFeeInfo);
} catch (Exception e) {
e.printStackTrace();
}
}
}
RechargeFeeInfo rechargeFeeInfoNew =(RechargeFeeInfo)redisTemplate.opsForValue().get(Constants.HC_PREFIX + Constants.PAY_XJ +merchantOutOrderNo);
if(rechargeFeeInfoNew!=null){
if(Constants.PAY_XJ.equals(rechargeFeeInfoNew.getFlag())){//充值现金券
RechargeFeeInfo rechargeFeeInfo = new RechargeFeeInfo();
rechargeFeeInfo.setAccountNumber(rechargeFeeInfoNew.getAccountNumber());//手机号//
rechargeFeeInfo.setAmount(rechargeFeeInfoNew.getAmount());//
rechargeFeeInfo.setCashId(rechargeFeeInfoNew.getCashId());//
rechargeFeeInfo.setOperStatus(1);// /**充值是否成功 0:失败 1:成功*/
rechargeFeeInfo.setRechargeFlowNo(orderNo);
rechargeFeeInfo.setTradeNo(rechargeFeeInfoNew.getTradeNo());//商家唯一标示 订单号
rechargeFeeInfo.setStatusMsg("1");//汇潮支付 1 为成功(目前只有成功才通知)
hcPayRequestnew.setFlag(Constants.PAY_XJ);
try {
logger.info("hc汇潮支付充值现金券发送rabbitmq order");
rabbitmqProducerProxy.convertAndSend("rechargeFee.ibank", rechargeFeeInfo);
} catch (Exception e) {
e.printStackTrace();
logger.error("hc汇潮支付现金券充值 异常", e);
}
}
}
payLogService.saveHcPay(hcPayRequestnew,Constants.REPAY_STATUS_ZERO );
logger.info("汇潮支付支付成功" + orderNo);
return "success";
}
/**
* 支付方式异步通知接口
* @param getHcPayRequest 异步通知获得json字符串
* @return 异步通知结果 success/fail
*/
/*汇潮支付--支付方式异步通知接口*/
@RequestMapping(value = "/notifyInfos",method = RequestMethod.POST)
public String notifyInfos( HcPayRequest getHcPayRequest){
String toSuccessOrFail = hcPayService.notifyInfos(getHcPayRequest);
return toSuccessOrFail;
}