2015-09-28 15:50:59 ys0798 阅读数 303
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3929 人正在学习 去看看 秦子恒

controller接口:

/**

* @param touser 接收用户openId

* @param template_id 模板Id

* @param url url 调用方需要编码

* @param topcolor topcolor 调用方需要编码

* @param data 模板参数,传过来的是json串  调用方需要编码

* { "first": { "value":"恭喜你购买成功!", "color":"173177"},

* "keynote1":{ "value":"巧克力", "color":"173177"},

* "keynote2": { "value":"39.8元", "color":"173177"},

* "keynote3": { "value":"2014年9月16日", "color":"173177"},

* "remark":{ "value":"欢迎再次购买!", "color":"173177"}}

* @return

*/

@RequestMapping(value="sendMsg",produces = "application/json; charset=utf-8")

public String sendMsg(String touser,String template_id,String url,String topcolor,String data){

if(Strings.isNullOrEmpty(data)||Strings.isNullOrEmpty(touser)||Strings.isNullOrEmpty(template_id)){

return  formatJson(1,"参数错误,请检查参数是否正确!");

}

 

try {

logger.info("模板消息接收参数(解码后):"+data);

data = URLDecoder.decode(data, "UTF-8");

logger.info("模板消息接收参数(解码后):"+data);

url = url==null?"":URLDecoder.decode(url, "UTF-8");

topcolor = topcolor==null?"":URLDecoder.decode(topcolor, "UTF-8");

} catch (UnsupportedEncodingException e) {

return  formatJson(1,"解析参数异常,请检查data,topcolor,url参数");

}

 

 

 

JSONObject obj = null;

try {

obj = JSON.parseObject(data);

} catch (Exception e) {

logger.info("将data转换成json异常,"+e.getMessage());

return  formatJson(1,"解析参数异常,请检查data是否为标准的JOSN串");

}

 

TemplateMsg templateMsg = new TemplateMsg();

templateMsg.touser = touser;

templateMsg.data = obj;

templateMsg.template_id = template_id;

if(!Strings.isNullOrEmpty(url)){

templateMsg.url = url;

}

 

if(!Strings.isNullOrEmpty(topcolor)){

templateMsg.topcolor = topcolor;

}

 

logger.info("接收模板消息:"+templateMsg.toString());

 

SendTemplateMsgResponse sendTemplateMsgResponse  = templateMessageService.sendMsg(templateMsg);

 

if(sendTemplateMsgResponse == null){

return formatJson(1,"发送消息异常!");

}

 

if(sendTemplateMsgResponse.errcode == 0){//发送成功

return  "{\"code\":\"0\",\"result\":\"发送成功\",\"msgid\":\""+sendTemplateMsgResponse.msgid+"\"}";

}else{

return formatJson(1,sendTemplateMsgResponse.errmsg);

}

}

 

service:

public interface TemplateMessageService {

   public SendTemplateMsgResponse sendMsg(TemplateMsg templateMsg);

}

serviceImpl:

public class TemplateMessageServiceImpl implements TemplateMessageService {

@Override

public SendTemplateMsgResponse sendMsg(TemplateMsg templateMsg) {

SendTemplateMsgResponse sendTemplateMsgResponse = null;

try {

// https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

//将这里修改为自己调用服务的方式

sendTemplateMsgResponse = Http.post(

"cgi-bin/message/template/send", templateMsg,

SendTemplateMsgResponse.class);

 

} catch (Exception e) {

logger.debug("Send Template Message Exception:" + e.getMessage());

}

 

return sendTemplateMsgResponse;

}

}

 

 

 model:

public class SendTemplateMsgResponse  extends BaseResponse{

        public String msgid;

        public int errcode = 0;

        public String errmsg;

 

@Override

public String toString() {

return "SendTemplateMsgResponse [msgid=" + msgid + ", errcode="

+ errcode + ", errmsg=" + errmsg + "]";

}

 

}

 

 

public class TemplateMsg {

public String touser;

 

public String template_id;

 

public String url;

 

public String topcolor;

 

public JSONObject data;

 

}

2015-12-29 10:23:45 rwb0123 阅读数 9825
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3929 人正在学习 去看看 秦子恒

1、什么是模板消息?

微信为防止服务号对用户进行恶意骚扰和营销,而服务号在某些场景又必须给用户发送消息时(如购物成功、支付成功),这时候就可以应用微信提供的模板消息来给用户进行提醒。

比如:


2、怎么添加模板消息?

