首先,我们认识了openApi接口规范,为了解决接口不统一的问题
然后学习了swagger实现了openApi的工具集
java中的使用
首先引入依赖
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.8.0</version> </dependency>
使用
首先要配置
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .host("localhost:8089") .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.leyou.order.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("乐优商城订单系统") .description("乐优商城订单系统接口文档") .version("1.0") .build(); } }
第一个注释@Api,修饰类,描述controller的作用
@Api("订单服务接口") public class OrderController {
第二个注释,@ApiOperation描述一个类的一个方法 ,@ApiImplicitparm描述单个参数
/** * 创建订单 * * @param order 订单对象 * @return 订单编号 */ @PostMapping @ApiOperation(value = "创建订单接口,返回订单编号", notes = "创建订单") @ApiImplicitParam(name = "order", required = true, value = "订单的json对象,包含订单条目和物流信息") public ResponseEntity<Long> createOrder(@RequestBody @Valid Order order) { Long id = this.orderService.createOrder(order); return new ResponseEntity<>(id, HttpStatus.CREATED); }
描述多个参数
@ApiImplicitParams({ @ApiImplicitParam(name = "page", value = "当前页", defaultValue = "1", type = "Integer"), @ApiImplicitParam(name = "rows", value = "每页大小", defaultValue = "5", type = "Integer"), @ApiImplicitParam(name = "status", value = "订单状态:1未付款,2已付款未发货,3已发货未确认,4已确认未评价,5交易关闭,6交易成功,已评价", type = "Integer"), })
描述返回信息
@ApiResponses({ @ApiResponse(code = 200, message = "订单的分页结果"), @ApiResponse(code = 404, message = "没有查询到结果"), @ApiResponse(code = 500, message = "查询失败"), })
以上就是丝袜哥的使用
那么微信支付的接口是怎么写的呢?
我们首先看看微信支付提供了哪些接口?
1.根据订单号和金额生成连接的方法
public String createPayUrl(Long orderId) { String key = "ly.pay.url." + orderId; try { String url = this.redisTemplate.opsForValue().get(key); if (StringUtils.isNotBlank(url)) { return url; } } catch (Exception e) { logger.error("查询缓存付款链接异常,订单编号:{}", orderId, e); } try { Map<String, String> data = new HashMap<>(); // 商品描述 data.put("body", "乐优商城测试"); // 订单号 data.put("out_trade_no", orderId.toString()); //货币 data.put("fee_type", "CNY"); //金额,单位是分 data.put("total_fee", "1"); //调用微信支付的终端IP(estore商城的IP) data.put("spbill_create_ip", "127.0.0.1"); //回调地址 data.put("notify_url", "http://test.leyou.com/wxpay/notify"); // 交易类型为扫码支付 data.put("trade_type", "NATIVE"); //商品id,使用假数据 data.put("product_id", "1234567"); Map<String, String> result = this.wxPay.unifiedOrder(data); if ("SUCCESS".equals(result.get("return_code"))) { String url = result.get("code_url"); // 将付款地址缓存,时间为10分钟 try { this.redisTemplate.opsForValue().set(key, url, 10, TimeUnit.MINUTES); } catch (Exception e) { logger.error("缓存付款链接异常,订单编号:{}", orderId, e); } return url; } else { logger.error("创建预交易订单失败,错误信息:{}", result.get("return_msg")); return null; } } catch (Exception e) { logger.error("创建预交易订单异常", e); return null; } }
2.查询订单状态
第一个,根据订单号和金额生成连接的方法,我们第一次生成连接交给前台,同时保存在redis中,当用户提交相同的链接时,我们并不会重新生成连接,而是会在redis中取出连接。
第二个查询订单状态,我们是通过轮询来查询订单的
/** * 查询订单状态 * * @param orderId * @return */ public PayState queryOrder(Long orderId) { Map<String, String> data = new HashMap<>(); // 订单号 data.put("out_trade_no", orderId.toString()); try { Map<String, String> result = this.wxPay.orderQuery(data); if (result == null) { // 未查询到结果,认为是未付款 return PayState.NOT_PAY; } String state = result.get("trade_state"); if ("SUCCESS".equals(state)) { // success,则认为付款成功 // 修改订单状态 this.orderService.updateStatus(orderId, 2); return PayState.SUCCESS; } else if (StringUtils.equals("USERPAYING", state) || StringUtils.equals("NOTPAY", state)) { // 未付款或正在付款,都认为是未付款 return PayState.NOT_PAY; } else { // 其它状态认为是付款失败 return PayState.FAIL; } } catch (Exception e) { logger.error("查询订单状态异常", e); return PayState.NOT_PAY; } } }
这就是我们的支付系统
接下来就是生成订单
我们的订单采用 twitter的雪花算法生成
雪花算法会生成一个64位的二进制数,是由时间,工作机器,最后12位的序列号组成,每秒产生26万个id