乐优商城第二十天(下单及支付)

首先,我们认识了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");
        //调用微信支付的终端IPestore商城的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

















猜你喜欢

转载自blog.csdn.net/qpc672456416/article/details/80722372