E企盈营销工具技术服务商 热线:4006-838-530

微信分享接口,微信小程序对接主要涉及的接口仅供参考

E企盈直播平台营销卖货系统

1.授权登录需要获取到用户的唯一标识openid以及session_key会话密钥/@Description:获取openid用户唯一标识以及session_key会话密钥/@PostMapping(“/getOpenId”)publicMapString,ObjectgetOpenId(Stringcode){MapString,Objectmap=newHashMap();//登录凭证不能为空if(null==code||code.length()==0){map.put(“errMessage”,”code不能为空!”);returnmap;}//1.向微信服务器试用登录凭证code获取session_key和openid//请求参数MapString,Stringparams=newHashMap();params.put(“appid”,StringInfo.APPID);params.put(“secret”,StringInfo.APPSECRET);params.put(“js_code”,code);params.put(“grant_type”,”authorization_code”);Stringresult=HttpClientUtil.doGet(“https://api.weixin.qq.com/sns/jscode2session?”,params);JSONObjectjson=JSON.parseObject(result);System.out.println(json);if(json!=null){//当请求成功if(json.getString(“errcode”)==null){map.put(“openid”,json.getString(“openid”));//用户的唯一标识map.put(“sessionKey”,json.getString(“session_key”));//会话密钥if(json.getString(“unionid”)!=null){map.put(“unionid”,json.getString(“unionid”));//用户在开放平台的唯一标识符}}else{//当请求不成功的时候,将错误信息map.put(“errMessage”,json.getString(“errmsg”));}}System.out.println(JSON.toJSON(map));returnmap;}2.获取AccessToken/@Description:获取AccessToken/@PostMapping(“/getAccessToken”)publicMapString,ObjectgetAccessToken(){MapString,Objectmap=newHashMap();MapString,Stringparams=newHashMap();//请求参数params.put(“grant_type”,”client_credential”);params.put(“appid”,StringInfo.APPID);params.put(“secret”,StringInfo.APPSECRET);//向微信服务端发起请求Stringresult=HttpClientUtil.doGet(“https://api.weixin.qq.com/cgi-bin/token?”,params);//将结果转为json对象JSONObjectjson=JSON.parseObject(result);if(json!=null){if(json.getString(“errcode”)==null){map.put(“accessToken”,json.getString(“access_token”));map.put(“expiresIn”,json.getString(“expires_in”));}else{map.put(“errMessage”,json.getString(“errmsg”));}}returnmap;}3.微信付款/支付接口@paramopenid用户的唯一标识@parambody1商品描述信息@paramtotal_fee1金额@return/@RequestMapping(“/WeiXinPay”)public@ResponseBodyObjectWeiXinPay(Stringopenid,Stringbody1,inttotal_fee1){try{Stringappid=userService.getUser().getAppid();//微信小程序–》“开发者ID”Stringmch_id=userService.getUser().getMchId();//商户号,将该值赋值给partnerStringkey=userService.getUser().getMchKey();//微信支付商户平台登录)–》“API安全”–》“API密钥”–“设置密钥”(设置之后的那个值就是partnerkey,32位)LOGGER.debug(appid);LOGGER.debug(mch_id);LOGGER.debug(key);Stringbody=body1;//描述inttotal_fee=total_fee1;//支付金额Datedata=newDate();Stringnotify_url=”https://www.baidu.com/weixinpay/notify”;//自己发布在公网回调链接,不然无法访问Stringout_trade_no=IdUtils.genOrderName();//IdUtils–见下面LOGGER.debug(out_trade_no);MapObject,Objectmap=WeiXinAtcion.me.weixinPlay(mch_id,appid,key,openid,total_fee,out_trade_no,notify_url,body);returnmap;}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnTTResult.fail();}6.微信退款/@paramrequest@paramdatabase@paramout_trade_no@paramall_total_fee@paramrefund_fee@return/@RequestMapping(“/WeiXinRefund”)public@ResponseBodyObjectWeiXinRefund(HttpServletRequestrequest,@RequestParam(“out_trade_no”)Stringout_trade_no,@RequestParam(“all_total_fee”)intall_total_fee,@RequestParam(“refund_fee”)intrefund_fee){try{LOGGER.debug(“订单号是—“+out_trade_no);LOGGER.debug(“总金额—“+all_total_fee);LOGGER.debug(“剩余金额—“+refund_fee);//out_trade_no退款订单号//all_total_fee订单金额//refund_fee输0all_total_fee-refund_fee=退款的金额Stringappid=userService.getUser().getAppid();//微信小程序–》“开发者ID”Stringmch_id=userService.getUser().getMchId();//商户号,将该值赋值给partnerStringkey=userService.getUser().getMchKey();//微信支付商户平台登录)–》“API安全”–》“API密钥”–“设置密钥”(设置之后的那个值就是partnerkey,32位)MapString,Stringrefundmap=WeiXinAtcion.me.wechatRefund(request,mch_id,appid,key,out_trade_no,all_total_fee,refund_fee,userService.getUser().getCert());if(refundmap.get(“return_code”).equals(“SUCCESS”)){if(refundmap.get(“result_code”).equals(“FAIL”)){LOGGER.debug(“退款失败:原因”+refundmap.get(“err_code_des”));}else{LOGGER.debug(“退款成功”);returnTTResult.ok();}}else{LOGGER.debug(“退款失败:原因”+refundmap.get(“return_ms”));returnTTResult.fail();}}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnTTResult.fail();}5.将调用微信付款、退款封装importjava.io.BufferedOutputStream;importjava.io.BufferedReader;importjava.io.ByteArrayInputStream;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.UnsupportedEncodingException;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.SortedMap;importjava.util.TreeMap;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importcom.mj.mall.user.service.UserService;importcom.mj.pay.util.WXUtil;@ControllerpublicclassWeiXinAtcion{publicstaticfinalWeiXinAtcionme=newWeiXinAtcion();privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(WeiXinAtcion.class);@AutowiredprivateUserServiceuserService;/退款/publicstaticMapString,StringwechatRefund(HttpServletRequestrequest,Stringmch_id,Stringappid,Stringkey,Stringout_trade_no,intall_total_fee,intrefund_fee,Stringapiclient_certLocationp12)throwsException{SortedMapObject,ObjectpackageParams=newTreeMapObject,Object();LOGGER.debug(“走到退款函数了”);packageParams.put(“appid”,appid);packageParams.put(“mch_id”,mch_id);packageParams.put(“op_user_id”,mch_id);packageParams.put(“nonce_str”,WXUtil.generate());packageParams.put(“out_trade_no”,out_trade_no);packageParams.put(“out_refund_no”,WXUtil.generate());packageParams.put(“total_fee”,String.valueOf(all_total_fee));packageParams.put(“refund_fee”,String.valueOf(all_total_fee-refund_fee));Stringsign=WXUtil.createSign_ChooseWXPay(“UTF-8”,packageParams,key);packageParams.put(“sign”,sign);StringXML=WXUtil.getRequestXml(packageParams);LOGGER.debug(“退款函数结束,接下来执行退款操作”);returnWXUtil.doRefund(request,”https://api.mch.weixin.qq.com/secapi/pay/refund”,XML,mch_id,apiclient_certLocationp12);}/生成微信订单/publicSortedMapObject,ObjectweixinPlay(Stringmch_id,Stringappid,Stringkey,Stringopenid,inttotal_fee,Stringout_trade_no,Stringnotify_url,Stringbody)throwsUnsupportedEncodingException,DocumentException{SortedMapObject,ObjectpaymentPo=newTreeMapObject,Object();paymentPo.put(“appid”,appid);paymentPo.put(“mch_id”,mch_id);paymentPo.put(“nonce_str”,WXUtil.generate());paymentPo.put(“body”,body);paymentPo.put(“out_trade_no”,out_trade_no);paymentPo.put(“total_fee”,String.valueOf(total_fee));paymentPo.put(“spbill_create_ip”,”120.77.171.156″);//此处是公网ippaymentPo.put(“notify_url”,notify_url);paymentPo.put(“trade_type”,”JSAPI”);paymentPo.put(“openid”,openid);Stringsign=WXUtil.createSign_ChooseWXPay(“UTF-8”,paymentPo,key);paymentPo.put(“sign”,sign);Stringparam=WXUtil.getRequestXml(paymentPo);;Stringrequest=WXUtil.httpRequest(“https://api.mch.weixin.qq.com/pay/unifiedorder”,”POST”,param);MapString,Stringmap=newHashMapString,String();//将解析结果存储在HashMap中InputStreamin=newByteArrayInputStream(request.getBytes());SAXReaderreader=newSAXReader();//读取输入流Documentdocument=reader.read(in);Elementroot=document.getRootElement();//得到xml根元素@SuppressWarnings(“unchecked”)//得到根元素的所有子节点ListElementelementList=root.elements();for(Elementelement:elementList){map.put(element.getName(),element.getText());}SortedMapObject,Objectresult=newTreeMapObject,Object();LOGGER.debug(“第一次签名返回码”+map.get(“return_code”));LOGGER.debug(“第一次签名返回结果”+map.get(“return_msg”));//第一次签名成功if(map.get(“return_code”).equals(“SUCCESS”)){//业务结果StringnonceStr=WXUtil.generate();LongtimeStamp=System.currentTimeMillis()/1000;SortedMapObject,Objectparams=newTreeMapObject,Object();params.put(“appId”,appid);params.put(“nonceStr”,nonceStr);params.put(“package”,”prepay_id=”+map.get(“prepay_id”));params.put(“signType”,”MD5″);params.put(“timeStamp”,timeStamp);//第二次签名成功LOGGER.debug(“开始第二次签名”);StringpaySign=WXUtil.createSign_ChooseWXPay(“UTF-8”,params,key);result.put(“paySign”,paySign);result.put(“timeStamp”,timeStamp+””);result.put(“nonceStr”,nonceStr);result.put(“out_trade_no”,paymentPo.get(“out_trade_no”));result.put(“package”,”prepay_id=”+map.get(“prepay_id”));result.put(“return_code”,”SUCCESS”);}else{result.put(“return_code”,”Fail”);result.put(“return_msg”,map.get(“return_msg”));}returnresult;}/支付成功回调函数/@RequestMapping(“/weixinpay/notify”)publicvoidweixinpay_notify(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{InputStreaminputStream;StringBuffersb=newStringBuffer();inputStream=request.getInputStream();Strings;BufferedReaderin=newBufferedReader(newInputStreamReader(inputStream,”UTF-8″));while((s=in.readLine())!=null){sb.append(s);}in.close();inputStream.close();MapString,Stringm=newHashMapString,String();m=WXUtil.doXMLParse(sb.toString());SortedMapObject,ObjectpackageParams=newTreeMapObject,Object();Iteratorit=m.keySet().iterator();while(it.hasNext()){Stringparameter=(String)it.next();StringparameterValue=m.get(parameter);Stringv=””;if(null!=parameterValue){v=parameterValue.trim();}packageParams.put(parameter,v);}//Stringkey=””;//秘钥Stringkey=userService.getUser().getMchKey();//秘钥if(WXUtil.isTenpaySign(“UTF-8″,packageParams,key)){StringresXml=””;if(“SUCCESS”.equals((String)packageParams.get(“result_code”))){//得到返回的参数Stringopenid=(String)packageParams.get(“openid”);Stringtransaction_id=(String)packageParams.get(“transaction_id”);Stringout_trade_no=(String)packageParams.get(“out_trade_no”);Stringtotal_fee=(String)packageParams.get(“total_fee”);Floatfee=Float.parseFloat(total_fee)/100;//这里可以写你需要的业务System.out.println(“openid—-“+openid);System.out.println(“transaction_id—-“+transaction_id);System.out.println(“out_trade_no—-“+out_trade_no);System.out.println(“total_fee—-“+total_fee);System.out.println(“fee—-“+fee);resXml=”xml”+”return_code![CDATA[SUCCESS]]/return_code”+”return_msg![CDATA[OK]]/return_msg”+”/xml”;BufferedOutputStreamout=newBufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();}else{System.out.println(“回调失败”);}}else{System.out.println(“回调失败”);}}}8.WXUtil工具类importjava.io.BufferedReader;importjava.io.ByteArrayInputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.UnsupportedEncodingException;importjava.net.HttpURLConnection;importjava.net.URI;importjava.net.URL;importjava.security.KeyStore;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importjava.util.Set;importjava.util.SortedMap;importjava.util.UUID;importjavax.net.ssl.SSLContext;importjavax.servlet.http.HttpServletRequest;importorg.apache.http.HttpEntity;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.conn.ssl.SSLConnectionSocketFactory;importorg.apache.http.conn.ssl.SSLContexts;importorg.apache.http.entity.StringEntity;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;importorg.jdom.Document;importorg.jdom.Element;importorg.jdom.JDOMException;importorg.jdom.input.SAXBuilder;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassWXUtil{privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(WXUtil.class);/随机字符串@return/publicstaticStringgenerate(){returnUUID.randomUUID().toString().trim().replaceAll(“-“,””);}/解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。/publicstaticMapdoXMLParse(Stringstrxml)throwsJDOMException,IOException{strxml=strxml.replaceFirst(“encoding=”.””,”encoding=”UTF-8″”);if(null==strxml||””.equals(strxml)){returnnull;}Mapm=newHashMap();InputStreamin=newByteArrayInputStream(strxml.getBytes(“UTF-8″));SAXBuilderbuilder=newSAXBuilder();Documentdoc=builder.build(in);Elementroot=doc.getRootElement();Listlist=root.getChildren();Iteratorit=list.iterator();while(it.hasNext()){Elemente=(Element)it.next();Stringk=e.getName();Stringv=””;Listchildren=e.getChildren();if(children.isEmpty()){v=e.getTextNormalize();}else{v=WXUtil.getChildrenText(children);}m.put(k,v);}//关闭流in.close();returnm;}/获取子结点的xml@paramchildren@returnString/publicstaticStringgetChildrenText(Listchildren){StringBuffersb=newStringBuffer();if(!children.isEmpty()){Iteratorit=children.iterator();while(it.hasNext()){Elemente=(Element)it.next();Stringname=e.getName();Stringvalue=e.getTextNormalize();Listlist=e.getChildren();sb.append(“”+name+””);if(!list.isEmpty()){sb.append(WXUtil.getChildrenText(list));}sb.append(value);sb.append(“/”+name+””);}}returnsb.toString();}/将请求参数转换为xml格式的string字符串,微信服务器接收的是xml格式的字符串/publicstaticStringgetRequestXml(SortedMapObject,Objectparameters){StringBuffersb=newStringBuffer();sb.append(“xml”);SetEntryObject,Objectes=parameters.entrySet();IteratorEntryObject,Objectit=es.iterator();while(it.hasNext()){Map.EntryObject,Objectentry=(Map.EntryObject,Object)it.next();Stringk=(String)entry.getKey();Stringv=(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”);returnsb.toString();}/sign签名,必须使用MD5签名,且编码为UTF-8/publicstaticStringcreateSign_ChooseWXPay(StringcharacterEncoding,SortedMapObject,Objectparameters,Stringkey){StringBuffersb=newStringBuffer();SetEntryObject,Objectes=parameters.entrySet();IteratorEntryObject,Objectit=es.iterator();while(it.hasNext()){Map.EntryObject,Objectentry=(Map.EntryObject,Object)it.next();Stringk=(String)entry.getKey();Objectv=entry.getValue();if(null!=v&&!””.equals(v)&&!”sign”.equals(k)&&!”key”.equals(k)){sb.append(k+”=”+v+”&”);}}/支付密钥必须参与加密,放在字符串最后面/sb.append(“key=”+key);Stringsign=MD5Util.MD5Encode(sb.toString(),characterEncoding).toUpperCase();returnsign;}/@paramrequestUrl请求地址@paramrequestMethod请求方法@paramoutputStr参数/publicstaticStringhttpRequest(StringrequestUrl,StringrequestMethod,StringoutputStr){//创建SSLContextStringBufferbuffer=null;try{URLurl=newURL(requestUrl);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestMethod(requestMethod);conn.setDoOutput(true);conn.setDoInput(true);conn.connect();//往服务器端写内容if(null!=outputStr){OutputStreamos=conn.getOutputStream();os.write(outputStr.getBytes(“utf-8″));os.close();}//读取服务器端返回的内容InputStreamis=conn.getInputStream();InputStreamReaderisr=newInputStreamReader(is,”utf-8″);BufferedReaderbr=newBufferedReader(isr);buffer=newStringBuffer();Stringline=null;while((line=br.readLine())!=null){buffer.append(line);}}catch(Exceptione){e.printStackTrace();}returnbuffer.toString();}publicstaticStringurlEncodeUTF8(Stringsource){Stringresult=source;try{result=java.net.URLEncoder.encode(source,”UTF-8”);}catch(UnsupportedEncodingExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnresult;}/退款/publicstaticMapString,StringdoRefund(HttpServletRequestrequest,Stringurl,Stringdata,Stringpartner,Stringapiclient_certLocation)throwsException{//p12证书的位置//微信公众平台:“微信支付”–》“商户信息”–》“交易数据”–》“详情请登录微信支付商户平台查看”(登录)–》“API安全”–》“API证书”–》“下载证书”//下载证书后将apiclient_cert.p12放在src目录下面(出于安全考虑,请自行下载自己的证书)KeyStorekeyStore=KeyStore.getInstance(“PKCS12”);Stringurl2=request.getSession().getServletContext().getRealPath(“/”)+”images/cert/”+apiclient_certLocation;LOGGER.debug(“url2—“+url2);Filefile=newFile(url2);LOGGER.debug(“new了一个file”);FileInputStreaminstream=newFileInputStream(file);//P12文件目录LOGGER.debug(“退款路径结束”);try{keyStore.load(instream,partner.toCharArray());}finally{instream.close();}SSLContextsslcontext=SSLContexts.custom().loadKeyMaterial(keyStore,partner.toCharArray()).build();SSLConnectionSocketFactorysslsf=newSSLConnectionSocketFactory(sslcontext,newString[]{“TLSv1”},null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClienthttpclient=HttpClients.custom().setSSLSocketFactory(sslsf).build();try{HttpPosthttpost=newHttpPost(url);//设置响应头信息httpost.addHeader(“Connection”,”keep-alive”);httpost.addHeader(“Accept”,”/”);httpost.addHeader(“Content-Type”,”application/x-www-form-urlencoded;charset=UTF-8″);httpost.addHeader(“Host”,”api.mch.weixin.qq.com”);httpost.addHeader(“X-Requested-With”,”XMLHttpRequest”);httpost.addHeader(“Cache-Control”,”max-age=0″);httpost.addHeader(“User-Agent”,”Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0)”);httpost.setEntity(newStringEntity(data,”UTF-8″));CloseableHttpResponseresponse=httpclient.execute(httpost);try{HttpEntityentity=response.getEntity();StringjsonStr=EntityUtils.toString(response.getEntity(),”UTF-8″);EntityUtils.consume(entity);returnWXUtil.doXMLParse(jsonStr);}finally{response.close();}}finally{httpclient.close();}}/是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。/publicstaticbooleanisTenpaySign(StringcharacterEncoding,SortedMapObject,ObjectpackageParams,StringAPI_KEY){StringBuffersb=newStringBuffer();Setes=packageParams.entrySet();Iteratorit=es.iterator();while(it.hasNext()){Map.Entryentry=(Map.Entry)it.next();Stringk=(String)entry.getKey();Stringv=(String)entry.getValue();if(!”sign”.equals(k)&&null!=v&&!””.equals(v)){sb.append(k+”=”+v+”&”);}}sb.append(“key=”+API_KEY);//算出摘要Stringmysign=MD5Util.MD5Encode(sb.toString(),characterEncoding).toLowerCase();StringtenpaySign=((String)packageParams.get(“sign”)).toLowerCase();//System.out.println(tenpaySign+””+mysign);returntenpaySign.equals(mysign);}}9.IdUtils工具类importjava.util.Random;publicclassIdUtils{/图片名生成/publicstaticStringgenImageName(){//取当前时间的长整形值包含毫秒longmillis=System.currentTimeMillis();//longmillis=System.nanoTime();//加上三位随机数Randomrandom=newRandom();intend3=random.nextInt(999);//如果不足三位前面补0Stringstr=millis+String.format(“%03d”,end3);returnstr;}/订单号生成@return/publicstaticStringgenOrderName(){//取当前时间的长整形值包含毫秒longmillis=System.currentTimeMillis();//longmillis=System.nanoTime();//加上六位随机数Randomrandom=newRandom();longend6=random.nextInt(999999);//如果不足三位前面补0Stringstr=millis+String.format(“%06d”,end6);returnstr;}}10.MD5Util工具类importjava.security.MessageDigest;publicclassMD5Util{privatestaticStringbyteArrayToHexString(byteb[]){StringBufferresultSb=newStringBuffer();for(inti=0;ib.length;i++)resultSb.append(byteToHexString(b[i]));returnresultSb.toString();}privatestaticStringbyteToHexString(byteb){intn=b;if(n0)n+=256;intd1=n/16;intd2=n%16;returnhexDigits[d1]+hexDigits[d2];}publicstaticStringMD5Encode(Stringorigin,Stringcharsetname){StringresultString=null;try{resultString=newString(origin);MessageDigestmd=MessageDigest.getInstance(“MD5″);if(charsetname==null||””.equals(charsetname))resultString=byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString=byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));}catch(Exceptionexception){}returnresultString;}privatestaticfinalStringhexDigits[]={“0″,”1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”a”,”b”,”c”,”d”,”e”,”f”};}

E企盈系统专业开发:直播系统,直播平台系统源码,小程序,商城版小程序,分销小程序,小程序定制,微分销,微商,微信分销,微信分销商城,微信分销系统,微信分销管理,微信分销平台,微商代理系统,E企盈是专业的直播小,E企盈是专业的直播小程序,公众号分销系统,营销系统,社群私域流量卖货系统技术开发商,热线:4006-838-530
赞(0) 打赏
未经允许不得转载:E企盈小程序开发-热线:4006-838-530 » 微信分享接口,微信小程序对接主要涉及的接口仅供参考
分享到: 更多 (0)
E企盈小程序直播营销卖货系统
E企盈直播平台营销卖货系统

评论 抢沙发

E企盈小程序开发

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