OpenAPI的使用代码-登录优快云

C# U8调用OpenAPI U8 OpenApi调用 调用OpenAPI的准备: 一.在用友开放平台(用友U8开放平台)注册账号。 二.申请成为开发者。注册的时候选择开发者! 三.下载OpenAPI客户端。用友U8开放平台下载客户端 四.创建应用。选择你需要调用的接口 五.申请测试账号。申请的测试账号有效期为两个月 六.U8开放平台配置应用需要调用的接口。用测试账号登录 七.配置OpenAPI客户端。 完成准备后就可以开始项目的搭建了。 入库按钮 /// ... 阅读详情
原文地址:
http://www.java2000.net/p7715
http://blog.youkuaiyun.com/java2000_net/archive/2008/07/30/2736659.aspx
此文的版权归JAVA世纪网(www.java2000.net)和优快云(www.youkuaiyun.com)所有,转载请保留此声明、代码注释和原始链接


优快云在很早以前就提供了登录优快云的OpenAPI,原始地址如下:http://passport.youkuaiyun.com/WebService/UserLoginService.asmx

原理分析
系统提供了2个方法
                UserLogin                                                           
                UserPreLogin
我们要使用这个服务,必须经过2个步骤。
1 预登录,获取一些验证信息(ClientKey)以及验证码图片
2 显示验证码图片,并让用户输入用户名和密码
3 提交数据,包括ClientKey,用户名和密码,以及验证码
4 拿到结果,最重要的就是 cookie的信息(ErrorInfo)

我们依然使用
URLConnection直接进行数据处理的方法.

先看预登录的部分。
看看协议

POST /WebService/UserLoginService.asmx HTTP/1.1
Host: passport.youkuaiyun.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <UserPreLogin xmlns="http://passport.youkuaiyun.com/">
      <RobotName>string</RobotName>
    </UserPreLogin>
  </soap12:Body>
</soap12:Envelope>