在微信公众号后台菜单里面有模板消息一栏,点击进去后可以看到模板库,可以根据自己的实际需要添加自己需要的模板消息,模板涵盖各行各业,暂不可自己编辑模板。



 

微信限制最多只能选择8个模板,应该也够用了。选中模板后就可以看到模板ID、标题等,这里已购买成功为列,查看详情时:



 可以看到该模板需要提供的相关参数,这样就可以拼装请求的参数了。

这一步主要是要拿到模板的ID和该模板需要的参数名。

3、怎么请求发送模板?

 
第一步:获取模板ID
通过在模板消息功能的模板库中使用需要的模板,可以获得模板ID。
第二步:请求接口
请注意,URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
POST请求
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

 其中的POST请求中需要两个基本的技术要点:

    1、获取ACCESS_TOKEN。

    2、如何提交POST请求。

具体请参考开发教程系列获取ACCESS_TOKEN篇,http://kangliang.iteye.com/admin/blogs/21617

然后组装需要的JSON信息:

如:

 

Json代码  收藏代码
  1. {  
  2.     "touser""OPENID",  
  3.     "template_id""ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",  
  4.     "url""http://weixin.qq.com/download",  
  5.     "topcolor""#FF0000",  
  6.     "data": {  
  7.         "firstData": {  
  8.             "value""恭喜您购物成功!",  
  9.             "color""#173177"  
  10.         },  
  11.         "product": {  
  12.             "value""韩版西服",  
  13.             "color""#173177"  
  14.         },  
  15.         "price": {  
  16.             "value""149元",  
  17.             "color""#173177"  
  18.         },  
  19.         "time": {  
  20.             "value""2014-12-04 13:09:17",  
  21.             "color""#173177"  
  22.         },  
  23.         "remark": {  
  24.             "value""感谢您的光临,我们将尽快发货!",  
  25.             "color""#173177"  
  26.         }  
  27.     }  
  28. }  

 因模板消息属于固定格式,可在代码中写死拼装方式:

 

 

   组装json信息:

 

Java代码  收藏代码
  1. /** 商品购买成功 
  2.  * templateId 模板ID 
  3.  * orderId  订单id 
  4.  *  
  5.  */  
  6. String toTemplateMsgText(String orderId,String templateId){  
  7.     OrderResponse response=getOrderByOrderId(orderId);  
  8.     //查询订单信息  
  9.     Order order=response.getOrder();  
  10.     String first="您好,欢迎在新礼特购物!";  
  11.     String remark="您的收货信息:"+order.getReceiver_name()+" 电话:" +order.getReceiver_mobile()+" 地址:"+order.getReceiver_city()+order.getReceiver_zone()+order.getReceiver_address()+" 我们将尽快发货,祝您购物愉快!";  
  12.     String jsonText="{\"touser\":\"OPENID\",\"template_id\":\"templateId\",\"url\":\"\",\"topcolor\":\"#FF0000\",\"data\":{\"first\": {\"value\":\"firstData\",\"color\":\"#173177\"},\"product\": {\"value\":\"productData\",\"color\":\"#173177\"},\"price\": {\"value\":\"priceData\",\"color\":\"#173177\"},\"time\": {\"value\":\"timeData\",\"color\":\"#173177\"},\"remark\": {\"value\":\"remarkData\",\"color\":\"#173177\"}}}";  
  13.     jsonText= jsonText.replace("firstData", first).replace("templateId", templateId).replace("OPENID", order.getBuyer_openid()).replace("productData", order.getProduct_name()).replace("priceData",order.getOrder_total_price()/100f+"元").replace("timeData", order.getOrder_create_time()).replace("remarkData", remark);  
  14.      return jsonText;  
  15.     }  

 

 

发送消息:

 

Java代码  收藏代码
  1. /** 
  2.  * 发送模板消息 
  3.  * @param accessToken 
  4.  * @param jsonData 
  5.  */  
  6. public static void sendTemplateMsg(String accessToken,String jsonData){  
  7.     String requestUrl=send_templatemsg_url.replace("ACCESS_TOKEN", accessToken);  
  8.     JSONObject jsonObject = httpRequest(requestUrl, "GET", jsonData);  
  9.     if(jsonObject!=null){  
  10.         if("0".equals(jsonObject.getString("errcode"))){  
  11.             System.out.println("发送模板消息成功!");  
  12.         }else{  
  13.             System.out.println(jsonObject.getString("errcode"));  
  14.         }  
  15.     }  
  16. }  

 

 

