上篇文章写到了app开发中的微信支付和支付宝支付连接:https://blog.csdn.net/qq_35318713/article/details/92832397,

这次再把电脑网站扫码支付的过程记录一下,其实原理上还是差不多,就是多了一个生成二维码的过程。

上代码!!!!

后台的原理还是统一下单,跟app不同的是要把统一下达的结果放在一个连接里面,通过二维码生成工具生成后扫码支付

Servlet:

所有的工具类我全部写在了Servlet里面,大家可以直接用,这有一个生成二维码所需要的jar,网上可以找到

package com.sumeng.PC;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.ws.soap.AddressingFeature.Responses;import com.sec.dao.CartDao;
import com.sec.dao.FZDao;
import com.sec.dao.GreensDao;
import com.sec.dao.IndentDao;
import com.sec.dao.OrderDao;
import com.sec.dao.TotalDao;
import com.sec.dao.WineshopDao;
import com.sec.entity.Cart;
import com.sec.entity.FZ;
import com.sec.entity.Greens;
import com.sec.entity.Indent;
import com.sec.entity.Order;
import com.sec.entity.Total;
import com.sec.entity.Wineshop;import WeiXin.PayCommonUtil;
import WeiXin.UUID;
import WeiXin.XMLUtil;
import net.sf.json.JSONObject;/*** Servlet implementation class WeiXinPay*/
@WebServlet("/WeiXinPay")
public class WeiXinPay extends HttpServlet {private static final long serialVersionUID = 1L;private static String APPID = "***************";private static String MCHID= "***************";private static String KEY= "*********************";private static String APPSECRET= "********************";private static String body= "速盟快线微信支付系统";private static String notify_url= "http://v4eat4.natappfree.cc/ACPSample_B2C/NotifyServlets";//回调地址public static String getLocalHostAddress() {//获取电脑IPInetAddress addr = null;try {// 获取本机的相关信息并保存在addraddr = InetAddress.getLocalHost();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}return addr.getHostAddress().toString();}public static String CREATE_IP = getLocalHostAddress();public static String getCurrTime() {  Date now = new Date();  SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");  String s = outFormat.format(now);  return s;  }public static int buildRandom(int length) {  int num = 1;  double random = Math.random();  if (random < 0.1) {  random = random + 0.1;  }  for (int i = 0; i < length; i++) {  num = num * 10;  }  return (int) ((random * num));  }public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  StringBuffer sb = new StringBuffer();Set es = packageParams.entrySet();  Iterator it = es.iterator();  while (it.hasNext()) {  Map.Entry entry = (Map.Entry) it.next();  String k = (String) entry.getKey();  String v = (String) entry.getValue();  if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {  sb.append(k + "=" + v + "&");  }  }  sb.append("key=" + API_KEY);  String sign = MD5Encode(sb.toString(), characterEncoding).toUpperCase();  return sign;  }private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}/*** byteToHexString* @param b* @return*/private static String byteToHexString(byte b) {int n = b;if (n < 0)n += 256;int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}/*** hexDigits*/private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };public static String MD5Encode(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);MessageDigest md = MessageDigest.getInstance("MD5");if (charsetname == null || "".equals(charsetname))resultString = byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));} catch (Exception exception) {}return resultString;}public static String postData(String urlStr, String data) {String postData  = postData2(urlStr, data, null);return postData;}private final static int CONNECT_TIMEOUT = 5000; // in millisecondsprivate final static String DEFAULT_ENCODING = "UTF-8";public static String postData2(String urlStr, String data, String contentType) {BufferedReader reader = null;  try {  URL url = new URL(urlStr);  URLConnection conn = url.openConnection();  conn.setDoOutput(true);  conn.setConnectTimeout(CONNECT_TIMEOUT);  conn.setReadTimeout(CONNECT_TIMEOUT);  if(contentType != null)  conn.setRequestProperty("content-type", contentType);  OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);  if(data == null)  data = "";  writer.write(data);   writer.flush();  writer.close();    reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));  StringBuilder sb = new StringBuilder();  String line = null;  while ((line = reader.readLine()) != null) {  sb.append(line);  sb.append("\r\n");  }  return sb.toString();  } catch (IOException e) {  e.printStackTrace();} finally {  try {  if (reader != null)  reader.close();  } catch (IOException e) {  }  }  return null;  }/*** @see HttpServlet#HttpServlet()*/public WeiXinPay() {super();// TODO Auto-generated constructor stub}/*** @return * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoPost(request,response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubint Wineshop_ID = 3;String Indent_remark = "aaaaa";float Greens_Price = 1;float Fare = 1;JSONObject retJson = new JSONObject();try {String currTime = getCurrTime();String strTime = currTime.substring(8, currTime.length());String strRandom = buildRandom(4) + "";String nonce_str = strTime + strRandom;//生成随机字符串String spbill_create_ip = CREATE_IP;System.out.println(spbill_create_ip);//获取设备IP// 正式上线的时候价格根据订单id查询int b = (int) (Float.valueOf(0.01+"")*100);String order_price = b+"" ; // 价格 注意:价格的单位是分String out_trade_no = String.valueOf(UUID.next()); // 订单号SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();packageParams.put("appid", APPID);packageParams.put("mch_id", MCHID);packageParams.put("nonce_str", nonce_str);packageParams.put("body", body);packageParams.put("out_trade_no", out_trade_no);packageParams.put("total_fee", order_price);packageParams.put("spbill_create_ip", spbill_create_ip);packageParams.put("notify_url", notify_url);packageParams.put("trade_type", "NATIVE");packageParams.put("product_id", "2222");String sign = createSign("UTF-8",packageParams, KEY);// 这里是二次签名    //应用对应的密钥packageParams.put("sign", sign);//加密String requestXML = PayCommonUtil.getRequestXml(packageParams);System.out.println(requestXML+"requestXML");long startTime=System.currentTimeMillis();String resXml = postData("https://api.mch.weixin.qq.com/pay/unifiedorder", requestXML);long endTime=System.currentTimeMillis();Integer execute_time = (int) ((endTime-startTime)/1000);System.out.println(resXml+"resXml");Map map = XMLUtil.doXMLParse(resXml);JSONObject reportParams = new JSONObject();reportParams.put("url", "https://api.mch.weixin.qq.com/pay/unifiedorder");reportParams.put("execute_time", execute_time);reportParams.put("return_code", map.get("return_code").toString());reportParams.put("return_msg", map.get("return_msg").toString());reportParams.put("result_code", map.get("result_code").toString());System.out.println(map.get("result_code").toString()+"result_code");if (map.get("err_code") != null) {reportParams.put("err_code", map.get("err_code").toString());reportParams.put("err_code_des", map.get("err_code_des").toString());}reportParams.put("out_trade_no", out_trade_no);//交易保障if (map.get("return_code").toString().equals("SUCCESS") && map.get("result_code").toString().equals("SUCCESS")) {String urlCode = (String) map.get("code_url");//微信二维码短链接retJson.put("code", 0);retJson.put("message", "下单成功.");retJson.put("data", urlCode);System.out.println(urlCode+"urlCode");//最主要获取这个URLCode//这里写下自己生成订单的逻辑
//——————————————————————————————————————————————————————————————————————HttpSession s = request.getSession();s.setAttribute("urlCode", urlCode);//这里就可以获取到生成二维码的链接了s.setAttribute("order_price", order_price);s.setAttribute("out_trade_no", out_trade_no);request.getRequestDispatcher("./PCWeiXin.jsp").forward(request, response);//跳转到前台生成二维码System.out.println("order_price"+order_price);System.out.println("out_trade_no"+out_trade_no);} else {retJson.put("code", 1);retJson.put("message", map.get("err_code_des").toString());retJson.put("data", "");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}

异步回调:

package com.sumeng.PC;import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.jdom.JDOMException;import com.sec.dao.CartDao;
import com.sec.dao.IndentDao;
import com.sec.entity.Indent;import WeiXin.XMLUtil;/*** Servlet implementation class NotifyServlet*/
@WebServlet(name = "NotifyServlets", urlPatterns = { "/NotifyServlets" })
public class NotifyServlet extends HttpServlet {private static final long serialVersionUID = 1L;public static boolean createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  StringBuffer sb = new StringBuffer();Set es = packageParams.entrySet();  Iterator it = es.iterator();  while (it.hasNext()) {  Map.Entry entry = (Map.Entry) it.next();  String k = (String) entry.getKey();  String v = (String) entry.getValue();  if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {  sb.append(k + "=" + v + "&");  }  }  sb.append("key=" + API_KEY);  String sign = MD5Encode(sb.toString(), characterEncoding).toUpperCase();  return true;  }  public static String MD5Encode(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);MessageDigest md = MessageDigest.getInstance("MD5");if (charsetname == null || "".equals(charsetname))resultString = byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));} catch (Exception exception) {}return resultString;}private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}private static String byteToHexString(byte b) {int n = b;if (n < 0)n += 256;int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };/*** @see HttpServlet#HttpServlet()*/public NotifyServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub// TODO Auto-generated method stubSystem.out.println("微信支付回调");InputStream inputStream;try {StringBuffer sb = new StringBuffer();inputStream = request.getInputStream();String s;BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));while ((s = in.readLine()) != null) {sb.append(s);}in.close();inputStream.close();// 解析xml成mapMap<String, String> m = new HashMap<String, String>();m = XMLUtil.doXMLParse(sb.toString());// 过滤空 设置 TreeMapSortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();Iterator it = m.keySet().iterator();while (it.hasNext()) {String parameter = (String) it.next();String parameterValue = m.get(parameter);String v = "";if (null != parameterValue) {v = parameterValue.trim();}packageParams.put(parameter, v);}// 账号信息String key = "d2fp6ugtfgp45wr453u6kvcibrdnq69a"; // key// 判断签名是否正确if (createSign("UTF-8", packageParams, key)) {// ------------------------------// 处理业务开始// ------------------------------String resXml = "";if ("SUCCESS".equals((String) packageParams.get("result_code"))) {// 这里是支付成功// 执行自己的业务逻辑//String mch_id = (String) packageParams.get("mch_id");//String openid = (String) packageParams.get("openid");//String is_subscribe = (String)         packageParams.get("is_subscribe");String out_trade_no = (String) packageParams.get("out_trade_no");System.out.println(out_trade_no+"out_trade_no");String total_fee = (String) packageParams.get("total_fee");System.out.println(total_fee+"total_fee");String spbill_create_ip = (String) packageParams.get("spbill_create_ip");System.out.println(spbill_create_ip+"spbill_create_ip");//这里写下自己改变订单状态的代码/*IndentDao dao = new IndentDao();Indent indent = new Indent();indent.setIndent_PayType("支付成功");indent.setIndent_Status("正在处理");indent.setIndent_PayID(out_trade_no);dao.update100(indent);int Wineshop_ID = dao.Select1(out_trade_no);CartDao dao1 = new CartDao();dao1.delete1(Wineshop_ID);*/// 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.resXml = "<xml>"+ "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>"+ "</xml> ";System.out.println(resXml);} else {resXml = "<xml>"+ "<return_code><![CDATA[FAIL]]></return_code>"+ "<return_msg><![CDATA[报文为空]]></return_msg>"+ "</xml> ";}// ------------------------------// 处理业务完毕// ------------------------------try {BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());//一定要以XML的格式给微信返回 success,不然会一直回调out.flush();out.close();System.out.println("微信回调成功了!!");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println("通知签名验证失败");}} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (JDOMException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

