/*** 统一添加订单
*
*@parampaymentOrder
*@return
*/@WeiXinLogin
@RequestMapping("/addOrder")publicResponseModel addOrder(OrderVO orderVO) {
LoginUserVO user=RequestContext.getContext().getUser();
String key= PAYMENT_ORDER_ADD_LOCK_KEY +user.getMemberId();try{
orderVO.setMemberId(user.getMemberId());
orderVO.setOrderNo(wechatOrderNo.nextId()+ "");
orderVO.setPayType(PayType.CCBPAY);//订单支付渠道为建行
if (redisLockUtil.tryLock(key, 10)) {
Integer orderId=orderApi.addOrder(orderVO);return newResponseModel(orderId);
}else{return new ResponseModel(ErrorCode.BIZ_EXCEPTION.getErrcode(), "操作过于频繁", null);
}
}catch(BizException e) {
LOGGER.error("addOrder error,{}", e);return new ResponseModel(e.getErrcode(), e.getErrm(), null);
}finally{
redisLockUtil.unlock(key);
}
}/*** 支付
*@paramorderId
*@paramrequest
*@return*@throwsException*/@WeiXinLogin
@RequestMapping("/prePay")public ResponseModel prePay(Integer orderId, HttpServletRequest request) throwsException {
String key= PAYMENT_ORDER_PREPAY_LOCK_KEY +orderId;try{
LoginUserVO user=RequestContext.getContext().getUser();
PaymentOrderRecord orderRecord=orderApi.getOrderById(orderId);
PayRequestInfo payRequestInfo= newPayRequestInfo();
payRequestInfo.setBody("xxx缴费");
payRequestInfo.setNotifyUrl(systemConfig.getPayNotifyUrl());//该回调地址只是微信支付,与建行支付没关系 如果是建行支付直接忽略这行代码
payRequestInfo.setOpenId(user.getAppOpenId());
payRequestInfo.setOrderNo(orderRecord.getOrderNo());
payRequestInfo.setOrderPrice(orderRecord.getOrderPrice());
payRequestInfo.setPayType(orderRecord.getPayType());
payRequestInfo.setSpbillCreateIp(getIpAddr(request));
payRequestInfo.setTradeType("MINIPRO");
payRequestInfo.setAppId(systemConfig.getAppletsAppId());
String randomNum= System.currentTimeMillis() + new Random().nextInt(10000) + "";if (redisLockUtil.tryLock(key, randomNum, 5)) {
PayResult payResult=payApi.pay(payRequestInfo);return newResponseModel(payResult);
}else{return new ResponseModel(ErrorCode.BIZ_EXCEPTION.getErrcode(), "操作过于频繁", null);
}
}catch(BizException e) {
LOGGER.error("prePay error,{}", e);return new ResponseModel(e.getErrcode(), e.getErrm(), null);
}finally{
redisLockUtil.unlock(key);
}
}/*** 建行支付结果通知
*
*@paramrequest
*@return
*/@RequestMapping("/callBackCCB")publicString callBackCCB(HttpServletRequest request) {
LOGGER.info("callBackCCB start!");try{
Map map = new HashMap();
Enumeration parameterNames =request.getParameterNames();
StringBuilder data= newStringBuilder();while(parameterNames.hasMoreElements()) {
String name=(String) parameterNames.nextElement();
String value=request.getParameter(name);
map.put(name, value);
data.append(name).append("=").append(value).append("&");
}
LOGGER.info("callBackCCB source data :[{}]", data.toString());//建行返回调原数据
StringBuilder sb = newStringBuilder();
sb.append("POSID=").append(map.get("POSID")).append("&BRANCHID=").append(map.get("BRANCHID"))
.append("&ORDERID=").append(map.get("ORDERID")).append("&PAYMENT=").append(map.get("PAYMENT"))
.append("&CURCODE=").append(map.get("CURCODE")).append("&REMARK1=").append(map.get("REMARK1"))
.append("&REMARK2=").append(map.get("REMARK2")).append("&ACC_TYPE=").append(map.get("ACC_TYPE"))
.append("&SUCCESS=").append(map.get("SUCCESS")).append("&TYPE=").append(map.get("TYPE"))
.append("&REFERER=").append(map.get("REFERER")).append("&CLIENTIP=").append(map.get("CLIENTIP"))
.append("&ACCDATE=").append(map.get("ACCDATE"));
RSASig rsaSig= newRSASig();
rsaSig.setPublicKey(CCBConstants.PUBLICKEY);//公钥
boolean flag = rsaSig.verifySigature(map.get("SIGN"), sb.toString());
LOGGER.info("callBackCCB Check :[{}]", flag);if ("Y".equals(map.get("SUCCESS")) &&flag) {//表示支付成功
CallbackResult callbackResult= newCallbackResult();
callbackResult.setReturnCode("Y");
callbackResult.setReturnMsg("Ok");
callbackResult.setOrderNo(map.get("ORDERID"));//订单号
payApi.callBack(callbackResult);
}
}catch(Exception e) {
LOGGER.error("callBackCCB error,{}", e);
}return null;
}
//PayApi 接口的实现类