电商第十八天:
    内容回顾:

    1. 取消订单操作
      使用的是延迟队列:
    1. 2. 介绍了支付
    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&timestamp=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