电商第十八天:
内容回顾:
- 取消订单操作
使用的是延迟队列:
2. 介绍了支付
重点:支付宝
重点: 调用支付宝支付接口完成支付功能!退款!
1. 如何与支付宝进行对接!
2. 创建支付模块:
3. 显示支付信息:
a. 订单Id
b. 订单金额
c. 对接web-all 远程调用 orderFeignClient
d. 测试!
ServiceWareApplication [devtools] :9001/
ServerGatewayApplication :80/
ServiceCartApplication [devtools] :8201/
ServiceProductApplication [devtools] :8206/
ServiceUserApplication [devtools] :8208/
WebAllApplication :8300/
ServiceOrderApplication [devtools]
4. 扫描支付!
a. 生成二维码
根据orderId 生成二维码!
public void doPost (HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //获得初始化的AlipayClient
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); //创建API对应的request
alipayRequest.setReturnUrl( "http://domain.com/CallBack/return_url.jsp" );
alipayRequest.setNotifyUrl( "http://domain.com/CallBack/notify_url.jsp" ); //在公共参数中设置回跳和通知地址
alipayRequest.setBizContent( "{" +
" \"out_trade_no\":\"20150320010101001\"," +
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
" \"total_amount\":88.88," +
" \"subject\":\"Iphone6 16G\"," +
" \"body\":\"Iphone6 16G\"," +
" \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," +
" \"extend_params\":{" +
" \"sys_service_provider_id\":\"2088511833207846\"" +
" }" +
" }" ); //填充业务参数
String form= "" ;
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType( "text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form); //直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
1. 将alipayClient 注入到spring 容器中!
b. 保存支付信息{目的是与支付宝进行对账}
payment_info : 保存支付交易记录表!
将order_info 中的部分数据赋值个 payment_info;
考虑问题:
如何保证支付的幂等性!
无论扫描多少次,只能有一个人扫描成功!
//out_trade_no : 商户订单号。由商家自定义,64个字符以内,仅支持字母、数字、下划线且需保证在商户端不重复。
//将这个 out_trade_no 存储在支付宝内了。
http://api.gmall.com/api/payment/alipay/submit/42 写在哪? service-payment 而不是web-all?
细节: 考虑订单已经被关闭或已经支付过了,则不能生成二维码!
回调:
https://www.domain.com/CallBack/return_url?out_trade_no=ATGUIGU1641278115977548&version=1.0&
app_id=2021001163617452&charset=utf-8&sign_type=RSA2&trade_no=2022010422001456601443616453&auth_app_id=2021001163617452×tamp=2022-01-04%2014:35:40&seller_id=2088831489324244&method=alipay.trade.page.pay.return&total_amount=0.01&sign=Uz5la/wal5tV+6kGEr1UsHowTuTWlIJZcgQlQtNRJs7lF/Y/nfJS9UsURt9CdBwVAjvYZHpFq8hjJvuaW8m7r1rtIuVnOrOZRv8aXK7wjf7omSyZeYxATGDCzICxJEV5IB7IwAF5JBHXfLOZjZpuGa9/a5g40atTg89CkJXoaGrcFUQo0EZu5Z+c9aeXbIZ5P3Za8++MedlCA8ZVH5YbChXeF+28eSVPGN63F0/i0G6GCp4C0sPA4NNfGGpliWTW3evfdWYFfLy02C4SyI6GJFYL74V9c35gxjnHwQj3Qe8+Sqo1QXFtLrZBYt/5gH42tLnNvAG4bDOVX81j0x2uLQ==
timeout_express:相对超时时间 10m
time_expire:绝对超时时间 推荐使用!
5. 处理同步回调异步回调!
同步处理完成:
做了一个重定向作用!
异步:
需要一个内网穿透工具!支付宝需要发送一段信息给当前的电商系统!
有同步为什么还需要异步回调?
同步:给用户一个反馈!
异步:给商家一个反馈! 防止意外情况发生!
6. 退款:
http://localhost:8205/api/payment/alipay/refund/20