加入自己企业的APPID,签名,KEY这些的,就可以直接吊起来了!!!

然后把上面得到的URL_Code传给前台

jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko">
<head>
<title>微信支付(PC)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
<link href="layui-v2.4.5/layui/css/layui.css" rel="stylesheet" media="all">
<script type="text/javascript" src="//cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="//static.runoob.com/assets/qrcode/qrcode.min.js"></script>
<script src="js/layui.js"></script>
</head>
<body>
<%String URL = (String) request.getSession().getAttribute("urlCode");//后台传过来的url_CodeString order_price =(String)request.getSession().getAttribute("order_price");//String out_trade_no = (String) request.getSession().getAttribute("out_trade_no");String out_trade_no="2019050412491900001";System.out.print(URL+"aa");
%><input id="text" type="text" value=<%=URL %> style="display:none;" /><br />
<b style="margin-left:650px;font-family: Helvetica, 'Hiragino Sans GB', 'Microsoft Yahei', '微软雅黑', Arial, sans-serif;">速盟快线微信收银台</b>
<input type="text" value=<%=order_price %> readonly="readonly" style="margin-left:650px" />元<br />
<input type="text" id="out_trade_no" value=<%=out_trade_no %> readonly="readonly" style="margin-left:650px;margin-top:20px" /><br />
<div id="qrcode" style="margin-left:650px;margin-top:20px"></div>
<b style="margin-left:650px;margin-top:40px;color:red;font-family: Helvetica, 'Hiragino Sans GB', 'Microsoft Yahei', '微软雅黑', Arial, sans-serif;">确认订单请扫此二维码支付</b>
<script src="js/jquery.js"></script>
<script>
var qrcode = new QRCode(document.getElementById("qrcode"), {width : 200,height : 200
});function makeCode () {       var elText = document.getElementById("text");if (!elText.value) {alert("Input a text");elText.focus();return;}qrcode.makeCode(elText.value);
}makeCode();$("#text").on("blur", function () {makeCode();}).on("keydown", function (e) {if (e.keyCode == 13) {makeCode();}});
</script>
<script>var out_trade_no= $("#out_trade_no").val();alert(out_trade_no);setInterval("test()",500);function test(){$.ajax({url: 'http://localhost:8080/ACPSample_B2C/CheckIDServlet',async:true,type: 'get',data:{"out_trade_no":out_trade_no},success: function (data) {if (data=1){$("body").append('<div style="font-size: 36px;text-align: center;color: #5FB878;"><i class="layui-icon layui-icon-ok-circle" style="font-size: 36px; color:#5FB878;"></i>支付成功</div>')}}})}</script></body>
</html>