实现的代码

  /**
   * 预登录优快云系统
   *
   * @author 赵学庆,www.java2000.net
   * @param username 预登录的用户名
   * @return 结果数组.[0]:验证码的字符串, [1] Client的字符串 ,[2] Cookie数据
   */
  public static String[] preLogin(String username) {
    StringBuilder b = new StringBuilder();
    try {
      b.append("<?xml version=/"1.0/" encoding=/"utf-8/"?>/n");
      b
          .append("<soap12:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:soap12=/"http://www.w3.org/2003/05/soap-envelope/">/n");
      b.append("  <soap12:Body>/n");
      b.append("    <UserPreLogin xmlns=/"http://passport.youkuaiyun.com//">/n");
      b.append("      <RobotName>" + username + "</RobotName>/n");
      b.append("    </UserPreLogin>/n");
      b.append("  </soap12:Body>/n");
      b.append("</soap12:Envelope>/n");
      String[] strs = postPage("http://passport.youkuaiyun.com/WebService/UserLoginService.asmx",
          "passport.youkuaiyun.com", null, b.toString());
      String textXml = strs[1];
      SAXBuilder builder = new SAXBuilder();
      Document doc = null;
      Reader in = new StringReader(textXml);
      doc = builder.build(in);
      Element root = doc.getRootElement();
      List ls = root.getChildren();// 注意此处取出的是root节点下面的一层的Element集合
      Element body = (Element) ls.get(0);
      Element response = (Element) body.getChildren().get(0);
      List content = response.getChildren();
      Element result = (Element) content.get(0);
      Element result2 = (Element) content.get(1);
      String[] rtn = new String[3];
      if ("UserPreLoginResult".equals(result.getName())) {
        rtn[0] = result.getText();
      }
      if ("ClientKey".equals(result2.getName())) {
        rtn[1] = result2.getText();
      }
      rtn[2] = strs[0];
      return rtn;
    } catch (Exception ex) {
      ex.printStackTrace();
      return null;
    }
  }



调用的登录表单代码

<form method="post">
<table>
  <tr>
    <td>优快云用户名</td>
    <td><input type="text" name="username" /></td>
  </tr>
  <tr>
    <td>优快云密码</td>
    <td><input type="password" name="password" /></td>
  </tr>
  <tr>
    <td>图形验证码</td>
    <td><input type="text" size="6" name="code" /><br>
    <img id="vc" src="get优快云Image.jsp" /></td>
  </tr>
  <tr>
    <th>保存密码</th>
    <td><input type="checkbox" name="savePassword" value="true" id="savePassword" tabindex="-1" /></td>
  </tr>
  <tr>
    <td colspan="2">
    <button type="submit">登陆</button>
    </td>
  </tr>
</table>
</form>



其中的显示验证码的部分是关键

String[] rtn = OpenAPI.preLogin("java2000_net_test");
session.setAttribute("优快云_ClientKey",rtn[1]);
session.setAttribute("优快云_COOKIE",rtn[2]);
OutputStream os = response.getOutputStream();
os.write( org.apache.commons.codec.binary.Base64.decodeBase64(rtn[0].getBytes()));


里面讲返回的信息记录到了session里面,以备下次调用时使用

提示:返回的验证码图片数据是Base64编码后的,需要先解码才能使用。


到目前为止,预登录完成


下面我们进入第二步,登录

先看登录的协议


POST /WebService/UserLoginService.asmx HTTP/1.1
Host: passport.youkuaiyun.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <UserLogin xmlns="http://passport.youkuaiyun.com/">
      <LoginName>string</LoginName>
      <Password>string</Password>
      <VerifyCode>string</VerifyCode>
      <ClientKey>string</ClientKey>
    </UserLogin>
  </soap12:Body>
</soap12:Envelope>



参数有4个,登录的用户名,密码,认证码和ClientKey


登录返回的XML协议


HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <UserLoginResponse xmlns="http://passport.youkuaiyun.com/">
      <UserLoginResult>boolean</UserLoginResult>
      <ErrorInfo>string</ErrorInfo>
      <WarningInfo>string</WarningInfo>
    </UserLoginResponse>
  </soap12:Body>
</soap12:Envelope>



其中的
UserLoginResult为登录结果
ErrorInfo 为登录失败的错误信息
WarningInfo 我没用,估计是不是被暴力破解的那个警告啊

实现的代码

  /**
   * 登录优快云系统
   *
   * @author 赵学庆,www.java2000.net
   * @param username 登录的用户名
   * @param password 密码
   * @param verifyCode 校验码
   * @param clientkey 预登录的clientKey
   * @param cookie 预登录拿到的cookie
   * @return 登录结果,[0] 登录结果,'true'成功, [1] 错误信息,[2] 登录后的cookie数据
   */
  public static String[] login(String username, String password, String verifyCode,
      String clientkey, String cookie) {
    StringBuilder b = new StringBuilder();
    try {
      b.append("<?xml version=/"1.0/" encoding=/"utf-8/"?>/n");
      b
          .append("<soap12:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:soap12=/"http://www.w3.org/2003/05/soap-envelope/">/n");
      b.append("  <soap12:Body>/n");
      b.append("   <UserLogin xmlns=/"http://passport.youkuaiyun.com//">/n");
      b.append("    <LoginName>" + username + "</LoginName>/n");
      b.append("    <Password>" + password + "</Password>/n");
      b.append("     <VerifyCode>" + verifyCode + "</VerifyCode>/n");
      b.append("     <ClientKey>" + clientkey + "</ClientKey>/n");
      b.append("   </UserLogin>/n");
      b.append(" </soap12:Body>/n");
      b.append(" </soap12:Envelope>/n");
      String[] strs = postPage("http://passport.youkuaiyun.com/WebService/UserLoginService.asmx",
          "passport.youkuaiyun.com", cookie, b.toString());
      String textXml = strs[1];
      SAXBuilder builder = new SAXBuilder();
      Document doc = null;
      Reader in = new StringReader(textXml);
      doc = builder.build(in);
      Element root = doc.getRootElement();
      List ls = root.getChildren();// 注意此处取出的是root节点下面的一层的Element集合
      Element body = (Element) ls.get(0);
      Element response = (Element) body.getChildren().get(0);
      List content = response.getChildren();
      Element result = (Element) content.get(0);
      Element result2 = (Element) content.get(1);
      String[] rtn = new String[3];
      if ("UserLoginResult".equals(result.getName())) {
        rtn[0] = result.getText();
      }
      if ("ErrorInfo".equals(result2.getName())) {
        rtn[1] = result2.getText();
      }
      rtn[2] = strs[0];
      return rtn;
    } catch (Exception ex) {
      ex.printStackTrace();
      return null;
    }
  }




下面看登录的程序
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String code = request.getParameter("code");
    String clientKey = (String) session.getAttribute("优快云_ClientKey");
    String cookies = (String) session.getAttribute("优快云_COOKIE");
    String[] rtn = OpenAPI.login(username, password, code, clientKey, cookies);
    if ("true".equals(rtn[0])) {
      out.println("登陆成功!");
      // 其它的处理代码
      return;
    } else {
      out.println("登陆失败:" + rtn[1]);
    }




总结:
这个OpenAPI设计的还是挺好的,我们拿到ClientKey 和 Cookie之后,就可以在其它的请求里面把他们放在cookie里,直接向优快云提交请求,就如同你用浏览器直接访问一样。


附件:
系统用到的postPage的源代码
  /**
   * 提交数据到指定的地址
   *
   * @param urlTo 指定提交的地址
   * @param host 主机名称
   * @param cookies cookies的数据
   * @param data 提交的数据
   * @return 返回提交的结果数组,[0] 为返回的cookie 数据,[1]为返回的内容本体数据
   */
  private static String[] postPage(String urlTo, String host, String cookies, String data) {
    try {
      URL url = new URL(urlTo);
      HttpURLConnection con = (HttpURLConnection) url.openConnection();
      con.setDoOutput(true); // POST方式
      con.setRequestMethod("POST");
      con.addRequestProperty("Host", host);
      con.addRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
      if (cookies != null) {
        con.addRequestProperty("Cookie", cookies);
      }
      byte[] bs = data.getBytes("UTF-8");
      con.addRequestProperty("Content-Length", Integer.toString(bs.length));
      OutputStream os = con.getOutputStream(); // 输出流,写数据
      os.write(bs);
      Map<String, List<String>> map = con.getHeaderFields();
      String[] rtn = new String[2];
      String cookie = "";
      if (map.get("Set-Cookie") != null)
        for (String v : map.get("Set-Cookie")) {
          cookie += v.substring(0, v.indexOf(";") + 1);
        }
      rtn[0] = cookie;
      BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(),
          "UTF-8")); // 读取结果
      String line;
      StringBuilder b = new StringBuilder();
      while ((line = reader.readLine()) != null) {
        b.append(line);
      }
      reader.close();
      rtn[1] = b.toString();
      return rtn;
    } catch (Exception ex) {
      ex.printStackTrace();
      return null;
    }
  }












<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
京东商城OPEN API文档 京东商城OPEN API文档,是完整的京东API开放接口的文档,需要接入京东的商家需要仔细研究此文档。 立即下载

相关推荐

京东商城Open API通用接口源码及开发实例(轻开版20151121)

通用接口实现类LinkJOS 扩展于:public class LinkJOS extends LinkOAuth2(LinkOAuth2 extends JspEasy) 构造函数 LinkJOS(HttpServletRequest request,HttpServletResponse response) 京东JOS接口访问函数 public String link2(String link,String method,Bag sys,Bag apps,String appSecret,String file,String FileField) 作用:访问京东JOS平台的所有接口 参数: String link,京东JOS平台接口访问地址,目前固定为:https://api.jd.com/routerjson String method,向京东JOS平台提交数据时的方法,需要应用级别参数时建议用POST方法,不需要时用GET(参见后边的实例) Bag sys,系统级别参数书包(一般只需在接口参数文件中放入接口方法即可,参见后边的实例) Bag apps,应用级别参数书包(在接口参数文件中放入必须的应用级别参数,若不需要应用级别参数时直接用new Bag(-1)构造一个空书包即可,参见后边的实例) String appSecret,应用证书中的App Secret,前边已经设置,固定用"@{pPage:app_secret}"即可 String file,调用上传文件接口上传文件(如图片)到京东JOS平台时的文件全名(含相对路径,如:images/logo.png),不是调用上传文件接口时为空字符串即可(参见后边的实例) String FileField,调用上传文件接口上传文件(如图片)到京东JOS平台时的字段名,配合前边的参数,不是调用上传文件接口时为空字符串即可(参见后边的实例) 返回为京东JOS平台接口对应的JSON格式的字符串 JSON文本解析方法 public void parseJson(String json) 作用:解析京东JOS平台接口返回的JSON格式的字符串,并根据内容生成N个对应的书包 参数:String json,京东JOS平台接口返回的JSON格式的字符串 根据JSON文本的内容在系统中生成N个书包,根书包名称为j0,下一层的josn文本内容生成的书包名称用上一层的Key放在上一层的书名中,下边用实例说明寻找对应书包的方法: 如店铺信息查询接口jingdong.vender.shop.query返回的json文本为 { "jingdong_vender_shop_query_responce": { "shop_jos_result": { "open_time": "", "shop_id": "", "category_main_name": "", "category_main": "", "vender_id": "", "brief": "", "logo_url": "", "shop_name": "" } } } 找出店铺信息书包名的方法如下 @{j0:jingdong_vender_shop_query_responce} @{@{pPage:bag}:shop_jos_result} 这时候的@{pPage:bag}即为需要的店铺信息书包名 具体用法请阅读下载包中的《京东卖家如何快速开发网店工具软件》

openai的使用

openai的使用

qq_53298558的博客 3051

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 707

OpenAI注册以及Java代码调用

OpenAI可以使用google账号登录,也可以使用微软账号登录,这里建议使用微软账号登录,微软账号不需要vpn即可实现注册,用国内的邮箱和电话号码即可。在红色对话框即可进行对话,需要注意的是,因为受返回会话字数限制,超过一定数量就不会继续,可以在对话框输入continue继续进行。注意这个有效时间是20分钟,如果没有接收到短信会将购买费用返回,我使用阿根廷、印度的都能成功,可以根据实际情况选择。使用第一步注册的微软账号登录,接着会让提供电话号码,使用第二步购买的号码,等待验证码输入即可。

有问题请发邮箱dengyifanlittle@163.com进行讨论 1万+

构建面向嵌入式Linux的ARM64交叉编译工具链:从sysroot配置到CMake实战

本文详细介绍了如何构建面向嵌入式Linux的ARM64交叉编译工具链,从sysroot配置到CMake实战。通过分步指导,帮助开发者解决架构不一致问题,提升编译效率,特别适用于树莓派等ARM64设备开发。文章涵盖sysroot机制、环境搭建、CMake配置及常见问题解决方案,是嵌入式开发的实用指南。

weixin_42537142的博客 200

2025.06.25【微生物】|Emu工具安装与使用详解:全长16S扩增子微生物丰度分析

Emu是一款基于贝叶斯方法的微生物多样性分析工具,专为处理高错误率的长读长16S/18S扩增子数据优化。本文详细介绍了Emu的安装与使用方法:1)通过conda创建独立环境并安装Emu;2)提供SILVA等预构建数据库的下载指南,并说明自定义数据库的构建方法;3)演示单样本和多样本分析流程,解读关键输出文件;4)介绍丰度表合并、分类等级汇总等实用功能扩展;5)建议后续分析方向。文章还附有官方GitHub链接和相关文献资源,为微生物群落结构研究提供了一套完整的分析解决方案。

