|
@ -0,0 +1,555 @@
|
|
|
package com.yihu.jw.care.service.pay;
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
import com.yihu.fastdfs.FastDFSUtil;
|
|
|
import com.yihu.jw.care.dao.doorCoach.BaseDoorCoachFeeDetailDao;
|
|
|
import com.yihu.jw.care.dao.doorCoach.BaseDoorCoachOrderDao;
|
|
|
import com.yihu.jw.care.dao.lifeCare.LifeCareFeeDetailDao;
|
|
|
import com.yihu.jw.care.dao.lifeCare.LifeCareOrderDao;
|
|
|
import com.yihu.jw.care.dao.pay.WxPayHttpLogDao;
|
|
|
import com.yihu.jw.care.service.doorCoach.PatientDoorCoachOrderService;
|
|
|
import com.yihu.jw.care.service.lifeCare.LifeCareOrderService;
|
|
|
import com.yihu.jw.care.util.WxpayUtil;
|
|
|
import com.yihu.jw.care.util.XMLUtil;
|
|
|
import com.yihu.jw.entity.base.patient.BasePatientDO;
|
|
|
import com.yihu.jw.entity.base.wx.WxWechatDO;
|
|
|
import com.yihu.jw.entity.care.common.WxPayHttpLogDO;
|
|
|
import com.yihu.jw.entity.care.doorCoach.BaseDoorCoachFeeDetailDO;
|
|
|
import com.yihu.jw.entity.care.doorCoach.BaseDoorCoachOrderDO;
|
|
|
import com.yihu.jw.entity.care.lifeCare.LifeCareFeeDetailDO;
|
|
|
import com.yihu.jw.entity.care.lifeCare.LifeCareOrderDO;
|
|
|
import com.yihu.jw.entity.order.BusinessOrderDO;
|
|
|
import com.yihu.jw.entity.order.BusinessOrderRefundDO;
|
|
|
import com.yihu.jw.order.BusinessOrderService;
|
|
|
import com.yihu.jw.order.dao.BusinessOrderDao;
|
|
|
import com.yihu.jw.order.dao.BusinessOrderRefundDao;
|
|
|
import com.yihu.jw.patient.dao.BasePatientDao;
|
|
|
import com.yihu.jw.restmodel.ResponseContant;
|
|
|
import com.yihu.jw.restmodel.web.ObjEnvelop;
|
|
|
import com.yihu.jw.util.common.IpUtil;
|
|
|
import com.yihu.jw.util.common.QrcodeUtil;
|
|
|
import com.yihu.jw.util.date.DateUtil;
|
|
|
import com.yihu.jw.utils.StringUtil;
|
|
|
import com.yihu.jw.wechat.dao.WechatDao;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.Assert;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.io.InputStream;
|
|
|
import java.util.*;
|
|
|
|
|
|
import static jxl.biff.FormatRecord.logger;
|
|
|
|
|
|
/**
|
|
|
* Created with IntelliJ IDEA.
|
|
|
* 支付
|
|
|
* @Author: yeshijie
|
|
|
* @Date: 2021/6/28
|
|
|
* @Description:
|
|
|
*/
|
|
|
@Service
|
|
|
public class PayService {
|
|
|
private Logger log = LoggerFactory.getLogger(PatientDoorCoachOrderService.class);
|
|
|
|
|
|
@Autowired
|
|
|
private BasePatientDao patientDao;
|
|
|
@Autowired
|
|
|
private BusinessOrderDao businessOrderDao;
|
|
|
@Value("${wechat.id}")
|
|
|
public String wechatId;
|
|
|
@Value("${wechat.appId}")
|
|
|
public String appId;
|
|
|
@Value("${wechat.mchId}")
|
|
|
public String mchId;
|
|
|
@Value("${wechat.apiKey}")
|
|
|
public String apiKey;
|
|
|
@Value("${wechat.wechat_base_url}")
|
|
|
private String serverUrl;
|
|
|
@Autowired
|
|
|
private WxPayHttpLogDao wxPayHttpLogDao;
|
|
|
@Autowired
|
|
|
private FastDFSUtil fastDFSUtil;
|
|
|
@Autowired
|
|
|
private BusinessOrderService businessOrderService;
|
|
|
@Autowired
|
|
|
private WechatDao wechatDao;
|
|
|
@Autowired
|
|
|
private BusinessOrderRefundDao orderRefundDao;
|
|
|
@Autowired
|
|
|
private LifeCareOrderService lifeCareOrderService;
|
|
|
@Autowired
|
|
|
private LifeCareOrderDao lifeCareOrderDao;
|
|
|
@Autowired
|
|
|
private PatientDoorCoachOrderService doorCoachOrderService;
|
|
|
@Autowired
|
|
|
private BaseDoorCoachOrderDao baseDoorCoachOrderDao;
|
|
|
@Value("${fastDFS.fastdfs_file_url}")
|
|
|
private String fastdfs_file_url;
|
|
|
@Autowired
|
|
|
private JdbcTemplate jdbcTemplate;
|
|
|
@Autowired
|
|
|
private LifeCareFeeDetailDao lifeCareFeeDetailDao;
|
|
|
@Autowired
|
|
|
private BaseDoorCoachFeeDetailDao doorCoachFeeDetailDao;
|
|
|
|
|
|
/**
|
|
|
* 顶部状态栏订单各分类总条数
|
|
|
* 0待支付、1已支付、2已取消、3申请退款中、4已售后
|
|
|
* @param patient
|
|
|
* @return
|
|
|
*/
|
|
|
public Map<String, Integer> topStatusBarNum(String patient) {
|
|
|
|
|
|
String sql = "SELECT a.`status`,COUNT(*) num from base_business_order_pay a where patient = '"+patient+"' " +
|
|
|
"GROUP BY a.`status` " ;
|
|
|
|
|
|
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
|
|
|
Map<String, Integer> map = new HashMap<>();
|
|
|
//状态 0待支付、1已支付、2已取消、3申请退款中、4已售后
|
|
|
map.put("0",0);
|
|
|
map.put("1",0);
|
|
|
map.put("2",0);
|
|
|
map.put("3",0);
|
|
|
map.put("4",0);
|
|
|
int total = 0;
|
|
|
if(list.size()>0){
|
|
|
for (Map<String, Object> one:list){
|
|
|
map.put(String.valueOf(one.get("status")), Integer.valueOf(String.valueOf(one.get("num"))));
|
|
|
total+=Integer.valueOf(String.valueOf(one.get("num")));
|
|
|
}
|
|
|
}
|
|
|
map.put("total", total);
|
|
|
return map;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 居民我的订单列表
|
|
|
* @param patient
|
|
|
* @param status
|
|
|
* @param page
|
|
|
* @param size
|
|
|
* @return
|
|
|
*/
|
|
|
public JSONObject orderList(String patient, String status, int page, int size) {
|
|
|
JSONObject result = new JSONObject();
|
|
|
int start = 0 == page ? page++ : (page - 1) * size;
|
|
|
int end = 0 == size ? 15 : size;
|
|
|
String filter = " where patient = '"+patient+"' ";
|
|
|
if(!StringUtil.isEmpty(status)){
|
|
|
filter += " and status = "+ status +" ";
|
|
|
}
|
|
|
|
|
|
String sql = "select a.id,a.patient,a.patient_name patientName,a.order_no orderNo,a.status, " +
|
|
|
"DATE_FORMAT(a.create_time,'%Y-%m-%d %H:%i:%s') createTime " +
|
|
|
",a.order_category orderCategory,a.relation_code relationCode,a.relation_name relationName " +
|
|
|
",a.pay_type payType,a.pay_price payPrice from base_business_order_pay a " + filter ;
|
|
|
sql += " ORDER BY a.create_time desc " +
|
|
|
" LIMIT {start},{end};";
|
|
|
String finalSql = sql.replace("{start}", String.valueOf(start))
|
|
|
.replace("{end}", String.valueOf(end));
|
|
|
|
|
|
String countSql = "SELECT count(a.id) FROM base_business_order_pay a" + filter ;
|
|
|
List<Map<String,Object>> sqlResultlist;
|
|
|
try {
|
|
|
sqlResultlist = jdbcTemplate.queryForList(finalSql);
|
|
|
} catch (Exception e) {
|
|
|
result.put(ResponseContant.resultFlag, ResponseContant.fail);
|
|
|
result.put(ResponseContant.resultMsg, "从数据库查询工单列表信息失败");
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
Long count;
|
|
|
try {
|
|
|
count = jdbcTemplate.queryForObject(countSql, Long.class);
|
|
|
} catch (Exception e) {
|
|
|
result.put(ResponseContant.resultFlag, ResponseContant.fail);
|
|
|
result.put(ResponseContant.resultMsg, "从数据库统计工单数量失败" );
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
result.put(ResponseContant.resultFlag, ResponseContant.success);
|
|
|
result.put(ResponseContant.resultMsg, sqlResultlist);
|
|
|
JSONObject countItem = new JSONObject();
|
|
|
countItem.put("count", count);
|
|
|
result.putAll(countItem);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 订单详情接口
|
|
|
* @param id
|
|
|
*/
|
|
|
public JSONObject orderInfo(Integer id){
|
|
|
JSONObject resJson = new JSONObject();
|
|
|
resJson.put("id",id);
|
|
|
BusinessOrderDO businessOrderDO = businessOrderDao.findOne(id);
|
|
|
String type = businessOrderDO.getOrderCategory();
|
|
|
resJson.put("orderCategory",type);
|
|
|
resJson.put("orderNo",businessOrderDO.getOrderNo());
|
|
|
resJson.put("payPrice",businessOrderDO.getPayPrice());
|
|
|
resJson.put("payTime", DateUtil.dateToStrLong(businessOrderDO.getPayTime()));
|
|
|
resJson.put("createTime",DateUtil.dateToStrLong(businessOrderDO.getCreateTime()));
|
|
|
resJson.put("status",businessOrderDO.getStatus());
|
|
|
resJson.put("updateTime",DateUtil.dateToStrLong(businessOrderDO.getUpdateTime()));
|
|
|
|
|
|
if("3".equals(type)){
|
|
|
List<BaseDoorCoachFeeDetailDO> feeDetailDOList = doorCoachFeeDetailDao.findByOrderId(businessOrderDO.getRelationCode());
|
|
|
resJson.put("fees",feeDetailDOList);
|
|
|
}else if("4".equals(type)){
|
|
|
List<LifeCareFeeDetailDO> feeDetailDOList = lifeCareFeeDetailDao.findByOrderId(businessOrderDO.getRelationCode());
|
|
|
resJson.put("fees",feeDetailDOList);
|
|
|
}
|
|
|
|
|
|
return resJson;
|
|
|
}
|
|
|
|
|
|
public void applyRefund(Integer id,String content,String imgs){
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 取消订单
|
|
|
* @param id
|
|
|
*/
|
|
|
public String cancleOrder(Integer id){
|
|
|
BusinessOrderDO businessOrderDO = businessOrderDao.findOne(id);
|
|
|
if(businessOrderDO.getStatus()==0){
|
|
|
String type = businessOrderDO.getOrderCategory();
|
|
|
String orderId = businessOrderDO.getRelationCode();
|
|
|
if("3".equals(type)){
|
|
|
BaseDoorCoachOrderDO orderDO = baseDoorCoachOrderDao.findOne(orderId);
|
|
|
if(orderDO.getStatus()==0){
|
|
|
orderDO.setStatus(-1);
|
|
|
baseDoorCoachOrderDao.save(orderDO);
|
|
|
}
|
|
|
}else if("4".equals(type)){
|
|
|
LifeCareOrderDO orderDO = lifeCareOrderDao.findOne(orderId);
|
|
|
if(orderDO.getStatus()==0){
|
|
|
orderDO.setStatus(-1);
|
|
|
lifeCareOrderDao.save(orderDO);
|
|
|
}
|
|
|
}
|
|
|
businessOrderDO.setUpdateTime(new Date());
|
|
|
businessOrderDao.save(businessOrderDO);
|
|
|
}else{
|
|
|
return "只有待支付的订单才能取消";
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 微信退款
|
|
|
* @param orderNo
|
|
|
* @param description
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public void orderRefund(String orderNo,String description) throws Exception {
|
|
|
WxWechatDO wxWechatDO = wechatDao.findById(wechatId);
|
|
|
if (wxWechatDO==null){
|
|
|
throw new Exception("this wechatId is null");
|
|
|
}
|
|
|
BusinessOrderDO businessOrderDO = businessOrderDao.selectByOrderNo(orderNo);
|
|
|
if (businessOrderDO==null){
|
|
|
throw new Exception("this orderId not exit");
|
|
|
}
|
|
|
BasePatientDO patientDO = patientDao.findById(businessOrderDO.getPatient());
|
|
|
if (patientDO==null){
|
|
|
throw new Exception("this patient not exit");
|
|
|
}
|
|
|
BusinessOrderRefundDO orderRefundDO = orderRefundDao.selectByOrderNo(orderNo);
|
|
|
if (orderRefundDO==null){
|
|
|
orderRefundDO = new BusinessOrderRefundDO();
|
|
|
}
|
|
|
|
|
|
orderRefundDO.setCreateTime(new Date());
|
|
|
orderRefundDO.setUpdateTime(new Date());
|
|
|
orderRefundDO.setStatus(1);
|
|
|
orderRefundDO.setOrderNo(orderNo);
|
|
|
orderRefundDO.setOrderPrice(businessOrderDO.getPayPrice());
|
|
|
orderRefundDO.setRefundPrice(businessOrderDO.getPayPrice());
|
|
|
orderRefundDO.setAppId(wxWechatDO.getAppId());
|
|
|
orderRefundDO.setMchId(wxWechatDO.getMchId());
|
|
|
orderRefundDO.setOutRefundNo("CARE"+businessOrderDO.getOrderType()+System.currentTimeMillis()+(int)(Math.random()*900)+100);
|
|
|
orderRefundDO.setPatient(businessOrderDO.getPatient());
|
|
|
orderRefundDO.setPatientName(patientDO.getName());
|
|
|
orderRefundDO.setRefundDesc(description);
|
|
|
orderRefundDO = orderRefundDao.save(orderRefundDO);
|
|
|
Integer orderPrice = orderRefundDO.getOrderPrice().intValue();
|
|
|
Integer refundPrice1 = orderRefundDO.getRefundPrice().intValue();
|
|
|
Map<String,Object> map = businessOrderService.refund(wechatId,orderRefundDO.getOrderNo(),orderRefundDO.getOutRefundNo(),orderPrice.toString(),refundPrice1.toString(),orderRefundDO.getRefundDesc());
|
|
|
logger.info("map"+map);
|
|
|
addHttpLog("1",businessOrderDO.getOrderNo(),null,map.toString());
|
|
|
if (map.get("return_code").toString().equalsIgnoreCase("SUCCESS")){
|
|
|
//退款申请提交成功
|
|
|
throw new Exception(map.get("return_msg").toString());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 添加支付日志
|
|
|
* @param type
|
|
|
* @param orderNo
|
|
|
* @param res
|
|
|
* @param req
|
|
|
*/
|
|
|
public void addHttpLog(String type,String orderNo,String res,String req){
|
|
|
WxPayHttpLogDO logDO = new WxPayHttpLogDO();
|
|
|
logDO.setType(type);
|
|
|
logDO.setOrderNo(orderNo);
|
|
|
logDO.setOrderReq(req);
|
|
|
logDO.setOrderRes(res);
|
|
|
wxPayHttpLogDao.save(logDO);
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 支付成功处理
|
|
|
* @return
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void payNotify(BusinessOrderDO orderDO) {
|
|
|
log.error("【支付通知】请求,payWater:{}", orderDO);
|
|
|
String type = orderDO.getOrderCategory();
|
|
|
//防止重复支付
|
|
|
if (orderDO.getStatus()!=0) {
|
|
|
return;
|
|
|
}
|
|
|
switch (type){
|
|
|
case "1":
|
|
|
//desc = "招生报名";
|
|
|
break;
|
|
|
case "2":
|
|
|
//desc = "课程报名";
|
|
|
break;
|
|
|
case "3":
|
|
|
//desc = "上门辅导";
|
|
|
doorCoachOrderService.payOrderAfter(orderDO.getRelationCode());
|
|
|
break;
|
|
|
case "4":
|
|
|
//desc = "生活照料服务";
|
|
|
lifeCareOrderService.payOrderAfter(orderDO.getRelationCode());
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
orderDO.setStatus(1);
|
|
|
orderDO.setPayType(1);
|
|
|
orderDO.setPayTime(new Date());
|
|
|
businessOrderDao.save(orderDO);
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 微信navite统一下单接口
|
|
|
*
|
|
|
* @return prepayId 微信预支付交易会话标识,该值有效期为2小时
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public ObjEnvelop wxNativePay(String relationId,Integer orderId,HttpServletRequest request) throws Exception {
|
|
|
BusinessOrderDO businessOrderDO;
|
|
|
if(StringUtil.isBlank(relationId)){
|
|
|
businessOrderDO = businessOrderDao.findOne(orderId);
|
|
|
}else{
|
|
|
businessOrderDO = businessOrderDao.selectByRelationCode(relationId);
|
|
|
}
|
|
|
Assert.notNull(businessOrderDO, "支付流水不存在");
|
|
|
if (businessOrderDO.getStatus()!=0) {
|
|
|
return ObjEnvelop.getError("待支付订单才能支付",-1);
|
|
|
}
|
|
|
businessOrderDO.setOrderNo(getOrderNo());
|
|
|
String noceStr = WxpayUtil.getNonceStr();
|
|
|
// 组装统一下单信息
|
|
|
SortedMap<String, String> reqMap = new TreeMap<>();
|
|
|
String title = businessOrderDO.getDescription();
|
|
|
reqMap.put("appid", appId);
|
|
|
reqMap.put("attach", title);
|
|
|
reqMap.put("body", title);
|
|
|
// 微信支付分配的商户号
|
|
|
reqMap.put("mch_id", mchId);
|
|
|
reqMap.put("nonce_str", noceStr);
|
|
|
// 此路径是微信服务器调用支付结果通知路径
|
|
|
reqMap.put("notify_url", serverUrl+"pay/open/wxPayNotify");
|
|
|
reqMap.put("out_trade_no", businessOrderDO.getOrderNo());
|
|
|
reqMap.put("spbill_create_ip", IpUtil.getIpAddr(request));
|
|
|
reqMap.put("product_id", businessOrderDO.getOrderNo());
|
|
|
// 订单总金额,单位为分
|
|
|
Double payAmountIntValue = businessOrderDO.getPayPrice() * 100;
|
|
|
reqMap.put("total_fee", String.valueOf(payAmountIntValue.intValue()));
|
|
|
reqMap.put("trade_type", "NATIVE");
|
|
|
// 创建第一次签名
|
|
|
log.error("第一次签名: " + reqMap.toString());
|
|
|
String sign = WxpayUtil.createSign(reqMap, apiKey);
|
|
|
log.error("【微信支付】签名:{}", sign);
|
|
|
reqMap.put("sign", sign);
|
|
|
// 调用微信统一下单返回的值
|
|
|
log.error("第二次签名: " + reqMap.toString());
|
|
|
String result = WxpayUtil.createUnifiedorder(reqMap);
|
|
|
log.error("【微信支付】统一下单响应:{}", result);
|
|
|
//调用统一接口返回的值转换为XML格式
|
|
|
Map<String, String> map = XMLUtil.doXMLParse(result);
|
|
|
|
|
|
addHttpLog("1",businessOrderDO.getOrderNo(),reqMap.toString(),result);
|
|
|
if ("SUCCESS".equals(map.get("return_code"))) {
|
|
|
String code_url = map.get("code_url");
|
|
|
//生成二维码
|
|
|
InputStream ipt = QrcodeUtil.createQrcode(code_url, 300, "png");
|
|
|
String fileUrl="";
|
|
|
try {
|
|
|
ObjectNode imgNode = fastDFSUtil.upload(ipt, "png", "wx_pay_qrcode" + System.currentTimeMillis());
|
|
|
JSONObject json = JSONObject.parseObject(imgNode.toString());
|
|
|
fileUrl = json.getString("fileId");
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
businessOrderDao.save(businessOrderDO);
|
|
|
return ObjEnvelop.getSuccess("下单成功",fastdfs_file_url+fileUrl);
|
|
|
} else {
|
|
|
return ObjEnvelop.getError(map.get("return_msg"),-1);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 微信统一下单接口
|
|
|
*
|
|
|
* @return prepayId 微信预支付交易会话标识,该值有效期为2小时
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public ObjEnvelop wxWapPay(String relationId,Integer orderId,HttpServletRequest request) throws Exception {
|
|
|
BusinessOrderDO businessOrderDO;
|
|
|
if(StringUtil.isBlank(relationId)){
|
|
|
businessOrderDO = businessOrderDao.findOne(orderId);
|
|
|
}else{
|
|
|
businessOrderDO = businessOrderDao.selectByRelationCode(relationId);
|
|
|
}
|
|
|
Assert.notNull(businessOrderDO, "支付流水不存在");
|
|
|
if (businessOrderDO.getStatus()!=0) {
|
|
|
return ObjEnvelop.getError("待支付订单才能支付",-1);
|
|
|
}
|
|
|
BasePatientDO patientDO = patientDao.findById(businessOrderDO.getPatient());
|
|
|
businessOrderDO.setOrderNo(getOrderNo());
|
|
|
|
|
|
String noceStr = WxpayUtil.getNonceStr();
|
|
|
// 组装统一下单信息
|
|
|
SortedMap<String, String> reqMap = new TreeMap<>();
|
|
|
String title = businessOrderDO.getDescription();
|
|
|
reqMap.put("appid", appId);
|
|
|
reqMap.put("attach", title);
|
|
|
reqMap.put("body", title);
|
|
|
// 微信支付分配的商户号
|
|
|
reqMap.put("mch_id", mchId);
|
|
|
reqMap.put("nonce_str", noceStr);
|
|
|
// 此路径是微信服务器调用支付结果通知路径
|
|
|
reqMap.put("notify_url", serverUrl+"pay/open/wxPayNotify");
|
|
|
reqMap.put("out_trade_no", businessOrderDO.getOrderNo());
|
|
|
reqMap.put("spbill_create_ip", IpUtil.getIpAddr(request));
|
|
|
reqMap.put("product_id", businessOrderDO.getOrderNo());
|
|
|
// 订单总金额,单位为分
|
|
|
Double payAmountIntValue = businessOrderDO.getPayPrice() * 100;
|
|
|
reqMap.put("total_fee", String.valueOf(payAmountIntValue.intValue()));
|
|
|
reqMap.put("trade_type", "JSAPI");
|
|
|
reqMap.put("openid", patientDO.getOpenid());
|
|
|
// 创建第一次签名
|
|
|
log.error("第一次签名: " + reqMap.toString());
|
|
|
String sign = WxpayUtil.createSign(reqMap, apiKey);
|
|
|
log.error("【微信支付】签名:{}", sign);
|
|
|
reqMap.put("sign", sign);
|
|
|
// 调用微信统一下单返回的值
|
|
|
log.error("第二次签名: " + reqMap.toString());
|
|
|
String result = WxpayUtil.createUnifiedorder(reqMap);
|
|
|
addHttpLog("1",businessOrderDO.getOrderNo(),reqMap.toString(),result);
|
|
|
log.error("【微信支付】统一下单响应:{}", result);
|
|
|
//调用统一接口返回的值转换为XML格式
|
|
|
Map<String, String> map = XMLUtil.doXMLParse(result);
|
|
|
if (!"SUCCESS".equals(map.get("return_code"))) {
|
|
|
return ObjEnvelop.getError(map.get("return_msg"),-1);
|
|
|
}
|
|
|
log.error("【微信支付】统一下单成功:" + map);
|
|
|
// 下单返回预支付交易会话标识
|
|
|
String prepayId = map.get("prepay_id");
|
|
|
// 返回app调起支付订单信息
|
|
|
TreeMap<String, String> payMap = new TreeMap<>();
|
|
|
payMap.put("appId", appId);
|
|
|
payMap.put("package", "prepay_id=" + prepayId);
|
|
|
payMap.put("signType", "MD5");
|
|
|
payMap.put("nonceStr", noceStr);
|
|
|
payMap.put("timeStamp", WxpayUtil.getTimeStamp());
|
|
|
// 二次签名
|
|
|
String paySign = WxpayUtil.createSign(payMap, apiKey);
|
|
|
payMap.put("paySign", paySign);
|
|
|
log.error("【微信支付】WAP支付订单信息:{}", payMap);
|
|
|
businessOrderDao.save(businessOrderDO);
|
|
|
return ObjEnvelop.getSuccess("下单成功",payMap);
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 提交支付订单
|
|
|
* 订单类型 1招生,2 课程,3 上门辅导托幼) 4 生活照料
|
|
|
* @return
|
|
|
*/
|
|
|
public BusinessOrderDO submitOrder(String patientId,String type,String relationCode,Double price){
|
|
|
BasePatientDO pateint = patientDao.findById(patientId);
|
|
|
BusinessOrderDO businessOrderDO = new BusinessOrderDO();
|
|
|
businessOrderDO.setPatient(pateint.getId());
|
|
|
//支付账号
|
|
|
businessOrderDO.setYkOrderId(pateint.getMobile());
|
|
|
businessOrderDO.setPatientName(pateint.getName());
|
|
|
|
|
|
businessOrderDO.setOrderType(1);
|
|
|
businessOrderDO.setOrderCategory(type);
|
|
|
String desc;
|
|
|
String relateName;
|
|
|
switch (type){
|
|
|
case "1":
|
|
|
desc = "招生报名费";
|
|
|
relateName = "招生报名";
|
|
|
break;
|
|
|
case "2":
|
|
|
desc = "课程报名费";
|
|
|
relateName = "课程报名";
|
|
|
break;
|
|
|
case "3":
|
|
|
desc = "上门辅导服务项目费";
|
|
|
relateName = "上门辅导";
|
|
|
break;
|
|
|
case "4":
|
|
|
desc = "生活照料服务项目费";
|
|
|
relateName = "生活照料";
|
|
|
break;
|
|
|
default:
|
|
|
desc = "服务费";
|
|
|
relateName = "服务";
|
|
|
break;
|
|
|
}
|
|
|
businessOrderDO.setDescription(desc);
|
|
|
businessOrderDO.setRelationCode(relationCode);
|
|
|
businessOrderDO.setRelationName(relateName);
|
|
|
businessOrderDO.setCreateTime(new Date());
|
|
|
businessOrderDO.setUpdateTime(new Date());
|
|
|
businessOrderDO.setStatus(0);
|
|
|
businessOrderDO.setOrderNo(getOrderNo());
|
|
|
businessOrderDO.setUploadStatus(0);
|
|
|
businessOrderDO.setPayType(1);
|
|
|
businessOrderDO.setPayPrice(Double.valueOf(price));
|
|
|
businessOrderService.save(businessOrderDO);
|
|
|
return businessOrderDO;
|
|
|
}
|
|
|
|
|
|
public String getOrderNo(){
|
|
|
return ""+System.currentTimeMillis()+(int)(Math.random()*900)+100;
|
|
|
}
|
|
|
}
|