另附上httpRequest请求方法:

 

Java代码  收藏代码
  1. /** 
  2.  * 发起https请求并获取结果 
  3.  *  
  4.  * @param requestUrl 请求地址 
  5.  * @param requestMethod 请求方式(GET、POST) 
  6.  * @param outputStr 提交的数据 
  7.  * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) 
  8.  */  
  9. public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {  
  10.     JSONObject jsonObject = null;  
  11.     StringBuffer buffer = new StringBuffer();  
  12.     try {  
  13.         // 创建SSLContext对象,并使用我们指定的信任管理器初始化  
  14.         TrustManager[] tm = { new MyX509TrustManager() };  
  15.         SSLContext sslContext = SSLContext.getInstance("SSL""SunJSSE");  
  16.         sslContext.init(null, tm, new java.security.SecureRandom());  
  17.         // 从上述SSLContext对象中得到SSLSocketFactory对象  
  18.         SSLSocketFactory ssf = sslContext.getSocketFactory();  
  19.   
  20.         URL url = new URL(requestUrl);  
  21.         HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();  
  22.         httpUrlConn.setSSLSocketFactory(ssf);  
  23.   
  24.         httpUrlConn.setDoOutput(true);  
  25.         httpUrlConn.setDoInput(true);  
  26.         httpUrlConn.setUseCaches(false);  
  27.         // 设置请求方式(GET/POST)  
  28.         httpUrlConn.setRequestMethod(requestMethod);  
  29.   
  30.         if ("GET".equalsIgnoreCase(requestMethod))  
  31.             httpUrlConn.connect();  
  32.   
  33.         // 当有数据需要提交时  
  34.         if (null != outputStr) {  
  35.             OutputStream outputStream = httpUrlConn.getOutputStream();  
  36.             // 注意编码格式,防止中文乱码  
  37.             outputStream.write(outputStr.getBytes("UTF-8"));  
  38.             outputStream.close();  
  39.         }  
  40.   
  41.         // 将返回的输入流转换成字符串  
  42.         InputStream inputStream = httpUrlConn.getInputStream();  
  43.         InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
  44.         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  45.   
  46.         String str = null;  
  47.         while ((str = bufferedReader.readLine()) != null) {  
  48.             buffer.append(str);  
  49.         }  
  50.         bufferedReader.close();  
  51.         inputStreamReader.close();  
  52.         // 释放资源  
  53.         inputStream.close();  
  54.         inputStream = null;  
  55.         httpUrlConn.disconnect();  
  56.         jsonObject = JSONObject.fromObject(buffer.toString());  
  57.     } catch (ConnectException ce) {  
  58.     } catch (Exception e) {  
  59.     }  
  60.     return jsonObject;  
  61. }  

 

 

事件推送

在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者中心中填写的服务器配置地址中。

1、送达成功时,推送的XML如下:

Xml代码  收藏代码
  1. <xml>  
  2. <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>  
  3. <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]&g;</FromUserName> 
  4. <CreateTime>1395658920</CreateTime> 
  5. <MsgType><![CDATA[event]]></MsgType>  
  6. <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>  
  7. <MsgID>200163836</MsgID>  
  8. <Status><![CDATA[success]]></Status>  
  9. </xml>  

 2、送达由于用户拒收(用户设置拒绝接收公众号消息)而失败时,推送的XML如下:

Xml代码  收藏代码
  1. <xml>  
  2. <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>  
  3. <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>  
  4. <CreateTime>1395658984</CreateTime>  
  5. <MsgType><![CDATA[event]]></MsgType>  
  6. <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>  
  7. <MsgID>200163840</MsgID>  
  8. <Status><![CDATA[failed:user block]]></Status>  
  9. </xml>  

 

 

在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}

 

在根据相应的事件监听,就可以获取发送的状态,而及时对消息进行重复或其他的操作。

2015-12-17 15:34:23 myfmyfmyfmyf 阅读数 4297
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

    3929 人正在学习 去看看 秦子恒

       微信异步任务是在批量更新部门或者人员时使用,向微信服务器发送一个CSV的文件,微信服务器会根据CSV文件进行更新,下面是批量更新人员的模板。注意代码中CSV换行使用\n

       全员覆盖成员时,建议先进行覆盖部门,然后再全员覆盖人员,以免部门不存在造成异常


微信执行步骤:

1、生成一个CSV格式的文件流,上传到微信服务器得到media_id,注意换行使用\n

