提交 05bf01b9 作者: xiaowang

优化下单及支付

上级 5aac862f
...@@ -7,4 +7,5 @@ package com.mmc.payment.constant; ...@@ -7,4 +7,5 @@ package com.mmc.payment.constant;
*/ */
public interface WechatConstant { public interface WechatConstant {
String privateKeyPath = "src/main/resources/apiclient_key.pem"; String privateKeyPath = "src/main/resources/apiclient_key.pem";
Integer ORDER_PAY_SUCCESS_STATUS_CODE = 200;
} }
package com.mmc.payment.dao; package com.mmc.payment.dao;
import com.mmc.payment.entity.order.WxPrepayLogDO; import com.mmc.payment.entity.order.WxPayLogDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
...@@ -10,5 +10,9 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -10,5 +10,9 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface WechatPayDao { public interface WechatPayDao {
void insertWxPrepayLog(WxPrepayLogDO wxPrepayLogDO); void insertWxPayLog(WxPayLogDO wxPayLogDO);
WxPayLogDO selectWxPayInfoByOrderNo(String orderNo);
void updateWxPayLog(WxPayLogDO wxPayLogDO);
} }
...@@ -14,7 +14,7 @@ import java.util.Date; ...@@ -14,7 +14,7 @@ import java.util.Date;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class WxPrepayLogDO { public class WxPayLogDO {
private Integer id; private Integer id;
private Integer orderPort; private Integer orderPort;
private String orderNo; private String orderNo;
...@@ -22,8 +22,18 @@ public class WxPrepayLogDO { ...@@ -22,8 +22,18 @@ public class WxPrepayLogDO {
private String openId; private String openId;
private String description; private String description;
private String prepayId; private String prepayId;
private Integer orderStatus;
private Integer userAccountId; private Integer userAccountId;
private String outTradeNo;
private String transactionId;
private String bankType;
private String attach;
private String successTime;
private String wxNotifyOpenid;
private Integer wxNotifyTotal;
private Integer wxNotifyPayerTotal;
private String tradeType;
private String tradeState;
private String tradeStateDesc;
private Date createTime; private Date createTime;
private Date updateTime; private Date updateTime;
} }
package com.mmc.payment.enums;
/**
* @author 作者 geDuo
* @version 创建时间:2021年10月14日 下午4:08:18
* @explain 0下单初始化->100待分配运营->200需求确认->300订单确认->400待支付->500调度中->600作业中->700验收通过->900订单关闭
*/
/**
* 0下单成功-> 100(待分配运营)已分配运营-> 200(待需求确认)已经需求确认-> 300(待确认订单)已确认订单->
* 400(待预支付)已预支付-> 500(调度中)调度完成-> 600(作业中)作业完成-> 700(待验收结算)验收通过-> 900订单关闭
*
* @author geDuo
*/
public enum OrderPayStatus {
WAIT("WAIT", "待支付"),
SUCCESS("SUCCESS", "支付成功"),
REFUND("REFUND", "转入退款"),
NOTPAY("NOTPAY", "未支付"),
CLOSED("CLOSED", "已关闭"),
REVOKED("REVOKED", "已撤销(付款码支付)"),
USERPAYING("USERPAYING", "用户支付中(付款码支付)"),
PAYERROR("PAYERROR", "支付失败(其他原因,如银行返回失败)");
private String status;
private String doing;
OrderPayStatus(String status, String doing) {
this.status = status;
this.doing = doing;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDoing() {
return doing;
}
public void setDoing(String doing) {
this.doing = doing;
}
}
package com.mmc.payment.service.Impl; package com.mmc.payment.service.Impl;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import com.mmc.payment.common.result.ResultBody;
import com.mmc.payment.constant.UserSystemConstant; import com.mmc.payment.constant.UserSystemConstant;
import com.mmc.payment.dao.WechatPayDao; import com.mmc.payment.dao.WechatPayDao;
import com.mmc.payment.entity.order.WxPrepayLogDO; import com.mmc.payment.entity.order.WxPayLogDO;
import com.mmc.payment.enums.OrderPayStatus;
import com.mmc.payment.feign.UserAppApi; import com.mmc.payment.feign.UserAppApi;
import com.mmc.payment.model.dto.user.UserAccountSimpleDTO; import com.mmc.payment.model.dto.user.UserAccountSimpleDTO;
import com.mmc.payment.model.vo.order.OrderRequestParamsVO; import com.mmc.payment.model.vo.order.OrderRequestParamsVO;
...@@ -48,11 +50,18 @@ public class WechatPayServiceImpl implements WechatPayService { ...@@ -48,11 +50,18 @@ public class WechatPayServiceImpl implements WechatPayService {
WxConfigUtils wxConfigUtils; WxConfigUtils wxConfigUtils;
@Override @Override
public Map orderPay(OrderRequestParamsVO orderRequestParamsVO, Integer userAccountId, HttpServletRequest request) throws IOException { public ResultBody orderPay(OrderRequestParamsVO orderRequestParamsVO, Integer userAccountId, HttpServletRequest request) throws IOException {
UserAccountSimpleDTO userSimpleInfo = userAppApi.feignGetUserSimpleInfo(userAccountId, request.getHeader("token")); UserAccountSimpleDTO userSimpleInfo = userAppApi.feignGetUserSimpleInfo(userAccountId, request.getHeader("token"));
if (userSimpleInfo == null) { if (userSimpleInfo == null) {
throw new RuntimeException("服务器内部错误!"); throw new RuntimeException("服务器内部错误!");
} }
// 查询该订单是否已下单
WxPayLogDO wxPayLogDO = wechatPayDao.selectWxPayInfoByOrderNo(orderRequestParamsVO.getOrderNo());
if (wxPayLogDO != null && wxPayLogDO.getTradeState().equals(OrderPayStatus.SUCCESS.getStatus())) {
return ResultBody.error("订单已支付!");
} else if (wxPayLogDO != null) {
return ResultBody.error("请勿重复下单!");
}
Config config = wxConfigUtils.createConfig(); Config config = wxConfigUtils.createConfig();
// 构建service // 构建service
JsapiService jsapiService = new JsapiService.Builder().config(config).build(); JsapiService jsapiService = new JsapiService.Builder().config(config).build();
...@@ -62,8 +71,8 @@ public class WechatPayServiceImpl implements WechatPayService { ...@@ -62,8 +71,8 @@ public class WechatPayServiceImpl implements WechatPayService {
amount.setTotal(orderRequestParamsVO.getAmount()); amount.setTotal(orderRequestParamsVO.getAmount());
prepayRequest.setAmount(amount); prepayRequest.setAmount(amount);
Payer payer = new Payer(); Payer payer = new Payer();
prepayRequest.setPayer(payer);
payer.setOpenid(userSimpleInfo.getOpenid()); payer.setOpenid(userSimpleInfo.getOpenid());
prepayRequest.setPayer(payer);
prepayRequest.setAppid(userSystemConstant.getWxAppId()); prepayRequest.setAppid(userSystemConstant.getWxAppId());
prepayRequest.setMchid(userSystemConstant.getMchid()); prepayRequest.setMchid(userSystemConstant.getMchid());
prepayRequest.setDescription(orderRequestParamsVO.getDescription()); prepayRequest.setDescription(orderRequestParamsVO.getDescription());
...@@ -72,7 +81,8 @@ public class WechatPayServiceImpl implements WechatPayService { ...@@ -72,7 +81,8 @@ public class WechatPayServiceImpl implements WechatPayService {
// 调用下单方法,得到应答 // 调用下单方法,得到应答
PrepayResponse prepay = jsapiService.prepay(prepayRequest); PrepayResponse prepay = jsapiService.prepay(prepayRequest);
String prepayId = prepay.getPrepayId(); String prepayId = prepay.getPrepayId();
WxPrepayLogDO wxPrepayLogDO = new WxPrepayLogDO(); // 录入数据库记录数据
WxPayLogDO wxPrepayLogDO = new WxPayLogDO();
wxPrepayLogDO.setOrderPort(orderRequestParamsVO.getOrderPort()); wxPrepayLogDO.setOrderPort(orderRequestParamsVO.getOrderPort());
wxPrepayLogDO.setOrderNo(orderRequestParamsVO.getOrderNo()); wxPrepayLogDO.setOrderNo(orderRequestParamsVO.getOrderNo());
wxPrepayLogDO.setDescription(orderRequestParamsVO.getDescription()); wxPrepayLogDO.setDescription(orderRequestParamsVO.getDescription());
...@@ -80,8 +90,9 @@ public class WechatPayServiceImpl implements WechatPayService { ...@@ -80,8 +90,9 @@ public class WechatPayServiceImpl implements WechatPayService {
wxPrepayLogDO.setAmount(orderRequestParamsVO.getAmount()); wxPrepayLogDO.setAmount(orderRequestParamsVO.getAmount());
wxPrepayLogDO.setPrepayId(prepayId); wxPrepayLogDO.setPrepayId(prepayId);
wxPrepayLogDO.setOpenId(userSimpleInfo.getOpenid()); wxPrepayLogDO.setOpenId(userSimpleInfo.getOpenid());
wxPrepayLogDO.setTradeState(OrderPayStatus.WAIT.getStatus());
// 往数据库插入下单的日志信息 // 往数据库插入下单的日志信息
wechatPayDao.insertWxPrepayLog(wxPrepayLogDO); wechatPayDao.insertWxPayLog(wxPrepayLogDO);
// 获取时间戳 // 获取时间戳
String timeStamp = System.currentTimeMillis() / 1000 + ""; String timeStamp = System.currentTimeMillis() / 1000 + "";
// 获取随机字符串 // 获取随机字符串
...@@ -104,7 +115,7 @@ public class WechatPayServiceImpl implements WechatPayService { ...@@ -104,7 +115,7 @@ public class WechatPayServiceImpl implements WechatPayService {
map.put("package", prepayPackage); map.put("package", prepayPackage);
map.put("signType", signType); map.put("signType", signType);
map.put("paySign", sign); map.put("paySign", sign);
return map; return ResultBody.success(map);
} }
@Override @Override
...@@ -143,6 +154,19 @@ public class WechatPayServiceImpl implements WechatPayService { ...@@ -143,6 +154,19 @@ public class WechatPayServiceImpl implements WechatPayService {
// 以支付通知回调为例,验签、解密并转换成 Transaction // 以支付通知回调为例,验签、解密并转换成 Transaction
Transaction transaction = parser.parse(requestParam, Transaction.class); Transaction transaction = parser.parse(requestParam, Transaction.class);
log.info("解密resource数据:{}", transaction); log.info("解密resource数据:{}", transaction);
WxPayLogDO wxPayLogDO = new WxPayLogDO();
wxPayLogDO.setOutTradeNo(transaction.getOutTradeNo());
wxPayLogDO.setTransactionId(transaction.getTransactionId());
wxPayLogDO.setBankType(transaction.getBankType());
wxPayLogDO.setAttach(transaction.getAttach());
wxPayLogDO.setSuccessTime(transaction.getSuccessTime());
wxPayLogDO.setWxNotifyOpenid(transaction.getPayer().getSpOpenid());
wxPayLogDO.setWxNotifyTotal(transaction.getAmount().getTotal());
wxPayLogDO.setWxNotifyPayerTotal(transaction.getAmount().getPayerTotal());
wxPayLogDO.setTradeType(transaction.getTradeType().toString());
wxPayLogDO.setTradeState(transaction.getTradeState().toString());
wxPayLogDO.setTradeStateDesc(transaction.getTradeStateDesc());
wechatPayDao.updateWxPayLog(wxPayLogDO);
result.put("code", "SUCCESS"); result.put("code", "SUCCESS");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
......
package com.mmc.payment.service; package com.mmc.payment.service;
import com.mmc.payment.common.result.ResultBody;
import com.mmc.payment.model.vo.order.OrderRequestParamsVO; import com.mmc.payment.model.vo.order.OrderRequestParamsVO;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -12,7 +13,7 @@ import java.util.Map; ...@@ -12,7 +13,7 @@ import java.util.Map;
* 概要: * 概要:
*/ */
public interface WechatPayService { public interface WechatPayService {
Map orderPay(OrderRequestParamsVO orderRequestParamsVO, Integer userAccountId, HttpServletRequest request) throws IOException; ResultBody orderPay(OrderRequestParamsVO orderRequestParamsVO, Integer userAccountId, HttpServletRequest request) throws IOException;
Map payCallback(HttpServletRequest request); Map payCallback(HttpServletRequest request);
} }
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.payment.dao.WechatPayDao"> <mapper namespace="com.mmc.payment.dao.WechatPayDao">
<insert id="insertWxPrepayLog"> <insert id="insertWxPayLog">
insert into wx_pay_log (order_port, insert into wx_pay_log (order_port,
order_no, order_no,
amount, amount,
...@@ -16,4 +16,42 @@ ...@@ -16,4 +16,42 @@
values (#{orderPort}, #{orderNo}, #{amount}, #{description}, values (#{orderPort}, #{orderNo}, #{amount}, #{description},
#{orderStatus}, #{userAccountId}, #{prepayId}, #{openId}) #{orderStatus}, #{userAccountId}, #{prepayId}, #{openId})
</insert> </insert>
<update id="updateWxPayLog">
update wx_pay_log
set out_trade_no = #{outTradeNo},
transaction_id = #{transactionId},
bank_type = #{bankType},
attach = #{attach},
success_time = #{successTime},
wx_notify_openid = #{wxNotifyOpenid},
wx_notify_total = #{wxNotifyTotal},
wx_notify_payer_total = #{wxNotifyPayerTotal},
trade_type = #{tradeType},
trade_state = #{tradeState},
trade_state_desc = #{tradeStateDesc}
where order_no = #{outTradeNo}
</update>
<select id="selectWxPayInfoByOrderNo" resultType="com.mmc.payment.entity.order.WxPayLogDO">
SELECT id,
order_port,
order_no,
amount,
open_id,
description,
prepay_id,
user_account_id,
out_trade_no,
transaction_id,
bank_type,
attach,
success_time,
wx_notify_openid,
wx_notify_total,
wx_notify_payer_total,
trade_type,
trade_state,
trade_state_desc,
create_time,
update_time where order_no = #{orderNo}
</select>
</mapper> </mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论