查看微信官网开发接口

微信线下门店扫码支付开发

流程:生成一个预付单-》生成二维码》付款交易成功(微信端接收到钱已付款,这时需要告诉商户系统我已收到钱,发送异步通知给商户系统,一般会发送多次有时间间隔。

商户系统的异步通知方法:处理自己系统的业务,一般修改交易流水状态,发送微信客服消息等等。

最后发送个“SUCCESS”内容的xml给微信端,这时微信端就不会再异步请求了。

1.生成预付订单
2.js生成二维码
3.回调通知方法

4.微信退款

1.jsp页面的生成二维码

//*************start*******wxPayByQr********************************
function wxQrClick(){var total_amount=$("#paymentAmount").val();var orderId=$("#myorderId").val();//checkvar paySize=$(".payMoneyC").length;var ptypeNum=$(".ptype:checked").length;var paySum=0;if(ptypeNum<=0){layer.msg("支付方式至少选择一个!");return;}if(ptypeNum!=1){layer.msg("支付方式只能是微信扫码支付!");return;}var companyId=$("#companyId").val();var subCompanyId=$("#subCompanyId").val();if(subCompanyId==null||subCompanyId=='null'||subCompanyId==undefined){subCompanyId="";}$.ajax({url : '<%=basePath%>/payPrepareByQr.action',async : false,type : "post",dataType : "json",data:{"orderAmount":total_amount,"orderId":orderId},success : function(result) {if(result.code=='SUCCESS'){$("#wxQrBtn").hide();$("#outputWXQr").show();<span style="color:#ff0000;">jQuery('#outputWXQr').qrcode({width:200,height:200,text:result.code_url});</span>window.setInterval(finshWXQrPay, 8000); }else{layer.msg("微信二维码生成出错!");}}});
}function finshWXQrPay(){var orderId=$("#myorderId").val();$.ajax({url : '<%=basePath%>/aliPay!notifyFinshedByWXQr.action?orderId='+orderId,async : false,type : "post",dataType : "json",data:$('#finishForm').serialize(),success : function(result) {if(result.code!='0'){layer.msg("微信扫码支付交易成功,订单3秒后即将关闭!");window.setTimeout(function(){//关闭弹出窗之前,跳转到其他页面parent.window.location.href="<%=path%>/"+result.redirectUrl;closeLayerDialog();},3000); }}});
}//*************end*******wxPayByQr********************************

2.二维码调用的方法

/*** 微信二维码扫码支付生成预支付交易单,并返回交易会话的二维码链接code_url* @return* @throws JDOMException* @throws IOException* @throws NumberFormatException* @throws SQLException*/public String payPrepareByQr() throws JDOMException, IOException, NumberFormatException, SQLException {  Order order = orderService.getOrderById(Integer.parseInt(orderId));CompanyPay cp = orderService.getCompanyPay(order.getCompanyId());HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();PrintWriter out = null;if(order.getDealSts()==5||order.getDealSts()==7){out.print("0");return null;}SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();userwxId = (userwxId==null||"".equals(userwxId))?order.getOrderPersonWXId():userwxId;if (!StringUtils.isNotBlank(userwxId)) {userwxId="";}if (!StringUtils.isNotBlank(ticketId)) {ticketId="";}parameters.put("appid", cp.getAppId());parameters.put("mch_id", cp.getMchId());parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());// 随机字符串,不长于32位parameters.put("body", order.getIsTakeOut()==0?"堂食订单":"外卖订单");//商品描述String tradeNo = getTradeNo();parameters.put("out_trade_no", tradeNo);//商户系统内部的订单号,32个字符内、可包含字母float amount_f = Float.parseFloat(orderAmount);Long amount = (long)(amount_f*100);parameters.put("total_fee", amount.toString());//订单总金额,单位为分,不能带小数点parameters.put("spbill_create_ip", request.getRemoteAddr());//订单生成的机器IP,第一个参数订单编号,第二个参数交易金额,第四个参数优惠劵编号parameters.put("notify_url", ConfigUtil.WXQR_NOTIFY_URL+"?orderId="+orderId+","+orderAmount+","+tradeNo+","+ticketId);//接收微信支付成功通知parameters.put("trade_type", "NATIVE");//JSAPI、NATIVE、APPString sign = PayCommonUtil.createSign("UTF-8", parameters,cp.getApiKey());parameters.put("sign", sign);String requestXML = PayCommonUtil.getRequestXml(parameters);System.out.println("requestXML_------------------->>>>>:"+requestXML);String result = CommonUtil.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL,"POST", requestXML);Map<String, String> map = XMLUtil.doXMLParse(result);SortedMap<Object, Object> params = new TreeMap<Object, Object>();String return_code=(String)map.get("return_code");String result_code=(String)map.get("result_code");String json = "";if("SUCCESS".equals(return_code)&&"SUCCESS".equals(result_code)){params.put("code", map.get("return_code"));params.put("appId", cp.getAppId());params.put("prepay_id", map.get("prepay_id"));params.put("trade_type", map.get("trade_type"));params.put("code_url", map.get("code_url"));//trade_type为NATIVE是有返回,可将该参数值生成二维码展示出来进行扫码支付json = JSONObject.fromObject(params).toString();//生成交易流水,等回调后再改变状态WXPayLog vo = new WXPayLog();vo.setOutTradeNo(tradeNo);vo.setOrderId(orderId);vo.setTotalFee(amount_f);vo.setPayOpenId(order.getOrderPersonWXId());vo.setAppId(parameters.get("appid").toString());vo.setStatus(0);vo.setTradeDate(new Date());vo.setTradeType("NATIVE");orderService.insertWXPaylog(vo);}else{params.put("code", map.get("return_code"));params.put("msg", map.get("return_msg"));json = JSONObject.fromObject(params).toString();}System.out.println("微信扫码支付返回信息:="+json);ResponseWriteUtil.writeHTML(json);return null;}

3.回调的方法

/*** 微信扫码支付异步通知回调方法* @return* @throws Exception*/public String paySuccessByWXQr() throws Exception {HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();InputStream inStream = request.getInputStream();ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outSteam.write(buffer, 0, len);}outSteam.close();inStream.close();System.out.println("~~~~~~~~~~~~~~~~付款成功~~~~~~~~~~~~~~~~~~`");List<String> tktIds = new ArrayList<String>();//tktIds.add(ticketId);//orderService.payNotify(orderId,tktIds,orderAmount);String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息Map<Object, Object> map = XMLUtil.doXMLParse(result);String paras = "";String userwxId="";if (map != null) {for (Object keyValue : map.keySet()) {
//              System.out.println("[" + keyValue + "=" + map.get(keyValue)
//                      + "]");if ("orderId".equals(keyValue)) {paras = map.get(keyValue).toString();}if("openid".equals(keyValue)){userwxId=map.get(keyValue).toString();}}}String[] para = paras.split(",");String orderId=para[0];String orderAmount=para[1];String tradeNo=para[2];String ticketId="";if(para.length>3){ticketId=para[3];if(ticketId!=null && !"".equals(ticketId)){tktIds.add(ticketId);}}System.out.println("params="+orderId+","+orderAmount+","+tradeNo+","+userwxId +","+ticketId);//判断付款是否成功,已成功则不再记录付款信息if(orderService.ifOrderPaid(Integer.parseInt(orderId))>0){response.getWriter().write(PayCommonUtil.setXML("SUCCESS", ""));return null;}//更新交易流水状态orderService.updateWXPayLogStatus(tradeNo);// 增加付款信息Order o = orderService.getOrderById(Integer.parseInt(orderId));List<SysUser> us = sysUserService.fetchSysUserByOpenId(userwxId, o.getCompanyId());SysUser u = (us!=null && us.size()>0)?us.get(0):null;if(o.getIsTakeOut()==0){//堂吃orderService.payNotify(orderId,tktIds,orderAmount,0);}else if(o.getIsTakeOut()==1){//外卖o.setPaymentAmount(Float.parseFloat(orderAmount));o.setPaymentType(EnumUtil.PAYMENT_TYPE.weixin.getCode());//配送员结束订单,赞为支付方式为现金或刷卡两种方式o.setPaymentTime(new Date());o.setDealSts(EnumUtil.ORDER_dealSts.paid.getCode());o.setFinishTime(new Date());o.setOrderRemark("用户微信支付");List<OrderPlus> ops = new ArrayList<OrderPlus>();OrderPlus op = new OrderPlus();op.setOrderId(o.getId());op.setOrderAmount(o.getAmount());op.setPaymentAmount(o.getPaymentAmount());//op.setPaymentTime(new Date());op.setActUser(u==null?"":u.getId());op.setPaymentType(EnumUtil.PAYMENT_TYPE.weixin.getCode());op.setNotes("用户微信支付:支付金额为"+o.getPaymentAmount());ops.add(op);orderService.taeoutOrderPaymet4admin(o, ops,tktIds);}orderService.updateOrderItemActualPrice(o.getId());System.out.println("~~~~~~~~~~~~~~~~业务处理完成~~~~~~~~~~~~~~~~~~`");//--------------------------消息发送成功-----------------------------------------endif (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {response.getWriter().write(PayCommonUtil.setXML("SUCCESS", "")); // 告诉微信服务器,我收到信息了,不要在调用回调action了System.out.println("-------------"+ PayCommonUtil.setXML("SUCCESS", ""));}return null;}

XMLUtil.java

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;public class XMLUtil {/*** 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。* @param strxml* @return* @throws JDOMException* @throws IOException*/public static Map doXMLParse(String strxml) throws JDOMException, IOException {strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");if(null == strxml || "".equals(strxml)) {return null;}Map m = new HashMap();InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));SAXBuilder builder = new SAXBuilder();Document doc = builder.build(in);Element root = doc.getRootElement();List list = root.getChildren();Iterator it = list.iterator();while(it.hasNext()) {Element e = (Element) it.next();String k = e.getName();String v = "";List children = e.getChildren();if(children.isEmpty()) {v = e.getTextNormalize();} else {v = XMLUtil.getChildrenText(children);}m.put(k, v);}//关闭流in.close();return m;}/*** 获取子结点的xml* @param children* @return String*/public static String getChildrenText(List children) {StringBuffer sb = new StringBuffer();if(!children.isEmpty()) {Iterator it = children.iterator();while(it.hasNext()) {Element e = (Element) it.next();String name = e.getName();String value = e.getTextNormalize();List list = e.getChildren();sb.append("<" + name + ">");if(!list.isEmpty()) {sb.append(XMLUtil.getChildrenText(list));}sb.append(value);sb.append("</" + name + ">");}}return sb.toString();}}

4.微信退款:首先需要有微信退款的证书,放到商户系统的目录下,然后调用微信退款接口

/*** 微信--申请退款* * @param orderId*            订单编号* @param refundMoney*            退款金额* @param totalFee*            订单总金额* @param outRefundNo*            商户退款单号* @return*/public Map<String, Object> payRefund(String orderId, float refundMoney,float totalFee, String outRefundNo) {Map<String, Object> resultMap = new HashMap<String, Object>();try {Order order = orderService.getOrderById(Integer.parseInt(orderId));CompanyPay cp = orderService.getCompanyPay(order.getCompanyId());String tradeNo = orderRefundService.selectOutTradeNoByOrderId(Integer.parseInt(orderId));SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();parameters.put("appid", cp.getAppId());// 微信分配的公众账号IDparameters.put("mch_id", cp.getMchId());// 微信支付分配的商户号parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());// 随机字符串,不长于32位// CHSGOFBZJ520150918162021614parameters.put("out_trade_no", tradeNo);// 商户系统内部的订单号,32个字符内、可包含字母parameters.put("out_refund_no", outRefundNo);// 商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔Long refundMoney_f = (long) (refundMoney * 100);Long totalFee_f = (long) (totalFee * 100);parameters.put("total_fee", totalFee_f.toString());// 订单总金额,单位为分,不能带小数点parameters.put("refund_fee", refundMoney_f.toString());// 退款总金额,单位为分,不能带小数点parameters.put("op_user_id", cp.getMchId());// 操作员帐号, 默认为商户号String sign = PayCommonUtil.createSign("UTF-8", parameters,cp.getApiKey());parameters.put("sign", sign);String requestXML = PayCommonUtil.getRequestXml(parameters);System.out.println("requestXML_------------------->>>>>:"+ requestXML);// String result = CommonUtil.httpsRequest(ConfigUtil.REFUND_URL,// "POST", requestXML);Map<String, String> map = clientCustomSSLCall(ConfigUtil.REFUND_URL, order.getCompanyId(), cp.getMchId(),requestXML);// log.debug("result:=" + result);// Map<String, String> map = XMLUtil.doXMLParse(result);if ("FAIL".equals(map.get("return_code"))) {resultMap.put("result_flag", "fail");resultMap.put("return_code", map.get("return_code"));resultMap.put("return_msg", map.get("return_msg"));} else if ("SUCCESS".equals(map.get("return_code"))) {if ("SUCCESS".equals(map.get("result_code"))) {resultMap.put("result_flag", "success");// SUCCESS退款申请接收成功,结果通过退款查询接口查询resultMap.put("return_code", map.get("return_code"));resultMap.put("return_msg", map.get("return_msg"));resultMap.put("err_code", map.get("err_code"));resultMap.put("err_code_des", map.get("err_code_des"));} else if ("FAIL".equals(map.get("result_code"))) {resultMap.put("result_flag", "fail");// FAIL 提交业务失败resultMap.put("err_code", map.get("err_code"));resultMap.put("err_code_des", map.get("err_code_des"));}}} catch (Exception e) {System.out.println("payRefund Exception:" + e.getMessage());}return resultMap;}/*** 自定义SSL双向证书验证* * @param url* @param mchId* @param arrayToXml* @return* @throws Exception*/public Map<String, String> clientCustomSSLCall(String url,String companyId, String mchId, String arrayToXml) throws Exception {Map<String, String> doXMLtoMap = new HashMap<String, String>();KeyStore keyStore = KeyStore.getInstance("PKCS12");String cAPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/ca/" + companyId + "/apiclient_cert.p12");// System.out.println("capath:=" + cAPath);FileInputStream instream = new FileInputStream(new File(cAPath));try {keyStore.load(instream, mchId.toCharArray());} finally {instream.close();}// Trust own CA and all self-signed certsSSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();// Allow TLSv1 protocol onlySSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();try {HttpPost httpPost = new HttpPost(url);httpPost.setEntity(new StringEntity(arrayToXml, "UTF-8"));CloseableHttpResponse response = httpclient.execute(httpPost);String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");doXMLtoMap = XMLUtil.doXMLParse(jsonStr);log.debug("result jsonStr:=" + jsonStr);response.close();} finally {httpclient.close();}return doXMLtoMap;}/*** 微信退款证书是否存在* * @return*/public String isWxCAExist() {String companyId = getCompanyInfo().getCompanyId();String cAPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/ca/" + companyId + "/apiclient_cert.p12");File f = new File(cAPath);if (f.exists()) {ResponseWriteUtil.writeHTML("{\"isExist\":\"1\"}");// 存在} else {ResponseWriteUtil.writeHTML("{\"isExist\":\"0\"}");// 不存在}return null;}

PayCommonUtil.java

import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;import org.apache.log4j.Logger;public class PayCommonUtil {private static Logger log = Logger.getLogger(PayCommonUtil.class);public static String CreateNoncestr(int length) {String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";String res = "";for (int i = 0; i < length; i++) {Random rd = new Random();res += chars.indexOf(rd.nextInt(chars.length() - 1));}return res;}public static String CreateNoncestr() {String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";String res = "";for (int i = 0; i < 16; i++) {Random rd = new Random();res += chars.charAt(rd.nextInt(chars.length() - 1));}return res;}/*** @Description:sign签名* @param characterEncoding 编码格式* @param parameters 请求参数* @return* @throws UnsupportedEncodingException */public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters,String apiKey) throws UnsupportedEncodingException{StringBuffer sb = new StringBuffer();Set es = parameters.entrySet();Iterator it = es.iterator();while(it.hasNext()) {Map.Entry entry = (Map.Entry)it.next();String k = (String)entry.getKey();Object v = entry.getValue();if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}//sb.append("key=" + ConfigUtil.API_KEY);sb.append("key=" + apiKey);System.out.println("createSign-----befor_md5_sign:"+sb.toString());String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}public static String createSign4pay(String characterEncoding,SortedMap<Object,Object> parameters,String apiKey) throws UnsupportedEncodingException{StringBuffer sb = new StringBuffer();Set es = parameters.entrySet();Iterator it = es.iterator();while(it.hasNext()) {Map.Entry entry = (Map.Entry)it.next();String k = (String)entry.getKey();Object v = entry.getValue();if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + apiKey);//sb.append("key=" + ConfigUtil.APP_SECRECT);System.out.println("befor_md5_sign:"+sb.toString());String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}/*** @Description:将请求参数转换为xml格式的string* @param parameters  请求参数* @return* @throws UnsupportedEncodingException */public static String getRequestXml(SortedMap<Object,Object> parameters) throws UnsupportedEncodingException{StringBuffer sb = new StringBuffer();sb.append("<xml>");Set es = parameters.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 ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)) {sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");}else {sb.append("<"+k+">"+v+"</"+k+">");}}sb.append("</xml>");return sb.toString();}/*** @Description:返回给微信的参数* @param return_code 返回编码* @param return_msg  返回信息* @return*/public static String setXML(String return_code, String return_msg) {return "<xml><return_code><![CDATA[" + return_code+ "]]></return_code><return_msg><![CDATA[" + return_msg+ "]]></return_msg></xml>";}
}

原文地址:https://blog.csdn.net/l2000h_ing/article/details/51545992

微信线下门店二维码扫码支付和退款相关推荐

  1. 应用宝ysdk微信二维码扫码登录没有回调问题

    在更新ysdk版本的时候,发现新版本ysdk增加了微信二维码扫码登录,但是打包测试发现并没有登录回调. 接下来就开始排查了,检查了生命周期都没有问题,那问题出现在哪里呢?用ysdk提供的demo换上我 ...

  2. js调用微信利用二维码扫码登录

    js调用微信利用二维码扫码登录 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐 ...

  3. 基于MacOSX平台下的二维码扫码功能

    基于MacOSX平台下的二维码扫码功能 最近项目接受了一个需求,要在macOS的系统上实现一个二维码扫码的功能.通过多方面的学习,最终实现了要求,具体的实现步骤将会在下面展示. 核心功能模块 实现途径 ...

  4. thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现

    thinkphp5微信公众号二维码扫码关注推广二维码事件实现, 给出实现的全部方法: 获取二维码,让微信公众号跳转到以下代码的code方法即可,用户点击二维码后,通过二维码获取关注用户信息及二维码推广 ...

  5. 微信扫码登录,微信公众号生成二维码,关注登录nodejs+vue

    微信公众号生成二维码,关注后扫码登录 技术栈为nodejs+vue 有不懂的可以加我微信yizheng369 1.效果 初始: 关注后: 2.源码 此项目为前后端分离项目,前后端代码都在这个仓库里, ...

  6. 【订阅与发布机制版】spring boot高性能实现二维码扫码登录(下)

    点击上方[JAVA乐园],选择"置顶公众号",有内涵有价值的文章第一时间送达! 作者: 刘冬 来源:https://www.cnblogs.com/GoodHelper/p/865 ...

  7. MyCnCart 专业版之个人微信二维码扫码转账

    个人微信二维码扫码转账支付方式,适合于国内外没有公司实体申请正常的微信支付渠道接口,但又想通过微信转账进行收款的国内个人商户或国外个人或公司商户. 后台配置: [扩展功能]->[支付方式]-&g ...

  8. 【微信小程序】二维码跳转规则的前缀匹配是什么意思?

    前言 基础库 2.12.0 开发者工具 1.03.2008270 微信小程序的二维码跳转规则 为了方便小程序开发者更便捷地推广小程序,兼容线下已有的二维码,微信公众平台开放扫描普通链接二维码跳转小程序 ...

  9. 张小龙详细解读:微信小程序扫描二维码可进入(附实录)

    在今天举行的2017微信公开课PRO版上,腾讯微信负责人张小龙表示,微信小程序特性是:无须安装.触手可及.用完即走.无须卸载. 张小龙解答了关于小程序的疑问,并透露小程序计划于2017年1月9日正式上 ...

  10. spring boot高性能实现二维码扫码登录(上)——单服务器版

    前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...

最新文章

  1. Mybatis传递多个参数的4种方式
  2. Android 使用RxJava--基础篇
  3. (一)为什么要UML
  4. Linux之grep:过滤器按照字符进行过滤  选项规定内容样式 模式规定内容
  5. 图片中的Build 2016
  6. phpexcel常见问题的解决办法
  7. android scrollview listview显示不全
  8. java cpt_1、第十 - WEB开发进阶 - JavaSricpt 正则表达式
  9. PIC单片机(PIC16F15323)的环境搭建
  10. 机械设计:机械加工中获得工件尺寸精度的常用方法!
  11. 《TCP/IP详解卷一:协议》学习笔记
  12. vue搭配vux-ui框架
  13. 平凡之路_2022年
  14. 数仓第6篇:大数据可视化BI工具
  15. 大陆移动手机卡开通国际漫游(港澳台)
  16. 美团云:迈出云服务一大步
  17. 在CentOS7.9系统上安装N卡3060驱动、CUDA和离线升级gcc(4.8—>8.3)用以编译框架的过程记录
  18. 【Raft】分布式一致性算法Raft和zab、paxos
  19. TCP实现P2P通信
  20. ex2 ex3_他甩了我后,我Ex了我的前任

热门文章

  1. 压缩word文档大小的方法?
  2. USB数据采集卡,Labjack U12 在工业控制中的用
  3. Cell-type–specific || 单细胞文章新范式
  4. 双侧检验的p值和单侧检验_t检验的时候怎么区分是单侧检验还是双侧呢?
  5. Java 图形界面开发--图文并茂建立学生管理系统
  6. as常用固定搭配_as...as的结构和固定搭配都有什么
  7. SSL安全证书:免费的SSL证书申请渠道有哪些?
  8. 阿涛读书之——《坏血》
  9. html在js中为添加监听,使用addeventlistener为js动态创建的元素添加事件监听
  10. pythonscrapy爬虫ip代理池_Scrapy 框架插件之 IP 代理池