1256

在C#中直接使用Open API的方法 / A Method of Using Open API in C#

UG NX提供NXOpen类库是支持C#的,只可惜资料太少。很多人使用C#语言开发NX工具,仍然使用以前的UFUN,就是Open API。只不过是通过NXOpen中提供的UF空间封装一下而已。封装是.net常用的技术了。但是可惜的是,很多函数(如uc1601)并不在这些封装方法之内。也就说,用C#开发,基本上与这些没有封装的函数无缘了。采用本文的方法就可以解决这些函数不能使用的问题

博客搬往 http://begtostudy.cnblogs.com 6061

苹果搜索广告ASA开户教程

阅读导航 一、创建账号 1、登录网站 2、填写账号主体信息 3、填写商家和发票信息 4、选择付款方式 二、上传审核材料 1、上传文件 2、请求审批 3、上传文件中的常见问题 一、创建账号 1、用Apple ID登录ASA网站 首先我们进入开户网址:https://app-ads.apple.com/ 如果已拥有Apple ID,直接登录即可,如果没有Apple ID,可以先按照步骤创建Apple ID,再返回登录。 注意,这里登录的Apple ID也有讲究: ① 如果是开发

testflight121的博客 2131

OpenAPI的使用代码-判断用户名和密码

原文地址:http://www.java2000.net/p7714http://blog.csdn.net/java2000_net/archive/2008/07/30/2736268.aspx此文的版权归JAVA世纪网(www.java2000.net)和优快云(www.csdn.net)所有,转载请保留此声明、代码注释和原始链接   优快云的 OpenAPI 提

