开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):查询订单支付状态接口(1)】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11495
查询订单支付状态接口(1)
目录:
一、支付过程
二、查询订单支付状态
三、总结
一、支付过程
当二维码准备好后,用微信扫一扫支付,支付完成后,需要知晓是否支付成功。所以需要写一个接口,用来查询订单支付状态。
二、查询订单支付状态
看支付的订单是否支付成功。需要做个查询,即如果订单支付成功需要做什么事情。
在支付记录表中加一条支付成功记录,另外在订单中需要改动,把status状态改成1。0表示未支付,1表示已支付。即写个接口查询订单支付状态,如果订单支付成功,那么需要在支付记录表中加支付成功记录,并把支付状态改成1。
在 PayLogController 中
//查询订单支付状态
//参数:订单号,根据订单号查询 支付状态
@GetMapping(“queryPayStatus/{orderNo}”)在生成二维码时是根据订单号生成的,所以根据订单号即可查出来,在生成二维码时把里面设置过订单号,所以根据订单号即可查出状态。
p
ublic
R querPayStatus(@PathVariable String orderNo){
这个是订单号
Map<String,String>map=payLogService.queryPayStatus(orderNo);
订单状态里面传一个订单号,引入 map 集合。返回后可以用 map 的值做判断。
if(map == null){
支付等于空,一般来说支付有问题了
return R.error().message(“
支付出错了”);
}
//如果返回 map 里面不为空,通过 map 获取订单状态
在 map 中设置一个值,或者有个固定值,trade_state。
if
(map.get(“trade_state”).equals(“SUCCESS
”)
){
如果值是success即支付成功
//
添加记录到支付表,更新订单表订单状态
payLogService.updateOrderStatus(map);
根据订单号,调微信官方提供地址,查询订单是否支付成功,目前订单的状态,而支付状态中,返回是一个map集合,如果返回值是 null 则支付出错,如果返回值是success,则支付成功。
支付成功后,向记录表中更新支付记录及状态,最后 return ok
return R.ok().message(“
支付成功
”)
}
r
eturn R.ok().message(“
支付中
”)
在 PayLogService中,创建 queryPayStatus 方法和 updateOrdersStatus 方法。
一个是更新记录,一个是添加状态
先创建 querypaystatus 方法
//根据订单号查询订单支付状态
M
ap
<String,String> queryPayStatus(String orderNo);
这个方法只做两件事情,一是向支付表添加记录,更新订单状态,二是查询订单支付。
//向支付表添加记录,更新订单状态
void updateOrdersStatus(Map<String,String> map) ;
在service里面两个方法创建一下。
//查询订单支付状态
@
Override
p
ublic Map<String,String> queryPayStatus(String orderNo){
//1、封装参数
Map
m = new HashMap<>()
m
.put(“appid”,”wx74862e0dfcf69954”);
m
.put(“mch_id”,”1558950191”)
;
m
.put(“out_trade_no”,orderNo);
m
.put(“nonce_str”,WXPayUtil.generateNonceStr());
//2、发送 httpclient
H
ttpClient client = new HttpClient(
url:”https://api.mch.weixin.qq.com/pay/orderquery
”);
这是请求的固定地址
c
lient.setCmlParam(WXPayUtil.generateSignedXml(m,key:”T6m9iK73b0kn9g5v426NKfHQH7X8rKwb”));
参数也是xml格式,用微信工具类做转换,两个参数,一个是map一个是商户key
c
lient.setHttps(true);
c
lient.post();
//3.得到请求返回内容
S
tring xml = client.getContent()
;
M
ap<String,String>resultMap = WXPayUtil.xmlToMap(xml);
//6、转成 Map 再返回
r
eturn resultMap;
}catch(Exception e){
return null;
}
//添加支付记录和更新订单状态
@Override
p
ublic void updateOrdersStatus(Map<String,String>map){
三、总结
首先设置需要的参数,参数是固定的,包括微信id,商户号,订单号以及随机字符串,设置完成后发送请求到固定地址,把请求参数变成xml并用商户key做加密,加密后发送得到内容,得到的内容是xml格式,把xml格式变成map集合,最终返回