微信支付
文章目录
- 1.支付接口分析
- 2. 开发创建订单接口
- 3. 开发根据订单id查询订单详情接口
- 4. 开发生成二维码接口
- 5. 开发查询订单支付状态接口
1.支付接口分析
引入依赖
<dependencies><dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency>
</dependencies>
创建订单相关表
2. 开发创建订单接口
1.编写订单controller
@RestController
@RequestMapping("/orderservice/order")
@CrossOrigin
public class TOrderController {@Autowiredprivate TOrderService orderService;//根据课程id和用户id创建订单,返回订单id@PostMapping("createOrder/{courseId}")public R save(@PathVariable String courseId, HttpServletRequest request) {String orderId = orderService.saveOrder(courseId, JwtUtils.getMemberIdByJwtToken(request));return R.ok().data("orderId", orderId);}
}
2.编写订单OrderServiceImpl
//创建订单实现类@Overridepublic String saveOrder(String courseId, String memberId) {//远程调用课程服务,根据课程id获取课程信息CourseInfoForm courseDto = eduClient.getCourseInfoDto(courseId);//远程调用用户服务,根据用户id获取用户信息UcenterMember ucenterMember = ucenterClient.getInfo(memberId);//创建订单Order order = new Order();order.setOrderNo(OrderNoUtil.getOrderNo());order.setCourseId(courseId);order.setCourseTitle(courseDto.getTitle());order.setCourseCover(courseDto.getCover());order.setTeacherName("test");order.setTotalFee(courseDto.getPrice());order.setMemberId(memberId);order.setMobile(ucenterMember.getMobile());order.setNickname(ucenterMember.getNickname());order.setStatus(0);order.setPayType(1);baseMapper.insert(order);return order.getOrderNo();}
3. 开发根据订单id查询订单详情接口
controller
@GetMapping("getOrder/{orderId}")public R get(@PathVariable String orderId) {QueryWrapper<Order> wrapper = new QueryWrapper<>();wrapper.eq("order_no", orderId);Order order = orderService.getOne(wrapper);return R.ok().data("item", order);}
4. 开发生成二维码接口
controller
/*** 生成二维码** @return*/@GetMapping("/createNative/{orderNo}")public R createNative(@PathVariable String orderNo) {Map map = payService.createNative(orderNo);return R.ok().data(map);}
service实现
@Overridepublic Map createNative(String orderNo) {try {//根据订单id获取订单信息QueryWrapper<Order> wrapper = new QueryWrapper<>();wrapper.eq("order_no",orderNo);Order order = orderService.getOne(wrapper);Map m = new HashMap();//1、设置支付参数m.put("appid", "填写关联的公众号appid");m.put("mch_id", "商户号");m.put("nonce_str", WXPayUtil.generateNonceStr());m.put("body", order.getCourseTitle());m.put("out_trade_no", orderNo);m.put("total_fee", order.getTotalFee().multiply(new BigDecimal("100")).longValue()+"");m.put("spbill_create_ip", "127.0.0.1");m.put("notify_url", "回调地址");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, "商户key"));client.setHttps(true);client.post();//3、返回第三方的数据String xml = client.getContent();Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);//4、封装返回结果集Map map = new HashMap<>();map.put("out_trade_no", orderNo);map.put("course_id", order.getCourseId());map.put("total_fee", order.getTotalFee());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<>();}}
5. 开发查询订单支付状态接口
@GetMapping("/queryPayStatus/{orderNo}")public R queryPayStatus(@PathVariable String orderNo) {//调用查询接口Map<String, String> map = payService.queryPayStatus(orderNo);if (map == null) {//出错return R.error().message("支付出错");}if (map.get("trade_state").equals("SUCCESS")) {//如果成功//更改订单状态//payService.updateOrderStatus(map);return R.ok().message("支付成功");}return R.ok().code(25000).message("支付中");}
service实现
@Overridepublic Map queryPayStatus(String orderNo) {try {//1、封装参数Map m = new HashMap<>();m.put("appid", "填写关联的公众号appid");m.put("mch_id", "商户号");m.put("out_trade_no", orderNo);m.put("nonce_str", WXPayUtil.generateNonceStr());//2、设置请求HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");client.setXmlParam(WXPayUtil.generateSignedXml(m, "商户key"));client.setHttps(true);client.post();//3、返回第三方的数据String xml = client.getContent();Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);//6、转成Map//7、返回return resultMap;} catch (Exception e) {e.printStackTrace();}return null;}