老紫竹的专栏 3805

【讯飞星火大模型AI】SpringBoot整合星火API:从零构建智能数据分析助手

本文详细介绍了如何使用SpringBoot框架整合讯飞星火大模型API,从零构建一个智能数据分析助手。通过清晰的步骤,指导开发者完成API密钥申请、项目搭建、SDK集成与核心代码编写,实现用户通过自然语言指令和CSV数据,即可自动获得ECharts图表代码与专业数据分析结论,极大降低数据分析与可视化的门槛。

neovim7hacker的博客 277

基于STM32L4XX 、HAL库的TMP144YFFR数字温度传感器驱动应用C语言程序设计

define TMP144_ADDRESS 0x00 // 默认为全局地址,用于单器件或MDA命令。#define TMP144_CMD_READ_TEMP 0x00 // 读取温度寄存器命令。if (temp_raw & 0x800) { // 判断第11位(符号位)

PP_Cottage的博客 91

第三方登陆

1.什么是“QQ登陆OAuth2.0” OAuth:OAuth(开放授权)是开放一个标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或者分享他们数据的所有内容。QQ登陆OAuth2.0:对于用户相关的openAPI(例如获取用户的信息,动态同步,照片,日志,分享等)为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显示的向用户征求...

Cici3051336992的博客 311

