苍穹外卖-微信支付

苍穹外卖-微信支付

微信支付接入指引 - 微信支付商户平台 (qq.com)

实现微信支付的流程,我们在这里选择JSAPI

微信支付.JPG

JSAPI下单 - JSAPI支付 | 微信支付商户文档中心 (qq.com)

需要准备微信支付平台证书和商户私钥文件,因为微信需要请求回调接口,所以就算是测试阶段,我们的项目也需要暴露在公网上,这里可以使用内网穿透解决

但我们没有以上的条件,所以这个微信支付无法真实的实现

/**
 * 用户支付
 *  TODO: 正常情况下,在这里应该调用微信支付的正常流程完成微信支付,但我们没有商户号,所以当点击支付按钮之后直接更改数据库的支付状态为已支付
 *  TODO: 所以,我们并没有调用weChatPayUtil工具类和PayNotifyController的回调业务接口
 *  TODO: 也没有用到WeChatProperties配置属性类和有关的配置文件
 *
 * @param ordersPaymentDTO
 * @return
 */
@Override
public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) {
    // 当前登录用户id
    Long userId = BaseContext.getCurrentId();
    User user = userMapper.getById(userId);

    //调用微信支付接口,生成预支付交易单
//    JSONObject jsonObject = weChatPayUtil.pay(
//            ordersPaymentDTO.getOrderNumber(), //商户订单号
//            new BigDecimal(0.01), //支付金额,单位 元
//            "苍穹外卖订单", //商品描述
//            user.getOpenid() //微信用户的openid
//    );
//
//        if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {
//        throw new OrderBusinessException("该订单已支付");
//    }
//
//    OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
//        vo.setPackageStr(jsonObject.getString("package"));
//
//        return vo;
    paySuccess(ordersPaymentDTO.getOrderNumber()); // 直接修改订单状态为支付成功

    return new OrderPaymentVO();
}


/**
 * 支付成功,修改订单状态
 *
 * @param outTradeNo
 */
public void paySuccess(String outTradeNo) {

    // 根据订单号查询订单
    Orders ordersDB = orderMapper.getByNumber(outTradeNo);

    // 根据订单id更新订单的状态、支付方式、支付状态、结账时间
    Orders orders = Orders.builder()
            .id(ordersDB.getId())
            .status(Orders.TO_BE_CONFIRMED)
            .payStatus(Orders.PAID)
            .checkoutTime(LocalDateTime.now())
            .build();

    orderMapper.update(orders);
}