精华内容
下载资源
问答
  • 注意同步异步通知这个必须要让支付宝可以访问你的项目,也就是说必须让支付宝可以访问你的项目中的方法,所以要把项目放在公网上,如果只是简单测试推荐使用花生壳 1.添加Alipay-sdk支付jar包: alipay-sdk-java...

    做这个测试必须先注册成为支付宝开发者,最好要有一定的Java基础.注意同步异步通知这个必须要让支付宝可以访问你的项目,也就是说必须让支付宝可以访问你的项目中的方法,所以要把项目放在公网上,如果只是简单测试推荐使用花生壳

     

    1.添加Alipay-sdk支付jar包: 

    alipay-sdk-java20170324180803.jar

    alipay-sdk-java20170324180803-source.jar

    commons-logging-1.1.1.jar    //spring框架有日志包可忽略

    2.编写支付宝网关密钥等配置文件

    import java.io.FileWriter;
    import java.io.IOException;

    /* *
     *类名:AlipayConfig
     *功能:基础配置类
     *详细:设置帐户有关信息及返回路径
     *修改日期:2017-04-05
     *说明:
     *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
     *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
     */

    public class AlipayConfig {

    //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

        // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        public static String app_id = "20160926******";

        // 商户私钥,您的PKCS8格式RSA2私钥
        public static String merchant_private_key = "私钥";

        // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        public static String alipay_public_key = "公钥";

        // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "http://yan.eicp.net:26003/MyCSDN/pay/pay_notify";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String return_url = "http://yan.eicp.net:26003/MyCSDN/pay/pay_return";



        // 签名方式
        public static String sign_type = "RSA2";

        // 字符编码格式
        public static String charset = "utf-8";

        // 支付宝网关
        public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

        // 支付宝网关
        public static String log_path = "C:\\";


    //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

        /**
         * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
         * @param sWord 要写入日志里的文本内容
         */
        public static void logResult(String sWord) {
            FileWriter writer = null;
            try {
                writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
                writer.write(sWord);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (writer != null) {
                    try {
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

     

     

    3.编写支付宝支付工具类 :做的是将订单信息公钥私钥等交给支付宝进行加密后返回到界面层

    import com.alipay.api.*;
    import com.alipay.api.domain.AlipayTradeWapPayModel;
    import com.alipay.api.request.*;
    import com.it.exception.AlipayRuntimeException;

    public class AlipayUtil {

        public static String pay(String out_trade_no, String total_amount, String subject, String body) {
            //获得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,  AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
            //设置请求参数
            AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
            alipayRequest.setReturnUrl(AlipayConfig.return_url);
            alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

            //设置订单信息
            AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
            model.setOutTradeNo(out_trade_no);//必填,商户订单号
            model.setSubject(subject);//必填,订单名称
            model.setTotalAmount(total_amount);//必填,付款金额
            model.setBody(body);//选填,商品描述
            model.setProductCode("FAST_INSTANT_TRADE_PAY");//必填,电脑支付FAST_INSTANT_TRADE_PAY,手机支付QUICK_WAP_WAY
            //model.setTimeoutExpress(timeout_express);//选填,增加自定义超时时间参数timeout_express
            alipayRequest.setBizModel(model);

            //请求
            try {
                //把支付信息加密好(私钥),向支付宝后端申请支付,后端用公钥解开信息,生成带有二维码的连接返回给用户,要求用户按链接跳转
                String result = alipayClient.pageExecute(alipayRequest).getBody();
                return result;
            } catch (AlipayApiException e) {
                throw new AlipayRuntimeException("支付宝支付失败", e);
            }

        }
    }

     

     

    4.编写控制器调用支付工具类

     

    //发起支付,等待支付宝返回支付页面
        @RequestMapping(value = "/paydo", method = RequestMethod.POST)
        public void payDo(HttpServletRequest request, HttpServletResponse response,float money) throws Exception {
    //        System.out.println("测试支付");
            Member m = (Member) request.getSession().getAttribute("m");
            response.setContentType("text/html; charset=utf-8");//千万不要忘了设编码,否则密钥报错!!!!!!
            PrintWriter out = response.getWriter();    //输出流

            String out_trade_no = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "_" + m.getId();//订单号
            String total_amount = money + "";                 //支付金额
            String subject = m.getNickName() + "充值";        //订单名称
            String body = "手机充值";                       //商品描述


            out.print(AlipayUtil.pay(out_trade_no, total_amount, subject, body));
        }

     

    //异步通知
        @RequestMapping(value = "/pay_notify",method = RequestMethod.POST)
        public void notifyUrl(HttpServletResponse response,HttpServletRequest request) throws IOException, AlipayApiException {
            System.out.println("异步通知");
            PrintWriter out  = response.getWriter();
            request.setCharacterEncoding("utf-8");//乱码解决,这段代码在出现乱码时使用
            //获取支付宝POST过来反馈信息
            Map<String,String> params = new HashMap<String,String>();
            Map<String,String[]> requestParams = request.getParameterMap();
            for(String str :requestParams.keySet()){
                String name = str;
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                params.put(name, valueStr);
            }

            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

            if(!signVerified) {
                System.out.println("验签失败");
                out.print("fail");
                return;
            }

            //商户订单号,之前生成的带用户ID的订单号
            String out_trade_no = params.get("out_trade_no");
            //支付宝交易号
            String trade_no = params.get("trade_no");
            //付款金额
            String total_amount = params.get("total_amount");
            //交易状态
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

            if(trade_status.equals("TRADE_FINISHED")){
                /*此处可自由发挥*/
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序
                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
            }else if (trade_status.equals("TRADE_SUCCESS")){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序


                //增加用户在数据库余额
                String[] ss = out_trade_no.split("_");
                int mid = Integer.parseInt(ss[1]);
                Member m = memberService.findOne(mid);
                m.setScore(m.getScore() + (int)Double.parseDouble(total_amount));
                memberService.edit(m);
                //添加充值记录
                service.add(new PayInfo(trade_no,new Date(),"积分充值",m));
                System.out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);

            }

            out.print("success");
        }

        //同步通知
        @RequestMapping(value = "/pay_return",method = RequestMethod.GET)
        public String returnUrl(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
            System.out.println("同步通知");
            request.setCharacterEncoding("utf-8");//乱码解决,这段代码在出现乱码时使用
            //获取支付宝GET过来反馈信息
            Map<String,String> params = new HashMap<String,String>();
            Map<String,String[]> requestParams = request.getParameterMap();
            for(String str :requestParams.keySet()){
                String name = str;
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                params.put(name, valueStr);
            }

            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

            if(signVerified) {
                System.out.println("验签成功-跳转到成功后页面");
                //跳转至支付成功后的页面,
                return "redirect:payment";
            }else {
                System.out.println("验签失败-跳转到充值页面让用户重新充值");
                return "redirect:addmoney";
            }

            //打印请求中的字段
    //        for (String str:params.keySet()) {
    //            System.out.println(str +":"+ params.get(str));
    //        }
        }

    5.前端页面,调用controller方法即可

    <form action="${pageContext.request.contextPath}/paydo" method="POST">
       充值金额:<input type="text" name="money" />
    <br/>
    <input type="submit"  value="充值"/>
    </form>

     

     

     

     

     

     

     

    展开全文
  • 支付宝的同步通知与异步通知

    千次阅读 2018-08-14 09:43:45
    同步用于即时通知支付完成 异步用于防止信息漏发漏收 解决方案二: 可以这样理解, 1.用户(买家)支付完成后,电商平台需要实时的给用户一个通知,如支付已经处理等待订单确认。 2.电商平台,这块就需要考虑系统...

    同步用于即时通知支付完成
    异步用于防止信息漏发漏收

    解决方案二:

    可以这样理解,

    1.用户(买家)支付完成后,电商平台需要实时的给用户一个通知,如支付已经处理等待订单确认。
    2.电商平台,这块就需要考虑系统技术方面的各个环节,考虑应对复杂多变的并发用户量、业务、流量、网络环境等因素,我们需要把可以异步化的任务进行分离,算是保障系统可造性、可用性的一个重要的点。
    3.电商网站每秒钟承接1w、5w、10W交易量甚至更高的时候,实时处理这些请求挑战很大,但如果把这些请求分离业务状态实现异步化,放入消息系统、异步准实时环境,进而整体网站的复杂度降低,这就是同步和异步通知存在的意义。
    4.第三方支付公司接入文档上都会有以异步通知为准的约束。
    5.其实除了通知这块,还有一块会被忽略,就是支付查询类接口,这一块的作用如果用好了,对系统业务层会省很多人力

    解决方案三:

    可以换一个理解,一个立即通知,一个稍后通知

    展开全文
  • 同步通知和异步通知发送的数据没有本质的区别; 同步通知有2个作用; 第一是从支付宝的页面上返回自己的网站继续后续操作; 第二是携带支付状态的get参数;让自己的网站用于验证; 同步通知后;还需要异步通知主要...

    同步通知和异步通知发送的数据没有本质的区别;
    同步通知有2个作用;
    第一是从支付宝的页面上返回自己的网站继续后续操作;
    第二是携带支付状态的get参数;让自己的网站用于验证;

    同步通知后;还需要异步通知主要是为了防止出现意外情况;
    因为涉及到金钱;这是一个对安全和稳定要求比较严格的场景;
    如果同步通知的过程中;用户不小心关闭了浏览器;或者浏览器卡死了;
    异步也能收到通知;记录支付状态;

    即便是用户端没问题;万一自己的服务器网络异常了一下呢?

    如果自己的服务器没有正确返回接受到通知的状态;
    支付宝的服务器会在一段时间内持续的往自己的服务器发送异步通知;
    一直到成功;

    顺便去确认了下;这个一段时间是:
    25 小时以内完成 8 次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)

    展开全文
  • 在电商发起订单支付中到支付系统支付完成之后 为什么需要发送同步通知或者异步通知,什么是同步通知什么又是异步通知,请大神赐教!
  • 支付宝支付 - 异步通知同步通知

    千次阅读 2020-10-08 09:12:30
    * @Description: 支付成功后的支付宝异步通知 */ @RequestMapping(value="/alipay") public String alipay(HttpServletRequest request, HttpServletResponse response) throws Exception { log.info("支付成功...
    /**
     * @Description: 支付成功后的支付宝异步通知
     */
    @RequestMapping(value="/alipay")
    public String alipay(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    	log.info("支付成功后的支付宝异步通知");
    
    	//获取支付宝POST过来反馈信息
    	Map<String,String> params = new HashMap<String,String>();
    	Map<String,String[]> requestParams = request.getParameterMap();
    	for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
    		String name = (String) iter.next();
    		String[] values = (String[]) requestParams.get(name);
    		String valueStr = "";
    		for (int i = 0; i < values.length; i++) {
    			valueStr = (i == values.length - 1) ? valueStr + values[i]
    					: valueStr + values[i] + ",";
    		}
    		//乱码解决,这段代码在出现乱码时使用
    //			valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
    		params.put(name, valueStr);
    	}
    
    	boolean signVerified = AlipaySignature.rsaCheckV1(params,
    													aliPayResource.getAlipayPublicKey(),
    													aliPayResource.getCharset(),
    													aliPayResource.getSignType()); //调用SDK验证签名
    
    	if(signVerified) {//验证成功
    		// 商户订单号
    		String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
    		// 支付宝交易号
    		String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
    		// 交易状态
    		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
    		// 付款金额
    		String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
    
    		if (trade_status.equals("TRADE_SUCCESS")){
    			String merchantReturnUrl = paymentOrderService.updateOrderPaid(out_trade_no, CurrencyUtils.getYuan2Fen(total_amount));
    			notifyFoodieShop(out_trade_no, merchantReturnUrl);
    		}
    
    		log.info("************* 支付成功(支付宝异步通知) - 时间: {} *************", DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN));
    		log.info("* 订单号: {}", out_trade_no);
    		log.info("* 支付宝交易号: {}", trade_no);
    		log.info("* 实付金额: {}", total_amount);
    		log.info("* 交易状态: {}", trade_status);
    		log.info("*****************************************************************************");
    
    		return "success";
    	}else {
    		//验证失败
    		log.info("验签失败, 时间: {}", DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN));
    		return "fail";
    	}
    }
    # 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    #alipay.notifyUrl=http://2r49yp.natappfree.cc/payment/notice/alipay
    alipay.notifyUrl=http://payment.t.xuexi.com/payment/payment/notice/alipay
    # 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    alipay.returnUrl=http://payment.t.xuexi.com/payment/alipayResult
    #alipay.returnUrl=http://shop.t.xuexi.com/payment
    @Transactional(propagation=Propagation.REQUIRED)
    @Override
    public String updateOrderPaid(String merchantOrderId, Integer paidAmount) {
    
    	Example example = new Example(Orders.class);
    	Example.Criteria criteria = example.createCriteria();
    	criteria.andEqualTo("merchantOrderId", merchantOrderId);
    
    	Orders paidOrder = new Orders();
    	paidOrder.setPayStatus(PaymentStatus.PAID.type);
    	paidOrder.setAmount(paidAmount);
    
    	int result = ordersMapper.updateByExampleSelective(paidOrder, example);
    
    	return queryMerchantReturnUrl(merchantOrderId);
    }
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>支付结果</title>
    </head>
    <body>
    支付结果
    <script>
        window.onload=function(){
            window.close();
        }
    </script>
    </body>
    </html>

     

    展开全文
  • 同步通知与异步通知 同步通知返回的是用户系统的通知页面 异步通知用来修改数据库订单状态,成功必须返回”success”,否则支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知...
  • 异步通知: 其实是双保险机制, 如果同步通知后没有跳转到你的网址, 可能用户关了, 可能网速慢, 即无法触发你更新订单状态为已支付的controller, 这时候异步通知就有作用了, 不过你要判断一下, 如果订单已经变为...
  • 在电商对应的支付系统中当支付完成之后需要做相关的同步通知和异步通知操作,请大神解释一下什么是同步通知和异步通知,为什么需要同步通知和异步通知
  • 支付宝沙箱环境下,可以收到同步通知,收不到异步通知。是不是沙箱测试只能收到同步通知,支付宝不会返回异步通知
  • 防止同步通知的时候出现意外,异步通知同步通知参数本质没有区别,但支付完成时,用户如果关闭浏览器或者服务网络异常,就会收不到同步返回的结果,此时需要异步通知来保证支付结果的准确性。 三、支付系统中的...
  • 异步通知:对于App支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统。 同步通知参数说明 支付宝sdk对商户的请求支付数据处理完成...
  • Android 同步异步区别

    千次阅读 2017-07-06 07:01:23
    Synchronous(同步)和Asynchronous(异步)的概念最早来自通信领域。 通信的同步:指客户端在发送请求后,必须要在服务端有回应后客户端才继续发送其他请求,所以这时所有请求将会在服务端得到同步,直到服务端...
  • C语言 同步 异步

    千次阅读 2017-09-07 16:45:46
    进程同步异步的概念 1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 2.异步 异步的概念和同步相对。当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的...
  • 同步异步/阻塞非阻塞

    千次阅读 多人点赞 2019-05-27 16:47:05
    网络中获取数据的读操作步骤: 等待数据准备。...如果是异步操作,那么它会去做别的事情,等待数据准备好,内核通知它,它再去读取数据。 同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完...
  • 同步通知和异步通知发送的数据没有本质的区别;同步通知有2个作用;第一是从支付宝的页面上返回自己的网站继续后续操作;第二是携带支付状态的get参数;让自己的网站用于验证;同步通知后;还需要异步通知主要是为了...
  • 支付宝PC网站支付Demo,实现支付、支付同步回调、支付异步通知、订单查询、退款、退款查询、订单关闭功能。采用支付宝服务端SDK:Alipay.AopSdk.Core,使用ASP.NET Core MVC 2.0。
  • python 多线程学习一 (同步与异步)0x00 概念0x01 方法中的同步与异步0x02 图解同步与异步0x03 同步异步与阻塞非阻塞 0x00 概念 定义:同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous ...
  • 首先 声明一点 也是初学者 多发生的错误问题 同步和异步的回调地址是必须公网访问的地址 不是局域网的地址 如果本机测试 公司允许的情况下 可以使用 ngrock 或者花生壳等软件 进行公网映射。...//异步通知 ...
  • 异步:非阻塞式调用,立即返回,调用方无需等待响应方返回实际结果,响应方会通过状态、通知或回调来告知调用方 异步调用场景: 1.耗时任务:主线程中提交耗时任务到线程池,然后通过Feture来异步获取任务执行
  • 支付宝的 服务器异步通知页面 和 页面跳转同步通知页面 需要做什么处理 我网站上要绑定支付宝
  • 小程序之后的异步验证和订单处理 <?php /** * Created by YuanPan. * User: YuanPan * Date: 2017/12/21 * Time: 15:15 */ namespace app\api\service; use app\api\model\Product; use app\lib\enum\...
  • Java中的同步异步详细介绍

    千次阅读 2021-02-12 09:56:52
    进程同步异步的概念1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事.就像早上起床后,先洗涮,然后才能吃饭,不能在洗涮没有完成...
  • 题目通知中心是同步操作还是异步操作?代码实现- (void)viewDidLoad { [super viewDidLoad]; self.btn = [UIButton buttonWithType:UIButtonTypeCustom]; CGFloat x,y,w,h; x = 100; y = 100; w = 100; h = 100...
  • 前言:因为支付异步通知问题,排查了一天,自己模拟各种请求都能到达服务器,地址没问题,唯独支付宝的支付成功异步通知,服务器从没收到过,log一行都不会出。 异步访问状态http0排查方案 设置异步地址要求为外网...
  • 同步 异步 阻塞 非阻塞 区别

    万次阅读 多人点赞 2018-09-25 10:27:27
      1、前言 ...我当时理解同步异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站,需要多次请求服务端,才能加载完整个页面的内容。同步的操作如下:浏览器首先发送第一个请求,等待...
  • ResponseBody和Json转换器对微信、支付宝异步通知的影响 一、现象 写好异步通知代码后,测试时发现支付宝以及微信在进行异步通知时都在一直发送消息,说明我们返回的“成功”它们没有收到,尽管输出了相应的 ...
  • NSNotification是同步还是异步

    万次阅读 2016-07-30 17:17:33
    之前面试被问到NSNotification在发送通知的时候,是同步还是异步,当时自己真不清楚,然后这两天又遇到这个问题,自己写了代码测试一下。代码如下:#import "ViewController.h"#define kNotificationName @...
  • 同步异步、阻塞非阻塞 个人认为同步和异步是更抽象的概念,是相对的任务而言的。而阻塞和非阻塞就就字面的意思是对当前的进程或线程而言的。 概念之间的区别同步与异步 同步与异步在不同的场景下有不同的概念,在...
  • Win10 串口通信 —— 同步异步

    千次阅读 2020-08-14 01:57:36
    文章目录Win10 串口通信 —— 同步/异步简介实现1.主函数2.串口模块源码 Win10 串口通信 —— 同步/异步 简介 之前接到的一个小项目,好像不能算。win10下的串口通信,不需要界面,排除了Qt,MFC只剩C++ 底层了,调用...
  • 文章目录同步异步同步互斥 同步异步 定义:同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。同步,就是调用某个东西是,调用方得等待这个调用返回结果才能继续往后执行。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,679
精华内容 66,271
关键字:

同步异步通知