基于四旋翼模型的火箭型无人机视线角保持控制仿真设计

本文针对火箭型无人机的视线角保持控制问题展开研究。基于四旋翼动力学模型,通过改造设计了一种摄像头朝上安装的特殊无人机系统,用于追踪空中目标。文章详细推导了坐标系定义、运动学和动力学方程,重点分析了摄像头安装与视线几何关系,建立了目标运动模型和视线向量计算方法。通过解算期望姿态角,实现了使机体Z轴始终对准目标的控制目标。仿真结果表明,该系统能有效完成视线角保持任务,为空对空监视等应用场景提供了可行方案。~~~~~

huanghm88的专栏 143

优快云--OpenAPI的使用代码-判断用户名和密码

http://www.java2000.net/p7714http://blog.csdn.net/java2000_net/archive/2008/07/30/2736268.aspx此文的版权归JAVA世纪网(www.java2000.net)和优快云(www.csdn.net)所有,转载请保留此声明、代码注释和原始链接   优快云的 OpenAPI 提供了WebSe

gogo313的专栏 852

全面认识PFC和LLC

想象一下,你在拉一辆车,如果你的力气都用在推动车子前进的方向上,这样拉车会比较轻松。而如果你的力气用在不正确的方向,比如侧向、斜向,那就需要更大的力气才能推动车子。PFC就是在帮助电流“朝着正确的方向”流动,这样可以用更少的能量做更多的事情,减少无用的功率损耗。PFC负责将电流方向对齐,让电源效率更高,而LLC负责电压的高效转换,两者配合可以在更宽的负载范围内保持高效率。综上所述,PFC LLC电路是一种高效的电源转换电路,通过PFC模块和LLC模块的组合,实现了从交流电到直流电的高效转换。

weixin_43199439的博客 6104

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

本人已经实现的使用OpenAPI的应用汇总

本人已经实现的使用OpenAPI的应用汇总

jgfyyfd的博客 1904

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

openApi 使用

2、调用标准的费用报销单接口。1、先登录获取token。

MZ199290的博客 3269

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

利用码云OpenApi|GiteePage搭建图床

因为自建博客需要图片服务器,考虑到用本机的图片服务器需要考虑数据备份链接路径等一系列问题,还是推荐使用第三方的服务 当前各个主要平台的oss服务,有免费的有收费的,这里就不多说,毕竟个人的理解不一样 本文只讨论使用码云搭建第三方图床的问题,好了,开始使用码云搭建图床的具体操作 在码云上建一个空的远程仓库,然后建一个空的文件夹 这里有几点建议 不要轻易修改仓库的名字和文件夹的名字 注意命名规范简洁...

misty's technology stack 2686

FastAPI+Pydantic自动生成OpenAPI文档实战指南

API文档是服务间协作的契约基础,其本质是将接口逻辑转化为机器可读、人类可理解的标准化描述。OpenAPI规范通过JSON Schema定义请求/响应结构,支撑自动化测试、SDK生成与契约验证等工程实践。在数据科学场景中,模型API常涉及嵌套结构、动态响应与非标数据(如Pandas DataFrame),传统手写YAML易失效且维护成本高。FastAPI凭借对Pydantic v2的深度集成,实现从类型注解、Field约束到OpenAPI 3.0文档的零侵入式推导,让docstring和BaseModel成

weixin_30552811的博客 534
上一篇: OpenAPI的使用代码-判断用户名和密码
下一篇: 关于CLASSPATH的个人理解
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值