菜鸟物流云属于淘宝开放平台的一部分,淘宝开发平台提供了很多种对接接口,包括商品、销售单等等,几乎涉及到的业务都在该平台上开放了接口。
淘宝开放平台提供了两种快递面单接口,一种是淘宝商家TOP接口,一种是菜鸟物流云Link接口。这里主要是LINK,具体介绍请查看淘宝开发平台的文档:
文章目录
- 前期准备
- 一、jar
- 二、工具类
- 1.可根据需要再整理
- 2. controller
- 3. 订单展示页面
- 三 、 END
前期准备
先贴一下API链接 电子面单接入口
下面是主要用到的
“电子面单业务基本介绍”—可查看各个公司的cpCode
先按照“ISV软件商接入”流程走一遍,然后主要用到的API都在“电子面单LINK接口总览”
一、jar
在“ISV软件商接入”中1.9.1 物流云SDK下载,直接复制到浏览器地址栏打开即可下载
二、工具类
1.可根据需要再整理
import com.google.common.collect.Maps;
import com.taobao.pac.sdk.cp.PacClient;
import com.taobao.pac.sdk.cp.SendSysParams;
import com.taobao.pac.sdk.cp.dataobject.request.CLOUDPRINT_STANDARD_TEMPLATES.CloudprintStandardTemplatesRequest;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_DISCARD.TmsWaybillDiscardRequest;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.*;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_SUBSCRIPTION_QUERY.TmsWaybillSubscriptionQueryRequest;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_UPDATE.Recipient;
import com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_UPDATE.TmsWaybillUpdateRequest;
import com.taobao.pac.sdk.cp.dataobject.response.CLOUDPRINT_STANDARD_TEMPLATES.CloudprintStandardTemplatesResponse;
import com.taobao.pac.sdk.cp.dataobject.response.CLOUDPRINT_STANDARD_TEMPLATES.StandardTemplateResult;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_DISCARD.TmsWaybillDiscardResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_GET.TmsWaybillGetResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_GET.WaybillCloudPrintResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.AddressDto;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.TmsWaybillSubscriptionQueryResponse;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.WaybillApplySubscriptionInfo;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.WaybillBranchAccount;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_UPDATE.TmsWaybillUpdateResponse;
import com.wr.business.entity.Order;
import com.wr.business.entity.Sender;
import lombok.extern.log4j.Log4j2;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;/*** @Author: 可乐伢* @Date: 2021-4-12 19:59*/
@Log4j2
public class WaybillUtils {/*** 线上环境请求url*/private final static String ONLINE_URL = "http://link.cainiao.com/gateway/link.do";/*** 线上环境appKey,物流云控制台查看*/private final static String ONLINE_APP_KEY = "";/*** 线上环境secretKey,物流云控制台查看*/private final static String ONLINE_SECRET_KEY = "";/*** 线上环境token,token是商家在物流云平台授权ISV后生成的授权码,目前需要商家配置在ISV的软件中*/private final static String ONLINE_TOKEN = "";/*** 查询电子面单订购关系以及账户情况 获取发货地址* @return*/public static AddressDto waybillSubscriptionQuery(){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);TmsWaybillSubscriptionQueryRequest request = new TmsWaybillSubscriptionQueryRequest();TmsWaybillSubscriptionQueryResponse tmsWaybillSubscriptionQueryResponse = client.send(request, params);if(!tmsWaybillSubscriptionQueryResponse.isSuccess()){log.info("errorCode:" + tmsWaybillSubscriptionQueryResponse.getErrorCode() + "errorMessage:" + tmsWaybillSubscriptionQueryResponse.getErrorMsg());return null;}List<WaybillApplySubscriptionInfo> wasiList=tmsWaybillSubscriptionQueryResponse.getWaybillApplySubscriptionCols();log.info(wasiList);List<WaybillBranchAccount> wbaList;if(null!=wasiList&&wasiList.size()>0){wbaList=wasiList.get(0).getBranchAccountCols();if(null!=wbaList&&wbaList.size()>0){if(null!=wbaList.get(0).getShippAddressCols()&&wbaList.get(0).getShippAddressCols().size()>0){return wbaList.get(0).getShippAddressCols().get(0);}}}return null;}/*** 设置发件人信息* @param addressDto* @return*/public static UserInfoDto setSender(Sender sender,AddressDto addressDto){//根据业务设置一个默认的发件人姓名String name=sender!=null?sender.getSenderName():"xxx";//发件人信息UserInfoDto senderInfo = new UserInfoDto();//发件人姓名senderInfo.setName(name);//发件人固定电话senderInfo.setPhone(sender.getMobile());//发件人手机号senderInfo.setMobile(sender.getMobile());//寄件地址,这里的地址需要是卖家订购电子面单服务时使用的订购地址,具体可以通过TMS_WAYBILL_SUBSCRIPTION_QUERY接口获取com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDtosendAddress = new com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDto();sendAddress.setProvince(addressDto.getProvince());sendAddress.setCity(addressDto.getCity());sendAddress.setDistrict(addressDto.getDistrict());sendAddress.setTown(addressDto.getTown());sendAddress.setDetail(addressDto.getDetail());senderInfo.setAddress(sendAddress);return senderInfo;}/*** 设置订单信息* @param objectId 请求id(与参数传入时相同)* @param templateUrl* @param orderCodes* @param items* @param receiver* @return*/public static List<TradeOrderInfoDto> setOrderList(String objectId, String templateUrl,List<String> orderCodes, List<Item> items,UserInfoDto receiver){//收件信息ArrayList<TradeOrderInfoDto> tradeOrderInfoDtos = new ArrayList<TradeOrderInfoDto>();TradeOrderInfoDto tradeOrderInfoDto = new TradeOrderInfoDto();tradeOrderInfoDto.setObjectId(objectId);//打印模板的url,参见白皮书tradeOrderInfoDto.setTemplateUrl(templateUrl);//设置订单OrderInfoDto orderInfoDto = new OrderInfoDto();orderInfoDto.setOrderChannelsType("OTHERS");orderInfoDto.setTradeOrderList(orderCodes);tradeOrderInfoDto.setOrderInfo(orderInfoDto);//设置包裹PackageInfoDto packageInfoDto = new PackageInfoDto();packageInfoDto.setItems(items);tradeOrderInfoDto.setPackageInfo(packageInfoDto);//设置收货人tradeOrderInfoDto.setRecipient(receiver);tradeOrderInfoDtos.add(tradeOrderInfoDto);return tradeOrderInfoDtos;}/*** 获取打印模板* 韵达快递标准模板 http://cloudprint.cainiao.com/template/standard/401/193* 韵达快递标准三联模板 http://cloudprint.cainiao.com/template/standard/76303/59* 韵达快递便携式模板 http://cloudprint.cainiao.com/template/standard/278831/12* 韵达快递标准模板(蓝牙版) http://cloudprint.cainiao.com/template/standard/285424/5* 韵达便携式(高度160) http://cloudprint.cainiao.com/template/standard/288357/2* 韵达快递一联单 http://cloudprint.cainiao.com/template/standard/288658/17* 韵达蓝牙一联单 http://cloudprint.cainiao.com/template/standard/300202/10* @param cpCode 配送公司编码* @return*/public static List<StandardTemplateResult> getTemplates(String cpCode){List<StandardTemplateResult> templateResults=new ArrayList<>();PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);//关闭日志打印client.getLogger().setLogEnable(false);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);CloudprintStandardTemplatesRequest request = new CloudprintStandardTemplatesRequest();//TmsWaybillSubscriptionQueryRequest request1 = new TmsWaybillSubscriptionQueryRequest();//配送公司编码request.setCpCode(cpCode);//TmsWaybillSubscriptionQueryResponse tmsWaybillSubscriptionQueryResponse = client.send(request, params);CloudprintStandardTemplatesResponse response = client.send(request, params);if (!response.isSuccess()) {log.info("errorCode:" + response.getErrorCode() + "errorMessage:"+ response.getErrorMsg());return templateResults;}return response.getData();}/***通过物流云获取电子面单* @return*/public static Map<String,Object> getWaybill(Sender sender, Order order){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);TmsWaybillGetRequest request = new TmsWaybillGetRequest();//配送公司编码request.setCpCode("");com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_SUBSCRIPTION_QUERY.AddressDtoaddressDto=waybillSubscriptionQuery();UserInfoDto senderInto=setSender(sender,addressDto);request.setSender(senderInto);String objectId = UUID.randomUUID().toString().replaceAll("-","");//根据cpCode查询模板List<StandardTemplateResult> templateResults=getTemplates("");log.info("**************templateResults--begin******************");for(int i=0;i<templateResults.get(0).getStandardTemplateDOs().size();i++){log.info(templateResults.get(0).getStandardTemplateDOs().get(i));}log.info("**************templateResults--end******************");String templateUrl="http://cloudprint.cainiao.com/template/standard/288658/17";if(null!=templateResults&&templateResults.size()>0){if(null!=templateResults.get(0).getStandardTemplateDOs()&&templateResults.get(0).getStandardTemplateDOs().size()>0){String templateName=templateResults.get(0).getStandardTemplateDOs().get(0).getStandardTemplateName();//这里只能根据templateName来匹配自己业务需求的模板,可多试几次,这里用韵达的为例if("韵达快递一联单".equals(templateName)){templateUrl =templateResults.get(0).getStandardTemplateDOs().get(0).getStandardTemplateUrl();}}}List<String> orderCodes=new ArrayList<>();//订单列表,这里的场景是一个订单获取一个面单号orderCodes.add(order.getOrderNo());List<Item> items=new ArrayList<>();Item item = new Item();//设置一个商品的名字item.setName("");if(null!=order.getProduct()){item.setName(order.getProduct().getProName());}item.setCount(1);items.add(item);UserInfoDto receiver = new UserInfoDto();receiver.setName(order.getConsignee());receiver.setMobile(order.getConsigneePhone());com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDto receiveAddress =new com.taobao.pac.sdk.cp.dataobject.request.TMS_WAYBILL_GET.AddressDto();receiver.setAddress(receiveAddress);receiveAddress.setProvince(order.getProvince());receiveAddress.setCity(order.getCity());receiveAddress.setDistrict(order.getDistrict());receiveAddress.setDetail(order.getAddress());List<TradeOrderInfoDto> tradeOrderInfoDtos=setOrderList(objectId,templateUrl,orderCodes,items,receiver);request.setTradeOrderInfoDtos(tradeOrderInfoDtos);TmsWaybillGetResponse response = client.send(request, params);Map<String,Object> map= Maps.newHashMap();map.put("code","FAIL");map.put("message","");map.put("waybillResponse",null);if(!response.isSuccess()){log.info("errorCode:" + response.getErrorCode() + ",errorMessage:" + response.getErrorMsg());map.put("message",response.getErrorMsg());return map;}List<WaybillCloudPrintResponse> waybillResponses = response.getWaybillCloudPrintResponseList();log.info(response);if(null!=waybillResponses&&waybillResponses.size()>0){if (objectId.equals(waybillResponses.get(0).getObjectId())) {map.put("code","SUCCESS");map.put("message","");map.put("waybillResponse",waybillResponses.get(0));return map;}}return map;}/*** 以下几个方法,小伙伴可以参考一下-_-*//*** 更新电子面单信息* @param cpCode 配送公司编码* @param waybillCode 面单号* @param recipientMobile 收货人手机号* @return*/public String updateWaybill(String cpCode,String waybillCode,String recipientMobile){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);//更新一下面单上的收件人手机号TmsWaybillUpdateRequest request = new TmsWaybillUpdateRequest();//配送公司编码request.setCpCode(cpCode);//面单号request.setWaybillCode(waybillCode);Recipient recipient = new Recipient();recipient.setMobile(recipientMobile);request.setRecipient(recipient);TmsWaybillUpdateResponse tmsWaybillUpdateResponse = client.send(request, params);if(!tmsWaybillUpdateResponse.isSuccess()){log.info("errorCode:" + tmsWaybillUpdateResponse.getErrorCode() + "errorMessage:" + tmsWaybillUpdateResponse.getErrorMsg());return "fail";}String newPrintData = tmsWaybillUpdateResponse.getPrintData();log.info(newPrintData);return "success";}/*** 取消电子面单* @param cpCode 配送公司编码* @param waybillCode 面单号* @return*/public String cancelWaybill(String cpCode,String waybillCode){PacClient client = new PacClient(ONLINE_APP_KEY, ONLINE_SECRET_KEY, ONLINE_URL);SendSysParams params = new SendSysParams();params.setFromCode(ONLINE_TOKEN);TmsWaybillDiscardRequest request = new TmsWaybillDiscardRequest();//配送公司编码request.setCpCode(cpCode);request.setWaybillCode(waybillCode);TmsWaybillDiscardResponse tmsWaybillDiscardResponse = client.send(request, params);if(!tmsWaybillDiscardResponse.isSuccess()) {log.info("errorCode:" + tmsWaybillDiscardResponse.getErrorCode() + ",errorMessage:" + tmsWaybillDiscardResponse.getErrorMsg());return "fail";}return "true";}
}
2. controller
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.taobao.pac.sdk.cp.dataobject.response.TMS_WAYBILL_GET.WaybillCloudPrintResponse;
import com.wr.business.entity.Order;
import com.wr.business.entity.Printer;
import com.wr.business.entity.Sender;
import com.wr.business.entity.Waybill;
import com.wr.business.service.OrderService;
import com.wr.business.service.PrinterService;
import com.wr.business.service.SenderService;
import com.wr.business.service.ShopService;
import com.wr.business.service.WaybillService;
import com.wr.business.strategy.util.WaybillUtils;
import com.wr.common.annotation.Log;
import com.wr.common.core.controller.BaseController;
import com.wr.common.core.domain.AjaxResult;
import com.wr.common.core.page.TableDataInfo;
import com.wr.common.enums.BusinessType;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** @Author: 可乐伢* @Date: 2021-4-12 19:59*/
@Controller
@RequestMapping(value = "/pet/order")
public class OrderController extends BaseController {private String prefix = "modules/order";/*** 订单*/@AutowiredOrderService orderService;/*** 电子面单*/@AutowiredWaybillService waybillService;/*** 发件人*/@AutowiredSenderService senderService;/*** 打印机*/@AutowiredPrinterService printerService;/*** 跳转至列表页*/@RequiresPermissions("xxx:order:view")@GetMapping(value = "")public String toPage(ModelMap map) {//发件人信息,一班就一条数据,所以这里可以不用list,直接查一个实体类就可以了List<Sender> senders=senderService.selectSenderList();if(senders.size()>0){map.put("senderId",senders.get(0).getId());}else {map.put("senderId",0);}//打印机Printer printer=printerService.getOne();map.put("printer",printer);return prefix + "/isvOrder";}/*** 获取数据*/@RequiresPermissions(value = "xxx:order:list")@PostMapping(value = "list")@ResponseBodypublic TableDataInfo list(Order order) {startPage();List<Order> list = orderService.selectOrderList(order);return getDataTable(list);}/*** 主要做的是一次打印多个单,有相同的收件人的订单是会合单的*/@RequiresPermissions(value = "xxx:order:print")@PostMapping("/getListData")@ResponseBodypublic AjaxResult getListData(String ids){/*** 发件人信息,一班就一条数据,所以这里可以不用list,* 直接用一个实体类就可以了*/List<Sender> senders=senderService.selectSenderList();Sender sender=new Sender();if(null!=senders&&senders.size()>0){sender=senders.get(0);}//所勾选的订单集合List<Order> orders=orderService.selectOrderListByIds(ids);//存放相同收件人的订单idList<Long> idSame=new ArrayList<>();//返回用于打印的数据List<Map<String,JSONObject>> mapList=new ArrayList<>();Map<String,JSONObject> map;if(null!=orders){for(int i=0;i<orders.size();i++){if(!idSame.contains(orders.get(i).getId())){map=Maps.newHashMap();//获取打印面单上半部分Map<String,Object> responseMap=WaybillUtils.getWaybill(sender,orders.get(i));if("FAIL".equals(responseMap.get("code"))){return AjaxResult.error((String) responseMap.get("message"));}WaybillCloudPrintResponse response= (WaybillCloudPrintResponse) responseMap.get("waybillResponse");String result= response.getPrintData();JSONObject waybillJson=JSON.parseObject(result);updateWaybill(response.getWaybillCode(),orders.get(i));map.put("waybillJson",waybillJson);//获取商品名String proNameI="";//获取雕刻信息String sculptureI="";String custom=proNameI+":"+sculptureI;for(int j=i+1;j<orders.size();j++){//consignee 收件人boolean c=orders.get(i).getConsignee().equals(orders.get(j).getConsignee());//address 收件人地址boolean a=orders.get(i).getAddress().equals(orders.get(j).getAddress());//consigneePhone 收件人电话boolean cp=orders.get(i).getConsigneePhone().equals(orders.get(j).getConsigneePhone());//合单,更新自定义区if(c&&a&&cp){/*** 做一些其他的业务处理*/String proNameJ="";String sculptureJ="";custom+="\n"+proNameJ+":"+sculptureJ;idSame.add(orders.get(j).getId());}}String customData="{ \"data\" : { \"detail\" : \""+custom+"\" }," +" \"templateURL\" : \"http://cloudprint.cainiao.com/template/customArea/9012100/4\"}";JSONObject customJson=JSON.parseObject(customData);map.put("customData",customJson);mapList.add(map);}}return AjaxResult.success(mapList);}return AjaxResult.error("数据有误");}
3. 订单展示页面
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head><th:block th:include="include :: header('订单列表')" />
</head>
<body class="gray-bg">
<div class="container-div"><div class="row"><div class="btn-group-sm" id="toolbar" role="group"><input id="senderId" th:value="${senderId}" type="hidden"><a class="btn btn-warning" onclick="printOrder()" shiro:hasPermission="pet:order:print"><i class="glyphicon glyphicon-print"></i> 打印电子面单</a></div><div class="col-sm-12 select-table table-striped"><table id="bootstrap-table" data-mobile-responsive="true" style="word-break:break-all; word-wrap:break-word;"></table></div></div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">//一些权限var consigneeFlag = [[${@permission.hasPermi('pet:order:consignee')}]];var editFlag = [[${@permission.hasPermi('pet:order:edit')}]];var viewFlag = [[${@permission.hasPermi('pet:order:list')}]];var removeFlag = [[${@permission.hasPermi('pet:order:remove')}]];//请求controller地址的前缀var prefix = ctx + "pet/order";$(function() {var options = {url: prefix + "/list",modalName: "订单",removeUrl: prefix + "/remove/{id}",showSearch: false,showExport: false,showColumns: false,//显示指定表格中的列showToggle: false,clickToSelect:true,pageList:[10, 50, 100,500],columns: [{checkbox: true},{field : 'id',title : '序号'},/*这里根据业务需求来展示要展示的字段*/{title: '操作',align: 'center',formatter: function(value, row, index) {var actions = [];/*根据业务需求来添加操作按钮,这里就先给一个删除*/actions.push('<li style="margin-bottom: 5px"><a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" οnclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i> 订单作废</a></li>');return actions.join('');}}]};$.table.init(options);});//打印机var printer = [[${printer}]];//打开webSocket连接var socket = new WebSocket('ws://localhost:13528');//如果是https的话,端口是13529//socket = new WebSocket('wss://localhost:13529');// 打开Socketsocket.onopen = function(event) {// 监听消息socket.onmessage = function(event) {console.log('Client received a message',event);};// 监听Socket的关闭socket.onclose = function(event) {console.log('Client notified socket has closed',event);};};//打印电子面单function printOrder() {var idList = $('#bootstrap-table').bootstrapTable('getAllSelections');if(idList.length>0){var ids="";for (var i = 0; i < idList.length; i++) {if(i!=idList.length-1){ids+=idList[i].id+",";}else {ids+=idList[i].id;}}var index = layer.load(1, {shade: 0.5,content:"正在打印,请勿操作...",success: function (layero) {layero.find('.layui-layer-content').css({'padding': '10px 45px','width': '200px','color':'#fff'});$.ajax({url:"/pet/order/getListData",dataType:"json",type:"post",data:{ids:ids},async:false,success:function (result) {if(result.code==0){for(var i=0;i<result.data.length;i++){doPrint(result.data[i].waybillJson,result.data[i].customData);}}else {layer.alert(result.msg, {icon: 2,title: "系统提示",btn: ['确认'],btnclass: ['btn btn-primary']});}}});}});setTimeout(function(){layer.close(index);}, 2000);$.table.refresh();}else {$.modal.alert("请选择数据", modal_status.FAIL)}}/*** 打印电子面单* printer 指定要使用那台打印机* waybillJson 电子面单上半部分* customData 自定义区域*/function doPrint(waybillJson,customData){var request = getRequestObject("print");request.task = new Object();request.task.taskID = getUUID(8,10);request.task.preview = false;request.task.printer =printer.portName;var documents = new Array();var doc = new Object();doc.documentID = getUUID(8,10);var contents = new Array();contents[0]=waybillJson;contents[1]=customData;doc.contents= contents;documents.push(doc);request.task.documents=documents;socket.send(JSON.stringify(request));}/*** 获取请求的UUID,指定长度和进制,如* getUUID(8, 2) //"01001010" 8 character (base=2)* getUUID(8, 10) // "47473046" 8 character ID (base=10)* getUUID(8, 16) // "098F4D35"。 8 character ID (base=16)**/function getUUID(len, radix) {var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');var uuid = [], i;radix = radix || chars.length;if (len) {for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];} else {var r;uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';uuid[14] = '4';for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random()*16;uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];}}}return uuid.join('');}//构造request对象function getRequestObject(cmd) {var request = new Object();request.requestID=getUUID(8, 16);request.version="1.0";request.cmd=cmd;return request;}window.onbeforeunload=function(e){socket.close();}
</script>
</body>
</html>
三 、 END
感谢大佬们支持!!!