2、利用media_id发送消息,通知微信服务器执行异步任务,得到jobid

3、利用jobid获得异步执行结果

---------------------------------------------------------------------------------------------------------------

上传csv文件

---------------------------------------------------------------------------------------------------------------

/**
     * 上传csv文件到腾讯服务器
     * @param content  cvs文件内容
     * @return
     * @throws Exception
     */
	public  JSONObject sendCVSFile( String content) throws Exception {  
        String result = null;  
       
        String token=getTokenFromWx();
        System.out.println("token:"+token);
        /** 
        * 第一部分 
        */  
        URL urlObj = new URL("https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token="+ token 
        		+ "&type=file"); 
        					  
        HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();  
        con.setRequestMethod("POST"); // 以Post方式提交表单,默认get方式  
        con.setDoInput(true);  
        con.setDoOutput(true);  
        con.setUseCaches(false); // post方式不能使用缓存  
        // 设置请求头信息  
        con.setRequestProperty("Connection", "Keep-Alive");  
        con.setRequestProperty("Charset", "UTF-8");  
        // 设置边界  
        String BOUNDARY = "----------" + System.currentTimeMillis();  
        con.setRequestProperty("Content-Type", "multipart/form-data; boundary="+ BOUNDARY);  
        // 请求正文信息  
        // 第一部分:  
        StringBuilder sb = new StringBuilder();  
        sb.append("--"); // 必须多两道线  
        sb.append(BOUNDARY);  
        sb.append("\r\n");  
        sb.append("Content-Disposition: form-data;name=\"media\";filename=\""+ "info.csv" + "\"\r\n");  
        sb.append("Content-Type:application/octet-stream\r\n\r\n");  
        byte[] head = sb.toString().getBytes("utf-8");  
        // 获得输出流  
        OutputStream out = new DataOutputStream(con.getOutputStream());  
        // 输出表头  
        out.write(head);  
        // 文件正文部分  
        // 把文件已流文件的方式 推入到url中  
        DataInputStream in = new DataInputStream(new  ByteArrayInputStream(content.getBytes()));  
        int bytes = 0;  
        byte[] bufferOut = new byte[1024];  
        while ((bytes = in.read(bufferOut)) != -1) {  
        out.write(bufferOut, 0, bytes);  
        }  
        in.close();  
        // 结尾部分  
        byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线  
        out.write(foot);  
        out.flush();  
        out.close();  
        StringBuffer buffer = new StringBuffer();  
        BufferedReader reader = null;  
        try {  
        // 定义BufferedReader输入流来读取URL的响应  
        reader = new BufferedReader(new InputStreamReader(con.getInputStream()));  
        String line = null;  
        while ((line = reader.readLine()) != null) {  
        //System.out.println(line);  
        buffer.append(line);  
        }  
        if(result==null){  
        result = buffer.toString();  
        }  
        } catch (IOException e) {  
        System.out.println("发送POST请求出现异常!" + e);  
        e.printStackTrace();  
        throw new IOException("数据读取异常");  
        } finally {  
        if(reader!=null){  
        reader.close();  
        }  
        }  
        JSONObject jsonObj =JSONObject.fromObject(result);  
        return jsonObj;  
    }

---------------------------------------------------------------------------------------------------------------

利用midea_id执行异步任务

---------------------------------------------------------------------------------------------------------------

