一、前言
从零玩转系列之微信支付实战PC端支付微信取消接口搭建 | 技术创作特训营第一期
halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端)
在此之前已经更新了微信支付开篇、微信支付安全、微信实战基础框架搭建、本次更新为微信支付实战PC端接口搭建,实战篇分为几个章节因为代码量确实有点多哈.
- 第一章从零玩转系列之微信支付开篇
- 第二章从零玩转系列之微信支付安全
- 第三章从零玩转系列之微信支付实战基础框架搭建
- 第四章从零玩转系列之微信支付实战PC端支付下单接口搭建
- 第五章从零玩转系列之微信支付实战PC端支付微信回调接口搭建
- 第五章从零玩转系列之微信支付实战PC端支付微信取消订单接口搭建
- 第六章从零玩转系列之微信支付实战PC端支付微信退款订单接口搭建
本次项目使用技术栈
后端: SpringBoot3.1.x、Mysql8.0、MybatisPlus
前端: Vue3、Vite、ElementPlus
小程序: Uniapp、Uview
一、取消订单接口
场景
- 用户下单完毕后未支付 可进行取消订单
- 订单超时支付系统自动取消订单
修改 WechatNativeController
/**
* 用户取消订单
*/
@PostMapping("/cancel/{orderNo}")
public R<String> cancel(@PathVariable String orderNo) {
log.info("取消订单");
wxPayService.cancelOrder(orderNo);
return R.ok("订单已取消");
}
修改 wxPayService
/**
* 关闭订单
*/
@SneakyThrows
public void cancelOrder(String orderNo) {
// ...../
}
逻辑分析
在工作中我们逻辑可能是这样子的
step 1 查询该订单状态是否需要关闭订单,如果订单已经关闭则不需要再次关闭
思考: 我们应该去哪里查询订单的状态?
假如我们去数据库查询记录的话,如果数据库因为什么原因导致状态可能不对呢?
所以我们直接去微信服务器查最新的直接更新关闭状态到数据库当中
你看微信也要我们这样子玩那就万无一失直接干
================================================================
好既然我们要去调用微信查询接口我们是不是可以封装一个通用的 后续肯定有其他地方也会调用查询支付信息的情况
文档(商户): https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_2.shtml
有两种查询方式第二种方便就这么简单
代码很好理解传递商户订单号和直连商户号mchid
/**
* 抽出公共获取微信订单信息
*/
private WeChartOrderInfo selectOrderInfo(String orderNo) throws IOException {
log.info("查询订单,直连商户号:{} , 微信支付订单号: {}", orderNo, wxPayConfig.getMchId());
String url = wxPayConfig.getDomain().concat(String.format(WxApiType.ORDER_QUERY_BY_NO.getType(), orderNo)).concat("?mchid=").concat(wxPayConfig.getMchId());
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Accept", "application/json");
CloseableHttpResponse response = wxPayClient.execute(httpGet);
WeChartOrderInfo weChartOrderInfo = buildBodyParams(response, WeChartOrderInfo.class);
log.info("查询订单响应, {}", weChartOrderInfo);
response.close();
return weChartOrderInfo;
}
响应结果
{
"amount": {
"currency": "CNY",
"payer_currency": "CNY",
"payer_total": 1,
"total": 1
},
"appid": "wxdace645e0bc2cXXX",
"attach": "",
"bank_type": "OTHERS",
"mchid": "1900006XXX",
"out_trade_no": "44_2126281063_5504",
"payer": {
"openid": "o4GgauJP_mgWEWictzA15WT15XXX"
},
"promotion_detail": [],
"success_time": "2021-03-22T10:29:05+08:00",
"trade_state": "SUCCESS",
"trade_state_desc": "支付成功",
"trade_type": "JSAPI",
"transaction_id": "4200000891202103228088184743"
}
完善逻辑
/**
* 关闭订单
*/
@SneakyThrows
public void cancelOrder(String orderNo) {
// step 1 查询该订单状态是否需要关闭订单
WeChartOrderInfo state = selectOrderInfo(orderNo);
// 判断如果订单已经关闭则不需要再次关闭 更新数据库
if (null == state || state.getTrade_state() == null) {
// 更新本地订单状态超时关闭订单
orderIn