微信小程序制作
当前位置:网站首页 > 公众号热文 > 对微信公众号进行开发需要掌握哪些技术呢 返回列表

对微信公众号进行开发需要掌握哪些技术呢

作者:admin 时间:2019-01-13 浏览量:958

对微信公众号进行开发需要掌握哪些技术呢?微信公众号是每一家互联网公司都无法避开的一个话题,尤其要对一些微信公众平台进行相关功能的,成为现在好多互联网公司的新的焦点和新宠,还有小程序的需求也在进一步的加大,面对这么大的市场需求,让好多互联网公司的老板们有些按耐不住,都想像这些开发行业进军,专门西安做微信公众号西安微信小程序开发了,但是话有说回来,开发的工作毕竟是有限的,并没有我们想象的那么多,作为网络公司的技术要想涉足开发行业,需要掌握哪些技术和基础呢?现如今,微信已经不再只承担着交流沟通、娱乐大众的功能,微信公众号的推出将微信逐渐转变成个人、商家、企业单位用来营销的重要工具。而微信推出的公众号开发功能,为我们码农带来很大的方便,让我们创造出更多的可能性。今天,就结合自己的些许经验,跟大家分享下有关公众号开发的操作。而对于大部分的开发者来说可能已经很熟悉西安微信公众号开发,所以这篇入门篇适用于初始了解和做公众号开发的同学。


第一章:开始开发(准备阶段)

1. 接入指南

接入微信公众平台开发,开发者需要按照如下步骤完成:

·填写服务器配置
说明:URL是开发者用来接收微信消息和事件的接口URL,该接口尽量写成两个请求方式,1:get请求,用于验证如下地址有效性,2:post请求, 用于接收消息和事件,Token 可以随便定义用于验证接口签名有效性, EncodingAESKey是加密的密钥,下面加密方式选兼容模式或者安全模式的时候开发者可根据该密钥对数据进行加解密

·验证如上URL服务器地址的有效性

根据官方文档的说明,微信验证接口会带下面几个参数
插播福利

1.我最近把各个互联网领悟的经典技术书和资源整理了一下,涵盖34个领域,143家公司的面试真题,以及常见互联网技术领悟经典书和面试书和知名互联网公司校招薪资汇总表。

获取方式:关注本公众号,回复“干货”。
2.技术交流群:在公众号后台回复”入群”。

服务端接口接收到这些参数后进行签名验证,如下代码:

exports.check = function (req, res, next) {

// 在这里验证签名

var signature = req.query['signature'],

timestamp = req.query['timestamp'],

nonce = req.query['nonce'],

echostr = req.query['echostr'];

var sha1 = crypto.createHash('sha1'),

sha1Str = sha1.update([config.weixin.token, timestamp, nonce].sort().join('')).digest('hex');

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end((sha1Str === signature) ? echostr : '');

return res;

};

·依据接口文档实现业务逻辑

这里就是根据业务需求,进行接口调用的编程了,下面我会一一介绍

2. 获取access_token

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。该接口一天只能请求2000次,开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

如下代码事例:

exports.get_token = function (fn) {

redis.get(weixin_token, function (err, token_str) {

if (token_str) {

return fn(err, JSON.parse(token_str));

} else {

request.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + app_id + "&secret=" + app_secret, function (err, response, body) {

if (JSON.parse(body).errcode == 45009) {

return fn(err)

} else {

redis.set(weixin_token, body, function (err) {

redis.expire(weixin_token, 7000, function () {

return fn(err, JSON.parse(body));

};

上面的事例代码中,首先我会从redis中获取到access_token,因为我最初获取access_token的时候写入到redis中了,官方给的有效时间是7200秒,我放在redis中的有效时间是7000秒,所以我这里的token不会过期,过期后会重新调用接口获取并写入redis

第二章:自定义菜单

实例代码中只写入创建接口的调用,查询和删除就不举例了。

·自定义菜单创建接口

如下代码事例以及说明:

get_token(function(err, obj){

var access_token = obj.access_token;

request.post({

url: "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token,

json:  {

"button":[

{

"type":"view",

"name":"工作台",

"url":"http://worktile.com"

},

{

"name":"解决方案",

"sub_button": [

{

"type":"view",

"name":"研发",

"url":"https://pro.worktile.com/solution/dev"

}

{

"type":"view",

"name":"最佳实践",

"url":"https://worktile.com/can"

}

{

"name":"更多",

"sub_button":[

{

"type":"view",

"name":"下载应用",

"url":"http://a.app.qq.com/o/simple.jsp?pkgname=com.worktile"

},

{

"type":"click",

"name":"合作",

"key":"work_together"

}]



}, function(err, res, body){

console.log(body)

}

这里get_token方法就是上面第一章中#获取access_token ,而且我这里是作为脚本执行的,这样方便以后随便修改自定义菜单内容

·自定义菜单查询接口

http请求方式:GET

https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN

·自定义菜单删除接口

http请求方式:GET

https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

第三章:消息管理

·接收消息

接收的消息分为普通消息和事件消息,统一有第一章中接入指南填写的RUL接口来接收处理

exports.receive = function (req, res, next) {

// 在这接收消息

var xml = '';

req.setEncoding('utf8');

req.on('data', function (chunk) {

xml += chunk;

});

req.on('end', function () {

toJSON(xml, res);

});

};

说明:receive方法就是接收用户发给公众号的消息,内容格式是xml,toJSON就是我解析xml为json的方法,如下

//解析器

var toJSON = function (xml, res) {

var msg = {};

xml2js.parseString(xml, function (err, result) {

var data = result.xml;

msg.ToUserName = data.ToUserName[0];

msg.FromUserName = data.FromUserName[0];

msg.CreateTime = data.CreateTime[0];

msg.MsgType = data.MsgType[0];

switch (msg.MsgType) {

case 'text' :

msg.Content = data.Content[0];

msg.MsgId = data.MsgId[0];

res.setHeader("Content-Type", "text/plain");

res.send("");

return handle_text(msg, res);

break;

case 'image' :

msg.PicUrl = data.PicUrl[0];

msg.MsgId = data.MsgId[0];

msg.MediaId = data.MediaId[0];

res.setHeader("Content-Type", "text/plain");

res.send("");

break;

case 'voice' :

msg.MediaId = data.MediaId[0];

msg.Format = data.Format[0];

msg.MsgId = data.MsgId[0];

res.setHeader("Content-Type", "text/plain");

res.send("");

break;

case 'video' :

msg.MediaId = data.MediaId[0];

msg.ThumbMediaId = data.ThumbMediaId[0];

msg.MsgId = data.MsgId[0];

res.setHeader("Content-Type", "text/plain");

res.send("");

break;

case 'location' :

msg.Location_X = data.Location_X[0];

msg.Location_Y = data.Location_Y[0];

msg.Scale = data.Scale[0];

msg.Label = data.Label[0];

msg.MsgId = data.MsgId[0];

res.setHeader("Content-Type", "text/plain");

res.send("");

break;

case 'link' :

msg.Title = data.Title[0];

msg.Description = data.Description[0];

msg.Url = data.Url[0];

msg.MsgId = data.MsgId[0];

res.setHeader("Content-Type", "text/plain");

res.send("");

break;

case 'event' :

msg.Event = data.Event[0];

if (data.EventKey && _.isArray(data.EventKey) && data.EventKey.length > 0) {

msg.EventKey = data.EventKey[0];

return handle_event(msg, res);

}

res.setHeader("Content-Type", "text/plain");

res.send("");

break;

}

});

};

说明:这里我用户发过来的消息xml解释称json数据msg, 根据不同的类型做不同的处理,如上文本,图片,音频,视频,链接,事件等消息

var handle_text = function (msg, res) {

var text = msg.Content;

if(text.trim() == "研发"){

var data = {

"touser":msg.FromUserName,

"msgtype":"news",

"news":{

"articles": [

{

"title":"重磅!Worktile 推出研发管理解决方案",

"description":"项目进度清晰掌握,快速跟进产品Bug,多维度统计报表,文件文档有序管理",

"url":"https://pro.worktile.com/solution/dev",

"picurl":"https://wt-prj.oss.aliyuncs.com/b327e3a5666048279583e8e026ac6b87/4bb6e53c-8516-4466-b278-4f3b596e46db.png"

sendMessageToUser(data);

}else if(text.trim() == "电商"){

var data = {

"touser":msg.FromUserName,

"msgtype":"news",

"news":{

"articles": [

{

"title":"Worktile 『电商解决方案』上线!",

"description":"降低运营成本,提高团队效率。日常运营、大促筹备、售后跟踪、研发管理……尽在掌握。",

"url":"https://pro.worktile.com/solution/ecommerce",

"picurl":"https://cdn.worktile.com/solution/ecommerce.png"

sendMessageToUser(data);

说明:这是对文本消息的处理,如上,如果接收到 研发 字样的消息,公众号会给该用户发送一条新闻消息

var handle_event = function (msg, res) {

console.log("weixin receive message ===", msg)

if (msg.Event == 'CLICK' && msg.EventKey == 'work_together') {

var text = "Hello,谢谢对 Worktile 的关注啦,请访问worktile官方网站了解。。。。。";

var data = {

touser : msg.FromUserName,

msgtype: "text",

text   : {

content: text

sendMessageToUser(data);

说明:这是对事件消息的处理,如上,如果接收到 msg.Event == 'CLICK' && msg.EventKey == 'work_together' 事件的消息,公众号会给该用户发送一条文本消息,当然事件消息有很多,如:subscribe关注公众号消息,unsubscribe取消关注,扫描带参数二维码事件,还有如上说的自定义菜单事件, 上报地理位置事件等

var sendMessageToUser = function ( data) {

get_token(function (err, obj) {

request.post({

url    : "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + obj.access_token,

headers: {"Content-Type": "application/json"},

json   : data

}, function (err, res, body) {

console.log("sendmessage....", body)

这个发放就是调用微信接口给用户发送消息,那接下来咱们就看下发送消息

插播福利

1.我最近把各个互联网领悟的经典技术书和资源整理了一下,涵盖34个领域,143家公司的面试真题,以及常见互联网技术领悟经典书和面试书和知名互联网公司校招薪资汇总表。

获取方式:关注本公众号,回复“干货”。
2.技术交流群:在公众号后台回复”入群”。
发送消息

发送消息分为,发送被动消息,发送客服消息,发送模版消息

1.被动消息如上接收消息后根据消息判断发送给用户的消息即是被动消息

2.客服消息,是公众号收到用户来的消息客服根据内容回复给用户的消息

如果用户并没有给公众号发消息,此时客服是无法给用户发送消息的,这是微信做的一个限制

如下代码:

wtutil.get_token(function (err, obj) {

//var text = "你好,这是一条消息,多谢支持...";

//var data = {

//    touser : "oy4hbwbd0MOMmn8aUtQWMcNxs8PI",

//    msgtype: "text",

//    text   : {

//        content: text

//    }

//};

var data = {

touser : "oy4hbwbd0MOMmn8aUtQWMcNxs8PI",

msgtype: "image",

"image":

{

"media_id":"ZqQGrsR6ivb273zLApNfkEdAP3UI8nHJTJ9ekelfJ8OhKUF6UG-o6YbOBv4uWf4R"

}

};

request.post({

url    : "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + obj.access_token,

headers: {"Content-Type": "application/json"},

json   : data

}, function (err, res, body) {

console.log(body);

})

});

msgtype: 是消息类型,上面注释掉的是文本消息,下面是个图片消息,touser是用户的openid,这里我只是取过来直接使用的,这里跟上面接收消息后处理给用户发消息有写重复,就不多介绍了

3.模版消息大家肯定很熟悉,比如Worktile的微信公众号接收任务消息通知,这样的消息就是模版消息
模版消息相对来说复杂一下,首先要从公众号添加或者申请消息模版,如下图

那么有了消息模版之后就可以拿到模版ID,然后给用户发送模版消息了

get_token(function (err, obj) {

var data = {

"touser"     : "oy4hbwbd0MOMmn8aUtQWMcNxs8PI",

"template_id": "z6yV_lOIAM-LQbsrG-B3hTQvwt8_4Y3wVU2PH9UW16c",

"url"        : "https://worktile.com",

"topcolor"   : "#FF00FF",

"data"       : {

"first"   : {

"value": "测试哈哈哈,颜色可以自定义",

"color": "#33FF00"

},

"one": {

"value": "one",

"color": "#173177"

},

"two": {

"value": "two",

"color": "#FF0033"

},

"three": {

"value": "three",

"color": "#173177"

},

"remark"  : {

"value": "remark,了解更多详情,关注我。。。。",

"color": "#33FF00"

request.post({

url    : "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + obj.access_token,

headers: {"Content-Type": "application/json"},

json   : data

}, function (err, res, body) {

console.log(body, "----")

})

});

需要说明的是参数中data里面的key(first, one, two,three, remark)是模版中定义的,这里需要根据模版内容来写,还有可以设置每个字段的颜色值等属性

到此消息管理这部分已经说的差不多了,咱们继续介绍。。。

第四章:微信网页开发

这个章节跟前面几章不同,前面几章介绍的是公众号开发的一些东西,这个章节介绍的是网页开发,主要针对h5应用或者是页面的开发,Worktile微信版就是微信网页开发完成的,下面咱们一步步的介绍。

·微信网页授权

微信网页授权采用的是Oauth2.0的授权方式:

第一步:访问如下链接获取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

redirect_uri是你h5地址,授权成功后会把code加入到地址上,类似于:https://weixin.worktile.com?code=xxx这样

第二步:通过code换取网页授权access_token

请求接口(get请求)

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

返回的结果如下

{ "access_token":"ACCESS_TOKEN",

"expires_in":7200,

"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID",

"scope":"SCOPE" }

access_token是用户授权的token,openid是用户对于该公众号的唯一标示,refresh_token:可以调用刷新token的接口获取最新的token

第三步:获取用户信息(需scope为 snsapi_userinfo)

请求接口(get请求)

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

通过以上3个步骤就可以获取用户的信息,进行用户的管理操作了

·微信JS-SDK

网页开发中,有时候我们会自定义分享的内容,图片,音频,视频的上传,下载,地理位置,摇一摇周边,扫码,支付等的功能,这时候就需要js-sdk的开发了,下面简单介绍下js-sdk的使用,读者还可以查看官方开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_CN

·绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

·引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

如需使用摇一摇周边功能,请引入http://res.wx.qq.com/open/js/jweixin-1.1.0.js

·通过config接口注入权限验证配置

如下代码需要在网页中配置

wx.config({

debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: '', // 必填,公众号的唯一标识

timestamp: , // 必填,生成签名的时间戳

nonceStr: '', // 必填,生成签名的随机串

signature: '',// 必填,签名,见附录1

jsApiList: [] // 必填,需要使用的JS接口列表

});

`如上代码中的timestamp, nonceStr, signature需要服务端做好签名返回给页面,这里可以使用异步调用的方式,如下为服务端签名代码`

var sign = function (jsapi_ticket, url) {

var ret = {

jsapi_ticket: jsapi_ticket,

nonceStr: createNonceStr(),

timestamp: createTimestamp(),

url: url

};

var string = raw(ret);

jsSHA = require('jssha');

shaObj = new jsSHA(string, 'TEXT');

ret.signature = shaObj.getHash('SHA-1', 'HEX');

return ret;

};

ret就是我们需要的签名结果,其中jsapi_ticket是调用ticket接口获取的,官方文档中也有说明https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token= access_token&type=jsapi, rul是获取签名的当前网页地址, nonceStr:随机字符串,timestamp:当前10位时间戳

var raw = function (args) {

var keys = Object.keys(args);

keys = keys.sort()

var newArgs = {};

keys.forEach(function (key) {

newArgs[key.toLowerCase()] = args[key];

});

var string = '';

for (var k in newArgs) {

string += '&' + k + '=' + newArgs[k];

}

string = string.substr(1);

return string;

};

这个方法是对签名对象的一个字符串格式化算法

·通过ready接口处理成功验证

wx.ready(function(){

// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。

});

·调用接口

根据config里面 jsApiList的配置可以调用js-sdk的接口,如分享朋友圈,分享微信好友等。。。

wx.onMenuShareTimeline({

title: '', // 分享标题

link: '', // 分享链接

imgUrl: '', // 分享图标

success: function () {

// 用户确认分享后执行的回调函数

},

cancel: function () {

// 用户取消分享后执行的回调函数

}

});

这是一个分享到朋友圈的接口,可以自定义标题,自定义链接,自定义图标

如果想调用更多的js-sdk的接口可以参考官方文档进行开发:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN

·微信网页开发样式库

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784134&token=&lang=zh_CN

·微信web开发者工具

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140&token=&lang=zh_CN

以上就是微信公众号开发的一些内容,算是入门篇。其实关于微信的开发还有很多可以做的事情,而且随着需求越来越多,技术越来越完善,相信之后关于微信的开发一定还会有更多惊喜!

联系方式:18066528545   029-89298792

阅读过此文章的读者,还阅读过下面的文章

  • 小程序与原生APP那个好?下面我们就来一起了解一下小程序与原生APP那个好。以下是所整理的小程序与原生App的内容,希望对你有所帮助。

    小程序的优点:

    基于微信平台开发,享受微信自带的流量,这个优点最大
    无需安装,只要打开微信就能用,不占手机内存,体验好
    开发周期段,一般最多一个月就可以上线完成
    开发所需的资金少,所需资金是开发原生APP的一半不到
    小程序名称是唯一的,在微信的搜索里权重很高
    容易上手,只要之前有HTML+CSS+JS基础知识,写小程序基本没有大问题
    基本不需要考虑兼容性问题,只要微信可以正常运行的机器,就可以运行小程序
    发布,审核高效,基本上午发布审核,下午就审核通过,升级简单,支持灰度发布
    开发文档完善,社区活跃
    支持插件式开发,一些基本功能可以开发成插件,供多个小程序使用
    小程序的缺点:
    局限性很强(比如页面大小不能超过1M,不能打开超过5个层级的页面,样式单一,小程序的部分组件已经是成型的- 了,样式不能修改,比如幻灯片,导航)只能依赖于微信依托与微信,无法开发后台管理功能
    不利于推广,推广面窄,不能分享朋友圈,只能分享给朋友,附近小程序推广,其中附加小程序也收到微信限制
    后台调试麻烦,因为API接口必须https请求,且公网地址,也就是说后台代码必须发布到远程服务器上;当然我们可以修改host进行dns映射把远程服务器转到本地,或者开启tomcat远程调试;不管怎么说终归调试比较麻烦
    前台测试有诸多坑,最头疼莫过于模拟器与真机显示不一致
    js引用只能使用绝对路径,不能操作DOM
    原生App优点:
    原生的相应速度快
    对于有无网络操作时,譬如离线操作基本选用原生开发
    需要调用系统硬件的功能(摄像头,拨号,短信蓝牙…)
    在无网络或者弱网情况下体验好
    原生App缺点:
    开发周期长,开发成本高,需要下载
  • 小程序和Vue写法的区别?下面我们就来一起了解一下小程序和Vue写法的区别。以下是我所整理的小程序和Vue写法的区别,希望对你有所帮助。

    遍历的时候:

    • 小程序wx:for=“list”,
    • 而Vue是v-for=“item in list”

    调用data模型(赋值)的时候:

    • 小程序:this.data.item // 调用,

    • 小程序:this.setDate({item:1})//赋值

    • Vue:this.item //调用,

    • Vue:this.item=1 //赋值

  • 小程序调用后台接口遇到那些问题?下面我们就来一起了解一下小程序调用后台接口遇到那些问题。以下是所整理的小程序调用后台接口遇到的问题,希望对你有所帮助。

    数据的大小限制,超过范围会直接导致整个小程序崩溃,除非重启小程序

    小程序不可以直接渲染文章内容这类型的html文本,显示需要借助插件
    注:插件渲染会导致页面加载变慢,建议在后台对文章内容的html进行过滤,后台直接处理批量替换p标签div标签为view标签,然后其他的标签让插件来做
  • 分析微信小程序的优劣势?下面我们就来一起简单的了解一下微信小程序的优劣势。下面是所整理的微信小程序的优劣势,希望对你有所帮助。

    优势:

    容易上手,基础组件库比较全,基本不需要考虑兼容问题
    开发文档比较完善,开发社区比较活跃,支持插件式开发
    良好的用户体验,无需下载,通过搜索和扫一扫就可以打开,打开速度快,安卓上可以添加到桌面,与原生APP差不多
    开发成本比APP要低
    为用户提供良好的保障(小程序发布,严格是审查流程)

    劣势:
    限制较多,页面大小不能超过1M,不能打开超过5个层级的页面
    样式单一,部分组件已经是成型的,样式不可修改,例如:幻灯片,导航
    推广面窄,不能分享朋友圈,只能通过分享给朋友,附加小程序推广
    依托与微信,无法开发后台管理功能
    后台调试麻烦,因为api接口必须https请求且公网地址
    真机测试,个别安卓和苹果表现迥异,例如安卓的定位功能加载很慢

  • 简单描述下微信小程序的 相关文件类型。下面我们就来一起了解一下微信小程序的 相关文件类型。以下是所整理的微信小程序的 相关文件类型,希望对你有所帮助。

    wxml 模板文件,是框架设计的一套标签预言,结合基础组件,事件系统,可以构建出页面的结构

    wxss 样式文件,是一套样式语言,用于描述WXML的组件样式
    js脚本逻辑文件。逻辑处理网络请求
    json配置文件,小程序设置,如页面注册,页面标题及tabBar
    app.json 整个小程序的全局配置,包括:
    pages:\[所有页面路径]
    网络设置(网络超时事件)
    页面表现(页面注册)
    window:(背景色,导航样式,默认标题)
    底部tab等
    app.js 监听并处理小程序的生命周期函数,声明全局变量等
    app.wxss 全局配置的样式文件

  • 请谈谈原生开发小程序,wepy,mpvue的对比?下面我们就来一起了解一下原生开发小程序,wepy,mpvue的对比。个人认为,如果是新项目,且没有旧的 h5 项目迁移,则考虑用小程序原生开发,好处是相比于第三方框架,坑少。

    而如果有 老的 h5 项目是 vue 开发 或者 也有 h5 项目也需要小程序开发,则比较适合 wepy 或者 mpvue 来做迁移或者开发,近期看wepy几乎不更新了,所以推荐美团的mpvue。
    而如果如果团队前端强大,自己做一套框架也没问题。

029-86195145 180 6652 8545 西安嘉瑞德网络科技公司
工作时间:周一到周六 8:30-18:30
邮箱:2528823962@qq.com
QQ:2528823962
地址:陕西省西安市未央元朔路明丰伯马都A座10820室
  • 微信小程序制作微信二维码
    扫码咨询
Copyright © 2015 西安嘉瑞德网络科技有限公司 陕ICP备17015187号-1