这个生成二维码的方法网上有好多,记得要把包导对

然后就会生成二维码,可以支付了,我这写了一个轮询是否付款的方法,然后跳转到成功页面!!

到这里姐结束了,祝各位开发愉快!!!!

java web电脑网站微信扫码支付(Servlet+JSP)相关推荐

  1. 网站微信扫码支付java开发

    网站微信扫码支付java开发 一.网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得 二.首先去微信公众平台申请账户 https://mp.weixin.qq.com ** 三 ...

  2. PC网站微信扫码支付,Native支付,“当前商户号暂不支持关联该类型的appid“,“签名错误,请检查后再试““springBoot 微信支付“

    springBoot 微信支付 PC网站微信扫码支付-Native支付 一.采坑大合集 1.当前商户号暂不支持关联该类型的appid 2.签名错误,请检查后再试 二.springboot集成微信支付D ...

  3. PC网站微信扫码支付之Native支付(模式二)

    简介 Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站.实体店单品或订单.媒体广告支付等场景. Native支付 ...

  4. 网站微信扫码支付流程

    网站微信扫码支付流程 一.申请微信公众号 1.首先去微信公众平台申请微信公众号(小程序的也可以),APP_ID是要用的 二.注册商户平台(个体目前不能申请) 1.注册申请通过后,商户号(MCH_ID) ...

  5. Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)

    目录 前言 操作流程 1.注册微信小程序 2.通过后台获取小程序码 注意事项 时序图理解 方案实现步骤 前言 很多业务场景之下我们需要实现微信扫码登录检测登录状态的需求,或需要同步网站与小程序的用户信 ...

  6. 使用 springboot 轻松实现网站微信扫码支付以及支付回调逻辑处理(javaJDK实现)

    目录 准备工作 项目部分导入 时序图理解支付流程 支付流程 支付请求 支付完成回调 前端收尾工作 准备工作 使用扫码微信支付需要在微信支付商户平台申请native支付,如图 以及基本的商户号等支付基本 ...

  7. JAVA微信扫码支付模式二功能实现完整例子

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

  8. 随手记录JAVA微信扫码支付模式二功能

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

  9. Java实现PC微信扫码支付

    Java实现PC微信扫码支付 做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付. 微信支付官方网站 业务流程: 开发指引文档 支付服务开发前提准备: 1.SDK下载:SDK 2.利用外网穿 ...