/**
	 * 执行异步任务
	 * @param mediaId  上传的CVS文件
	 * @param url  微信服务地址"https://qyapi.weixin.qq.com/cgi-bin/batch/replaceuser?access_token="+token;
	 * @return
	 */
	public boolean sendCVSData(String mediaId,String url){
		String jsonContext="{"+
				"\"media_id\":\""+mediaId+"\","+
				"\"callback\":"+
				"{"+
				 	"\"url\": \""+MessageUtil.webUrl+"/addressBookGetJbidServlet"+"\","+
				 	"\"token\": \""+MessageUtil.RESP_MESSAGE_TOKEN+"\","+
				 	"\"encodingaeskey\": \""+MessageUtil.RESP_MESSAGE_ENCODINGAESKEY+"\""+
				"}"+
			"}";
		//发送消息
		//消息json格式
		
		boolean flag=false;
		try {
			 CloseableHttpClient httpclient = HttpClients.createDefault();
			 HttpPost httpPost= new HttpPost(url);
			 //发送json格式的数据
			 StringEntity myEntity = new StringEntity(jsonContext, 
					   ContentType.create("text/plain", "UTF-8"));
			
			 httpPost.setEntity(myEntity);
			 // Create a custom response handler
			ResponseHandler<JSONObject> responseHandler = new ResponseHandler<JSONObject>() {
			
			    public JSONObject handleResponse(
			            final HttpResponse response) throws ClientProtocolException, IOException {
			        int status = response.getStatusLine().getStatusCode();
			        if (status >= 200 && status < 300) {
			            HttpEntity entity = response.getEntity();
			            if(null!=entity){
			            	String result= EntityUtils.toString(entity);
			                //根据字符串生成JSON对象
			       		 	JSONObject resultObj = JSONObject.fromObject(result);
			       		 	return resultObj;
			            }else{
			            	return null;
			            }
			        } else {
			            throw new ClientProtocolException("Unexpected response status: " + status);
			        }
			    }
			
			};
			//返回的json对象
			JSONObject responseBody = httpclient.execute(httpPost, responseHandler);
			System.out.println(responseBody);
			int result= (Integer) responseBody.get("errcode");
			if(0==result){
				flag=true;
			}else{
				flag=false;
			}
			httpclient.close();
		} catch (Exception e) {
		// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		return true;
	}

---------------------------------------------------------------------------------------------------------------

利用jobid获得异步执行结果

---------------------------------------------------------------------------------------------------------------

/**
  	 * 获得异步任务结果
  	 */
  	public JSONObject getResultByjobid(String jobid){
  		//消息json格式
  		//获得token
  		String token=getTokenFromWx();
		 try {
			 CloseableHttpClient httpclient = HttpClients.createDefault();
			 HttpPost httpPost= new HttpPost("https://qyapi.weixin.qq.com/cgi-bin/batch/getresult?access_token="+token+"&jobid="+jobid);
			 // Create a custom response handler
            ResponseHandler<JSONObject> responseHandler = new ResponseHandler<JSONObject>() {

                public JSONObject handleResponse(
                        final HttpResponse response) throws ClientProtocolException, IOException {
                    int status = response.getStatusLine().getStatusCode();
                    if (status >= 200 && status < 300) {
                        HttpEntity entity = response.getEntity();
                        if(null!=entity){
                        	String result= EntityUtils.toString(entity);
                            //根据字符串生成JSON对象
                   		 	JSONObject resultObj = JSONObject.fromObject(result);
                   		 	return resultObj;
                        }else{
                        	return null;
                        }
                    } else {
                        throw new ClientProtocolException("Unexpected response status: " + status);
                    }
                }

            };
          //返回的json对象
            JSONObject responseBody = httpclient.execute(httpPost, responseHandler);
            System.out.println(responseBody.toString());
            return responseBody;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
  	}

全量覆盖成员

  • 接口说明

本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。请先下载CSV文件(下载全量覆盖成员模版),根据需求填写文件内容。
注意事项:
1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字
2.文件中存在、通讯录中也存在的成员,完全以文件为准
3.文件中存在、通讯录中不存在的成员,执行添加操作
4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果:
a) 需要删除的成员多于50人,且多于现有人数的20%以上
b) 需要删除的成员少于50人,且多于现有人数的80%以上
系统将中止导入并返回相应的错误码
5.成员字段更新规则:文件中有指定的字段,以指定的字段值为准;文件中没指定的字段,不更新

  • 请求说明

Https请求方式: POST

https://qyapi.weixin.qq.com/cgi-bin/batch/replaceuser?access_token=ACCESS_TOKEN

请求包结构体为:

{
	"media_id":"xxxxxx",
	"callback":
	{
	 	"url": "xxx",
	 	"token": "xxx",
	 	"encodingaeskey": "xxx"
	}
}
  • 参数说明
参数 是否必须 描述
media_id 上传的csv文件的media_id
callback 回调信息。如填写该项则任务完成后,通过callback推送事件给企业。具体请参考应用回调模式中的相应选项
url 企业应用接收企业号推送请求的访问协议和地址,支持http或https协议
token 用于生成签名
encodingaeskey 用于消息体的加密,是AES密钥的Base64编码
  • 权限说明

管理组须拥有根部门的管理权限。

  • 返回结果
{
	"errcode": 0,
	"errmsg": "ok",
	"jobid": "xxxxx"
}
参数 说明
errcode 返回码
errmsg 对返回码的文本描述内容
jobid 异步任务id,最大长度为64字节




没有更多推荐了,返回首页