微信支付超详细教程(附商城订单处理逻辑)

您所在的位置:网站首页 微信商城订单查询 微信支付超详细教程(附商城订单处理逻辑)

微信支付超详细教程(附商城订单处理逻辑)

2024-07-06 14:01| 来源: 网络整理| 查看: 265

1、项目目录结构 在这里插入图片描述 2、在pom.xml中引入相关依赖

com.github.wxpay wxpay-sdk 0.0.3 com.alibaba fastjson //httpclient相关依赖 org.apache.httpcomponents httpclient commons-io commons-io com.google.code.gson gson

3、PayInfoController

@RestController @RequestMapping("/mallservice/payInfo") @CrossOrigin(allowCredentials = "true", allowedHeaders = "*") @Slf4j public class PayInfoController { @Autowired private PayInfoService payInfoService; /*生成微信支付二维码接口*/ @GetMapping("/createPayCode/{orderId}") public R createPayCode(@PathVariable String orderId) { Map map = this.payInfoService.createPayCode(orderId); log.info("生成二维码" + map.toString()); return R.ok().data(map); } //检查订单状态 @GetMapping(value = "/queryPayStatus/{orderId}") public R queryPayStatus(@PathVariable String orderId) { Map map = this.payInfoService.queryPayStatus(orderId); if (map == null) { return R.error().message("支付出错"); } if (map.get("trade_state").equals("SUCCESS")) { log.info("检查订单状态" + map.get("trade_state")); //更新订单状态 //更改订单状态 payInfoService.updateOrderStatus(map); return R.ok().message("支付成功"); } //前端响应过滤器 25000被拦截 return R.ok().code(25000).message("支付中。。。。。"); } }

4、PayInfoServiceImpl

@Service @Slf4j public class PayInfoServiceImpl extends ServiceImpl implements PayInfoService { @Autowired private OrderService orderService; /*生成微信支付二维码*/ @Override public Map createPayCode(String orderId) { try { //根据订单id获取订单信息 QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("id", orderId); Order order = orderService.getOne(wrapper); Map m = new HashMap(); //1、设置支付参数 m.put("appid", "wx74862e954"); m.put("mch_id", "15591"); //商户号 m.put("nonce_str", WXPayUtil.generateNonceStr()); m.put("body", orderId); //....... m.put("out_trade_no", orderId); m.put("total_fee", order.getPaymentPrice().multiply(new BigDecimal("100")).longValue() + ""); m.put("spbill_create_ip", "127.0.0.1"); m.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify"); //回调地址 m.put("trade_type", "NATIVE"); //2、HTTPClient来根据URL访问第三方接口并且传递参数 HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder"); //client设置参数 client.setXmlParam(WXPayUtil.generateSignedXml(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb")); client.setHttps(true); //允许https请求 client.post(); //3、返回第三方的数据 String xml = client.getContent(); Map resultMap = WXPayUtil.xmlToMap(xml); //4、封装返回结果集 Map map = new HashMap(); map.put("out_trade_no", orderId); map.put("user_id", order.getUserId()); map.put("total_fee", order.getPaymentPrice()); map.put("result_code", resultMap.get("result_code")); //返回二维码操作状态码 map.put("code_url", resultMap.get("code_url")); //二维码地址 //微信支付二维码2小时过期,可采取2小时未支付取消订单 //redisTemplate.opsForValue().set(orderNo, map, 120, TimeUnit.MINUTES); return map; } catch (Exception e) { e.printStackTrace(); return new HashMap(); } } //查询订单状态 @Override public Map queryPayStatus(String orderId) { try { //1、封装参数 Map m = new HashMap(); m.put("appid", "wx74862e0dfc4"); m.put("mch_id", "150191"); m.put("out_trade_no", orderId); m.put("nonce_str", WXPayUtil.generateNonceStr()); //2、设置请求 HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery"); client.setXmlParam(WXPayUtil.generateSignedXml(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb")); client.setHttps(true); client.post(); //3、返回第三方的数据 String xml = client.getContent(); //4、转成Map并返回 Map resultMap = WXPayUtil.xmlToMap(xml); return resultMap; } catch (Exception e) { e.printStackTrace(); } return null; } /*支付成功向支付表中添加记录,同时更新订单表中的支付状态等信息*/ @Override public void updateOrderStatus(Map map) { log.info("修改订单状态" + "开始"); //获取订单id String orderId = map.get("out_trade_no"); //根据订单id查询订单信息 QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("id", orderId); Order order = orderService.getOne(wrapper); if (order.getStatus().intValue() == 1) return; order.setStatus(CONSTANT.ORDER_SATAUS.HAS_PAIED); order.setPaymentTime(new Date()); order.setPaymentType(1); orderService.updateById(order); //记录支付日志 PayInfo payInfo = new PayInfo(); payInfo.setOrderId(order.getId());//支付订单号 payInfo.setPlatformStatus(CONSTANT.PLATFORM_STATUS.TRADE_SUCCESS); payInfo.setPayPlatform(1);//支付类型 payInfo.setOrderId(order.getId()); payInfo.setUserId(map.get("user_id")); payInfo.setTransactionId(map.get("transaction_id")); // payLog.setAttr(JSONObject.toJSONString(map)); baseMapper.insert(payInfo);//插入到支付日志表 log.info("修改订单状态" + "完成"); } }

前端显示支付二维码: (1)引入生成二维码的js 在这里插入图片描述 (2)在HTML部分绑定一个id名为QRCode的div 在这里插入图片描述 (3)在js中请求生成二维码接口

/*测试生成微信支付二维码*/ getCode(){ CSU.http.get("/mallservice/payInfo/createPayCode/1492089528889").then(res => { this.payObj = res.data.data; new QRCode("QRCode", { text: this.payObj.code_url, width: 128, height: 128, colorDark : "#000000", colorLight : "#ffffff", correctLevel : QRCode.CorrectLevel.H }); }) }

(4)使用定时器定时查询订单状态 // 开启定时任务,查询付款状态

const taskId = setInterval(() => { CSU.http.get("/mallservice/payInfo/queryPayStatus/" + this.orderId) .then(res => { if(res.data.code == 20000){ // 付款成功 clearInterval(taskId); alert("支付成功") // 跳转到付款成功页 location.href = "/paysuccess.html?orderId=" + this.orderId; } else if(res.data.code != 25000){ //code=25000说明正在支付中 // 付款失败 clearInterval(taskId); alert("支付失败") // 跳转到付款成功页 location.href = "/payfail.html?orderId=" + this.orderId; } }) }, 3000); },

(5)完整js代码

var payVm = new Vue({ el: "#payApp", data: { CSU: CSU, orderId: "1492091083720", payObj: {} }, created() { // ly.verify().then(res=>{ // //已经登录 // this.orderId = ly.getUrlParam("orderId"); // this.shouldPay = ly.getUrlParam("shouldPay"); /*测试生成微信支付二维码*/ CSU.http.get("/mallservice/payInfo/createPayCode/1492091083720").then(res => { this.payObj = res.data.data; new QRCode("QRCode", { text: this.payObj.code_url, width: 128, height: 128, colorDark: "#000000", colorLight: "#ffffff", correctLevel: QRCode.CorrectLevel.H }); }); // 开启定时任务,查询付款状态 const taskId = setInterval(() => { CSU.http.get("/mallservice/payInfo/queryPayStatus/" + this.orderId) .then(res => { if(res.data.code == 20000){ // 付款成功 clearInterval(taskId); alert("支付成功") // 跳转到付款成功页 location.href = "/paysuccess.html?orderId=" + this.orderId; } else if(res.data.code != 25000){ //code=25000说明正在支付中 // 付款失败 clearInterval(taskId); alert("支付失败") // 跳转到付款成功页 location.href = "/payfail.html?orderId=" + this.orderId; } }) }, 3000); }, })

附订单处理业务流程:

1、OrderController

@RestController @RequestMapping("/mallservice/order") @CrossOrigin @Api("订单服务接口") public class OrderController { @Autowired private OrderService orderService; // @Autowired // private PayHelper payHelper; /** * 创建订单 * */ @PostMapping("/createOrder") @ApiOperation(value = "创建订单接口,返回订单编号", notes = "创建订单") public R createOrder(@RequestBody Order order, HttpSession session) { User user = (User)session.getAttribute(CONSTANT.LOGIN_USER); String id = this.orderService.createOrder(order,user); return R.ok().data("orderId",id).message("创建订单成功"); } /** * 根据订单编号查询订单 * */ @GetMapping("selectOrderById/{orderId}") @ApiOperation(value = "根据订单编号查询订单,返回订单对象", notes = "查询订单") public R selectOrderById(@PathVariable("orderId") String orderId) { Order order = this.orderService.queryById(orderId); if (order == null) { return R.error().message("订单号不存在"); } return R.ok().data("order",order); } /** * 分页查询当前用户订单 */ @GetMapping("list") @ApiOperation(value = "分页查询当前用户订单,并且可以根据订单状态过滤", notes = "分页查询当前用户订单") public R queryUserOrderList( @RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "limit", defaultValue = "5") Integer limit, @RequestParam(value = "status", required = false,defaultValue = "2") Integer status) { Map map = this.orderService.queryUserOrderList(page, limit, status); if(CollectionUtils.isEmpty(map)){ return R.error().message("查询用户订单失败"); } return R.ok().data("total",map.get("total")).data("orders",map.get("rows")); } /** * 更新订单状态 * * @param id * @param status * @return */ @PutMapping("/updateOrderStatus/{id}/{status}") @ApiOperation(value = "更新订单状态", notes = "更新订单状态") public R updateStatus(@PathVariable("id") Long id, @PathVariable("status") Integer status) { this.orderService.updateStatus(id, status); return R.ok(); } }

OrderServiceImpl

@Service public class OrderServiceImpl extends ServiceImpl implements OrderService { @Autowired private ShippingService shippingService; @Autowired private OrderItemService orderItemService; //创建订单 @Override public String createOrder(Order order, User user) { if(order == null){ throw new XmallException(20001,"创建订单失败"); } if(user == null){ throw new XmallException(20001,"用户未登录"); } //创建订单编号 String orderId = UUID.randomUUID().toString(); order.setId(orderId); order.setUserId(user.getId()); order.setStatus(CONSTANT.ORDER_SATAUS.NOT_PAY); //根据用户查询收货地址 QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("id",user.getId()); Shipping shipping = shippingService.getOne(wrapper); order.setShippingId(shipping.getId()); //设置支付类型 order.setPaymentType(CONSTANT.PAYMENT_TYPE.ONLINE); // //设置订单条目 // order.setOrderItems(); //插入订单表 int insert = baseMapper.insert(order); if(insert ==0 ){ throw new XmallException(20001,"创建订单失败"); } //order_item表中插入订单id(批量更新) order.getOrderItems().forEach(orderItem -> { orderItem.setOrderId(orderId); }); orderItemService.saveBatch(order.getOrderItems()); return orderId; } //根据订单编号查询订单 @Override public Order queryById(String id) { if(StringUtils.isBlank(id)){ throw new XmallException(20001,"订单号有误"); } Order order = baseMapper.selectById(id); QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("order_id",order.getId()); List orderItemList = orderItemService.list(wrapper); order.setOrderItems(orderItemList); return order; } //分页查询当前用户订单 @Override public Map queryUserOrderList(Integer page, Integer limit, Integer status) { Page pageInfo = new Page(page,limit); /*构造查询条件*/ QueryWrapper wrapper = new QueryWrapper(); if(status != 2){ wrapper.eq("status",status); }else { wrapper = null; } baseMapper.selectPage(pageInfo,wrapper); List records = pageInfo.getRecords(); long total = pageInfo.getTotal(); Map map = new HashMap(); map.put("total",total); map.put("rows",records); return map; } //更新订单状态 @Transactional public void updateStatus(Long id, Integer status) { Order order = baseMapper.selectById(id); order.setStatus(status); // 根据状态判断要修改的时间 switch (status) { case 20: order.setPaymentTime(new Date());// 付款 break; case 30: order.setSendTime(new Date());// 发货 break; case 40: order.setEndTime(new Date());// 确认收获,订单结束 break; case 50: order.setCloseTime(new Date());// 交易失败,订单关闭 break; } int count = baseMapper.updateById(order); if(count == 0 ){ throw new XmallException(20001,"更新订单状态失败"); } } } 欢迎关注公众号Java技术大本营,会不定期分享BAT面试资料等福利。

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3