最新文章

  1. Hadoop的启动顺序和停止顺序
  2. pe卸载win10更新补丁_Win10更新翻车!CPU使用率飙升,直接损坏SSD,勿升级
  3. log4j使用方法(一)——先跑起来再说
  4. qt combox 向上弹出_一睹芳容!人类首次拍到活的公羊角乌贼 手臂和触须向上飞速穿过水柱...
  5. kubernetes入门mysql_Kubernetes 1.13 完全入门 (10) Mysql 数据例子
  6. JAVA设计模式之装饰模式
  7. Amdahl’s law (阿姆达尔定律)的演化和思考
  8. C#并发编程之异步编程(二)
  9. 什么样的事才是有意义的
  10. 安装cocoaPod 的问题
  11. layUI数据表格可编辑扩展下拉框
  12. Linux设备管理(三):sysfs文件系统的功能及其应用
  13. 嵌入式学习是什么?嵌入式开发入门教程带你了解
  14. 基于JAVA春运出行铁路路线规划推荐系统计算机毕业设计源码+系统+lw文档+部署
  15. Adaptive vision
  16. 【Linux】云服务器的购买与Linux远程连接
  17. Directshow完整介绍
  18. 电信老总气疯了(爆笑版)!!
  19. 有计算机学的大学,Brandeis有计算机专业排名经验揭秘精简篇
  20. python实现百万富翁遇到一个陌生人契约

热门文章

  1. Excel报表公式值替换后,报错打开提示部分内容有问题, 是否尝试尽量恢复
  2. 山东省菏泽市谷歌高清卫星地图下载
  3. 解决ubantu系统下百度网盘启动问题
  4. react-infinite-scroller组件滚动分页加载
  5. unity 位移贴图正弦波面
  6. 用ALSA驱动声卡流程详解
  7. 多线程Delphi数据库查询
  8. MFC的COleDateTime类使用
  9. 华为云桌面服务器地址怎么看,探索华为FusionAccess云桌面的真面目
  10. 网维8300去广告图片