package com.boying.controller.phone;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.boying.common.BaseController;
|
import com.boying.common.SystemConfigProperties;
|
import com.boying.common.util.HttpUtil;
|
import com.boying.entity.*;
|
import com.boying.service.*;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.jpa.domain.Specification;
|
import org.springframework.util.DigestUtils;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import javax.persistence.criteria.CriteriaBuilder;
|
import javax.persistence.criteria.CriteriaQuery;
|
import javax.persistence.criteria.Predicate;
|
import javax.persistence.criteria.Root;
|
import javax.servlet.http.HttpServletRequest;
|
|
import java.io.BufferedWriter;
|
import java.io.FileWriter;
|
import java.io.UnsupportedEncodingException;
|
import java.text.DecimalFormat;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import static com.boying.common.util.MyX509TrustManager.httpsRequest;
|
|
@RestController
|
@RequestMapping("ffPay")
|
public class FFPayController extends BaseController {
|
|
@Autowired
|
private TicketService ticketService;
|
@Autowired
|
private SystemConfigProperties systemConfigProperties;
|
@Autowired
|
private OutParkService outParkService;
|
@Autowired
|
private OrderRecordService orderRecordService;
|
@Autowired
|
private ParkService parkService;
|
@Autowired
|
private BarrierService barrierService;
|
@Autowired
|
private EnterParkService enterParkService;
|
@Autowired
|
private TicketBlackService ticketBlackService;
|
@Autowired
|
private WhiteListService whiteListService;
|
|
static String payKey = "df937eda27cb4a59a12347966678e232";
|
static String paySecret = "9e3b2f387b5b4232a9c782affc9c36ed";
|
static String payerTypeCode = "1304062100000001";
|
static String payerTypeCode2 = "1304062100000002";
|
static String ip = "https://pay.hebcz.cn";
|
static String ip2 = "http://nontax.hebcz.cn";
|
|
|
//生成电子缴款码
|
@PostMapping("zhiFa")
|
public Object zhiFa(Long id){
|
Ticket ticket = (Ticket) ticketService.findById(id);
|
if(ticket.getPayStatus()==1){
|
return error("此罚单已支付");
|
}
|
if(ticket.getStatus()==3){
|
return error("此罚单已撤销");
|
}
|
|
// StringBuffer sbf = new StringBuffer();
|
//// StringBuffer s = new StringBuffer();
|
//// if(ticket.getMoney()==0){
|
//// s.append("amt=0.01");
|
//// }else{
|
//// DecimalFormat df = new DecimalFormat("#.00");
|
//// s.append("amt="+df.format(ticket.getMoney()));
|
//// }
|
//// s.append("¬ifyUrl="+systemConfigProperties.getIp()+"ffPay/result");//回调的url
|
//// s.append("&payKey="+payKey);//财政给的
|
//// s.append("&payerName="+ticket.getCarNo());
|
//// s.append("&payerNum="+ ticket.getCode());//订单号
|
//// s.append("&payerTypeCode="+payerTypeCode);////财政给的
|
//// s.append("&reserve1=");
|
//// s.append("&reserve2=");
|
//// s.append("&reserve3=");
|
//// s.append("&returnUrl=");
|
//// sbf.append(s.toString());
|
//// s.append("&paySecret="+paySecret);////财政给的
|
////
|
//// String encode = DigestUtils.md5DigestAsHex(s.toString().getBytes());
|
//// sbf.append("&sign="+encode);
|
//// sbf.append("&signType=MD5");
|
//// System.out.println(sbf.toString());
|
//// String s1 = httpsRequest(ip+"/pay/inpay","POST",sbf.toString());
|
StringBuffer sbf = new StringBuffer();
|
StringBuffer s = new StringBuffer();
|
if(ticket.getMoney()==0){
|
s.append("amt=0.01");
|
}else{
|
DecimalFormat df = new DecimalFormat("#0.00");
|
s.append("amt="+df.format(ticket.getMoney()).toString());
|
}
|
s.append("¬ifyUrl="+systemConfigProperties.getIp()+"ffPay/result");
|
s.append("&payKey=df937eda27cb4a59a12347966678e232");
|
s.append("&payerName="+ticket.getCarNo());
|
s.append("&payerNum="+ticket.getCode());
|
s.append("&payerTypeCode=1304062100000001");
|
s.append("&reserve1=");
|
s.append("&reserve2=");
|
s.append("&reserve3=");
|
s.append("&returnUrl=");
|
sbf.append(s.toString());
|
s.append("&paySecret=9e3b2f387b5b4232a9c782affc9c36ed");
|
|
String encode = null;
|
try {
|
encode = DigestUtils.md5DigestAsHex(s.toString().getBytes("UTF-8"));
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
sbf.append("&sign="+encode);
|
sbf.append("&signType=MD5");
|
System.out.println(sbf.toString());
|
String s1 = httpsRequest(ip + "/pay/inpay", "POST", sbf.toString());
|
System.out.println(s1);
|
if(s1.equals("error")){
|
return error("生成电子缴款码失败,请联系管理员");
|
}
|
JSONObject jsonObject = JSON.parseObject(s1);
|
String payCode = "";
|
if(jsonObject.get("payCode")==null){
|
String eInfo = jsonObject.get("errorInfo").toString();
|
if(eInfo.equals("此订单已过期")){
|
ticket.setCode(System.currentTimeMillis()+"");
|
String payCode2 = zhiFa2(ticket);
|
ticket.setPayCode(payCode2);
|
ticketService.save(ticket);
|
addOrderRecord2(ticket);
|
return success("生成执法电子缴款码","https://hbfs.govpay.ccb.com/online/fssm?fee=130000000001&PyfScnCgycd=01&pyfTpcd=3&BNo="+payCode);
|
}
|
return error(jsonObject.get("errorInfo").toString());
|
}
|
payCode = jsonObject.get("payCode").toString();
|
ticket.setPayCode(payCode);
|
ticketService.save(ticket);
|
|
addOrderRecord2(ticket);
|
return success("生成执法电子缴款码","https://hbfs.govpay.ccb.com/online/fssm?fee=130000000001&PyfScnCgycd=01&pyfTpcd=3&BNo="+payCode);
|
}
|
|
public String zhiFa2(Ticket ticket){
|
StringBuffer sbf = new StringBuffer();
|
StringBuffer s = new StringBuffer();
|
if(ticket.getMoney()==0){
|
s.append("amt=0.01");
|
}else{
|
DecimalFormat df = new DecimalFormat("#0.00");
|
s.append("amt="+df.format(ticket.getMoney()).toString());
|
}
|
s.append("¬ifyUrl="+systemConfigProperties.getIp()+"ffPay/result");
|
s.append("&payKey=df937eda27cb4a59a12347966678e232");
|
s.append("&payerName="+ticket.getCarNo());
|
s.append("&payerNum="+ticket.getCode());
|
s.append("&payerTypeCode=1304062100000001");
|
s.append("&reserve1=");
|
s.append("&reserve2=");
|
s.append("&reserve3=");
|
s.append("&returnUrl=");
|
sbf.append(s.toString());
|
s.append("&paySecret=9e3b2f387b5b4232a9c782affc9c36ed");
|
|
String encode = null;
|
try {
|
encode = DigestUtils.md5DigestAsHex(s.toString().getBytes("UTF-8"));
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
sbf.append("&sign="+encode);
|
sbf.append("&signType=MD5");
|
String s1 = httpsRequest(ip + "/pay/inpay", "POST", sbf.toString());
|
JSONObject jsonObject = JSON.parseObject(s1);
|
String payCode = jsonObject.get("payCode").toString();
|
return payCode;
|
}
|
|
|
//支付接口通知
|
@PostMapping("result")
|
public String result(HttpServletRequest request,String payKey,String payerTypeCode,String payerNum,String payCode,Double amt,String status,String errorInfo,String sign,String signType) throws Exception{
|
System.out.println(payCode+"-------"+status);
|
String s = "payCode===="+payCode+",\n";
|
try {
|
s += "开始走回调接口------>";
|
writeTxt(s);
|
updateOrderRecord(payCode,status);
|
}catch (Exception e){
|
s += "更新订单记录出异常------>";
|
writeTxt(s);
|
}
|
return "success";
|
}
|
|
//更新订单记录
|
public void updateOrderRecord(String payCode,String status){
|
String s = "更新订单记录:payCode===="+payCode+",status==="+status+",\n";
|
Specification<OrderRecord> specification = new Specification<OrderRecord>() {
|
@Override
|
public Predicate toPredicate(Root<OrderRecord> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
|
List<Predicate> list = new ArrayList<Predicate>();
|
list.add(cb.equal(root.get("payCode").as(String.class), payCode));
|
Predicate[] arr = new Predicate[list.size()];
|
cq.where(list.toArray(arr));
|
return null;
|
}
|
};
|
List<OrderRecord> all = orderRecordService.findAll(specification);
|
s += "查询到订单记录为:"+all.size()+"条,\n";
|
if(all.size()==1){
|
OrderRecord orderRecord = all.get(0);
|
s += "查询到订单为:"+orderRecord.getId()+",\n";
|
if(status.equals("01")){
|
orderRecord.setStatus(0);
|
}
|
if(status.equals("03")){
|
orderRecord.setStatus(1);
|
}
|
if(status.equals("04")||status.equals("05")||status.equals("06")){
|
orderRecord.setStatus(2);
|
}
|
orderRecordService.save(orderRecord);
|
if(orderRecord.getType()==0){
|
updateTicket(orderRecord.getQueryId(),status);
|
}else{
|
s += "修改出场表:"+orderRecord.getQueryId()+",status==="+status+",\n";
|
writeTxt(s);
|
updateOutPark(orderRecord.getQueryId(),status);
|
}
|
}
|
writeTxt(s);
|
}
|
|
//更新罚单的状态
|
public void updateTicket(Long ticketId,String status){
|
Ticket ticket = (Ticket) ticketService.findById(ticketId);
|
if(ticket!=null){
|
if(status.equals("01")){
|
ticket.setPayStatus(0);
|
}
|
if(status.equals("03")){
|
ticket.setPayStatus(1);
|
dealCar(ticket.getCarNo());
|
}
|
if(status.equals("04")||status.equals("05")||status.equals("06")){
|
ticket.setPayStatus(2);
|
}
|
ticketService.save(ticket);
|
}
|
}
|
|
//更新缴费状态
|
private void dealCar(String carNo){
|
Specification<Ticket> specification2 = new Specification<Ticket>() {
|
@Override
|
public Predicate toPredicate(Root<Ticket> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
|
List<Predicate> list = new ArrayList<Predicate>();
|
list.add(cb.equal(root.get("carNo").as(String.class), carNo));
|
list.add(cb.notEqual(root.get("payStatus"), 1));
|
Predicate[] arr = new Predicate[list.size()];
|
cq.where(list.toArray(arr));
|
return null;
|
}
|
};
|
List<Ticket> tickets = ticketService.findAll(specification2);
|
if(tickets.size()==0){
|
//更新缴费状态
|
Specification<TicketBlack> specification = new Specification<TicketBlack>() {
|
@Override
|
public Predicate toPredicate(Root<TicketBlack> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
|
List<Predicate> list = new ArrayList<Predicate>();
|
list.add(cb.equal(root.get("carNo").as(String.class), carNo));
|
Predicate[] arr = new Predicate[list.size()];
|
cq.where(list.toArray(arr));
|
return null;
|
}
|
};
|
List<TicketBlack> all = ticketBlackService.findAll(specification);
|
for(TicketBlack ticketBlack:all){
|
ticketBlack.setStatus(1);
|
ticketBlack.setBlackType(0);
|
ticketBlackService.save(ticketBlack);
|
}
|
}
|
}
|
//抬杆
|
// public void updateOutPark(Long outParkId,String status){
|
// OutPark outPark = (OutPark) outParkService.findById(outParkId);
|
// if(outPark!=null){
|
// if(status.equals("03")){
|
// outPark.setStatus(1);
|
// outParkService.save(outPark);
|
// Barrier b= (Barrier) barrierService.findById(outPark.getBarrierId());
|
// //调用抬杆接口 返回值:{"result":"true","msg":"操作完成"}
|
// String res = HttpUtil.get(systemConfigProperties.getIp3()+"?barrierCode="+b.getCode());
|
// JSONObject jsonObject = JSON.parseObject(res);
|
// if(jsonObject.get("result").equals("true")){
|
// System.out.println("抬杆成功");
|
//
|
// deleteEnterPark(outPark.getCarNo());
|
// }else{
|
// System.out.println("抬杆接口返回失败");
|
// }
|
// }
|
// }
|
// }
|
|
public void updateOutPark(Long outParkId,String status){
|
String s = "开始修改出场表-----》,\n";
|
s+= "outparkId==="+outParkId+",status==="+status+",\n";
|
writeTxt(s);
|
OutPark outPark = (OutPark) outParkService.findById(outParkId);
|
if(outPark!=null){
|
s += "找到出场数据:"+outPark.getId()+",\n";
|
writeTxt(s);
|
if(status.equals("03")){
|
s += "出场数据修改----》";
|
writeTxt(s);
|
outPark.setStatus(1);
|
outParkService.save(outPark);
|
}
|
}
|
s += "未找到出场数据-----》";
|
writeTxt(s);
|
}
|
|
//删除进停车场的数据
|
public void deleteEnterPark(String carNo){
|
Specification<EnterPark> specification = new Specification<EnterPark>() {
|
@Override
|
public Predicate toPredicate(Root<EnterPark> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
|
List<Predicate> list = new ArrayList<Predicate>();
|
list.add(cb.equal(root.get("carNo").as(String.class), carNo));
|
Predicate[] arr = new Predicate[list.size()];
|
cq.where(list.toArray(arr));
|
return null;
|
}
|
};
|
List<EnterPark> all = enterParkService.findAll(specification);
|
for(EnterPark ep:all){
|
enterParkService.delete(ep.getId());
|
}
|
}
|
|
//生成电子缴款码
|
@PostMapping("park")
|
public Object park(Long id){
|
String logs = "开始缴费流程------》";
|
logs += "出场id为:"+id+",\n";
|
OutPark outPark = (OutPark) outParkService.findById(id);
|
if(outPark.getPrice()==0){
|
updateOutPark(outPark.getId(),"03");
|
logs += "支付金额为0,\n";
|
writeTxt(logs);
|
return error("本次停车无需支付费用");
|
}
|
|
//判断是否在白名单
|
Specification<WhiteList> specification = new Specification<WhiteList>() {
|
@Override
|
public Predicate toPredicate(Root<WhiteList> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
|
List<Predicate> list = new ArrayList<Predicate>();
|
list.add(cb.equal(root.get("carNo").as(String.class), outPark.getCarNo()));
|
Predicate[] arr = new Predicate[list.size()];
|
cq.where(list.toArray(arr));
|
return null;
|
}
|
};
|
List<WhiteList> all = whiteListService.findAll(specification);
|
for(WhiteList w : all){
|
if(w.getType()==0){
|
logs+=outPark.getCarNo()+"在白名单,\n";
|
updateOutPark(outPark.getId(),"03");
|
writeTxt(logs);
|
return error("本次停车无需支付费用!");
|
}else{
|
if(w.getParkId()!=null){
|
if(w.getEndTime()!=null){
|
if(w.getParkId()==outPark.getParkId()&&new Date().getTime()<w.getEndTime().getTime()){
|
logs+=outPark.getCarNo()+"在特殊规则白名单,\n";
|
updateOutPark(outPark.getId(),"03");
|
writeTxt(logs);
|
return error("本次停车无需支付费用!");
|
}
|
}
|
}
|
}
|
}
|
|
StringBuffer sbf = new StringBuffer();
|
StringBuffer s = new StringBuffer();
|
DecimalFormat df = new DecimalFormat("#0.00");
|
s.append("amt="+df.format(outPark.getPrice()).toString());
|
s.append("¬ifyUrl="+systemConfigProperties.getIp()+"ffPay/result");//回调的url
|
s.append("&payKey=df937eda27cb4a59a12347966678e232");//财政给的
|
s.append("&payerName="+outPark.getCarNo());
|
s.append("&payerNum="+ outPark.getCode());//订单号
|
s.append("&payerTypeCode=1304062100000001");////财政给的
|
s.append("&reserve1=");
|
s.append("&reserve2=");
|
s.append("&reserve3=");
|
s.append("&returnUrl=");
|
sbf.append(s.toString());
|
s.append("&paySecret=9e3b2f387b5b4232a9c782affc9c36ed");////财政给的
|
|
String encode = null;
|
try {
|
encode = DigestUtils.md5DigestAsHex(s.toString().getBytes("UTF-8"));
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
sbf.append("&sign="+encode);
|
sbf.append("&signType=MD5");
|
String s1 = httpsRequest(ip+"/pay/inpay","POST",sbf.toString());
|
if(s1.equals("error")){
|
logs += "生成执法电子缴款码失败,请联系管理员,\n";
|
writeTxt(logs);
|
return error("生成执法电子缴款码失败,请联系管理员");
|
}
|
JSONObject jsonObject = JSON.parseObject(s1);
|
if(jsonObject.get("payCode")==null){
|
String eInfo = jsonObject.get("errorInfo").toString();
|
if(eInfo.equals("此订单已过期")){
|
outPark.setCode(System.currentTimeMillis()+"");
|
outParkService.save(outPark);
|
logs += "此订单已过期,\n";
|
writeTxt(logs);
|
return park(id);
|
}else{
|
logs += "此订单有异常错误,\n";
|
writeTxt(logs);
|
return error(eInfo);
|
}
|
}else{
|
String payCode = jsonObject.get("payCode").toString();
|
logs += "payCode: "+payCode+",\n";
|
outPark.setPayCode(payCode);
|
outParkService.save(outPark);
|
writeTxt(logs);
|
addOrderRecord(outPark);
|
return success("生成停车电子缴款码","https://hbfs.govpay.ccb.com/online/fssm?fee=130000000001&PyfScnCgycd=01&pyfTpcd=3&BNo="+payCode);
|
}
|
}
|
|
|
//插入停车订单记录
|
public void addOrderRecord(OutPark outPark){
|
Park park = (Park) parkService.findById(outPark.getParkId());
|
OrderRecord orderRecord = new OrderRecord();
|
orderRecord.setAddress(park.getName());
|
orderRecord.setCarNo(outPark.getCarNo());
|
orderRecord.setCode(outPark.getCode());
|
orderRecord.setMoney(outPark.getPrice());
|
orderRecord.setQueryId(outPark.getId());
|
orderRecord.setType(1);
|
orderRecord.setPayCode(outPark.getPayCode());
|
orderRecordService.save(orderRecord);
|
}
|
|
//插入执法订单记录
|
public void addOrderRecord2(Ticket ticket){
|
OrderRecord orderRecord = new OrderRecord();
|
orderRecord.setAddress(ticket.getAddress());
|
orderRecord.setCarNo(ticket.getCarNo());
|
orderRecord.setCode(ticket.getCode());
|
orderRecord.setMoney(ticket.getMoney());
|
orderRecord.setQueryId(ticket.getId());
|
orderRecord.setType(0);
|
orderRecord.setPayCode(ticket.getPayCode());
|
orderRecordService.save(orderRecord);
|
}
|
|
|
private void writeTxt( String txt)
|
{
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
try
|
{
|
FileWriter f = new FileWriter(systemConfigProperties.getLogPath()+"支付日志"+sdf.format(new Date())+".txt",true);
|
BufferedWriter bw=new BufferedWriter(f);
|
bw.write(txt);
|
bw.newLine();
|
bw.close();
|
}
|
catch(Exception e)
|
{
|
System.out.println("打印错误");
|
}
|
}
|
|
|
|
|
}
|