宿迁腾云网络网站建设公司

腾云网络 八年经验专注网站建设
  • 首页
  • 服务项目
    • 网站建设
    • 微信小程序
    • APP开发
    • SEO优化
  • 建站费用
  • 成功案例
    • 网站建设案例
    • 小程序案例
    • APP开发案例
    • SEO优化案例
  • 行业动态
    • 网站建设
    • SEO优化
    • 技术日志
  • 联系我们
    • 关于我们
首页 > 行业动态 > 技术日志 > 微信公众号开发 php微信公众号开发,开发什么?备忘。。php微信公众号开发教程

微信公众号开发 php微信公众号开发,开发什么?备忘。。php微信公众号开发教程

2022-07-26

这太令人沮丧和难以理解。也太坑了。

以下是这几天微信公众号相关工作的总结。不全面,只是作为初学者的记录,仅供参考。

一、微信公众号开发,开发什么?

公众号不同于小程序。小程序类似于手机APP,是独立开发的。微信只提供入口;而公众号基本在微信框架内。微信公众号本质上是用户的一个联系人,但只是一个特殊的联系人。通过微信提供的公众号管理后台,无需任何编程,即可快速搭建像样的公众号,菜单、机器人客服、文章更新一应俱全。

但是小程序开发,如果你想要更多的权力,你需要开发它。比如机器人客服。通过公众号管理后台网站模板,可以定义一些自动回复语句,但毕竟还不够智能。这时候,我们可以在互联网上搭建一个服务器,提供相应的服务。当然,这需要准备好URL和域名。

第二,菜单。点击公众号的菜单项后,可以回复一些消息,跳转到小程序,或者打开网页。如果打开网页,如果是未经验证的公众号,则只能打开公众号内的素材,或当前公众号已发表的文章、图片、视频等;和经过验证的公众号,可以直接打开任意网址。这些网页通常是部署在互联网上的所谓微信网页。他们使用微信JS-SDK,上面有各种微信元素,比如扫描、分享到朋友圈等等。当然,这部分需要开发。

并向关注者发送消息。我认为这是微信公众号最大的卖点。比如我关注了某个公众号,通过这个公众号的菜单打开相关小程序做事,当事情进展的时候,系统可以通过这个公众号给我发消息提醒我目前的工作进展。我认为这是公众号开发中最有价值的工作。

当然,也有可以在公众号上自动发布文章的程序。不过这种事情也可以在公众号管理后台手动完成,无非就是动手。

二、发展铺垫

在开发之前,有必要了解相关规范。建议同时阅读开发文档的开头:微信公众平台开发概述

1、公众号分类

衣着三色,食分五品。所谓微信公众号分为订阅号和服务号。个人只能申请订阅号,企业可以申请订阅号和服务号。然后公众号分为认证和未认证。公众号的类型,是否经过认证,决定了是否可以调用很多微信服务。没有认证,基本没什么玩的。而且很遗憾,个人申请的订阅号根本无法通过微信认证,直接挡住了门。

如何开发它?微信还非常“贴心”地提供了测试号机制。不用申请公众号,我们可以先申请一个测试号,用这个号来测试微信服务接口。测试号所有微信服务接口均可访问。当然是鹅!和微信网页一样,需要在手机上运行才能看到效果,如果使用测试号,有些东西是无法渲染的。比如所谓的微信开放标签(即微信定义的标签,类似于HTML)。

订阅帐号和服务帐号的侧重点不同。据我了解,订阅号侧重于发布文章,而服务号侧重于发送有针对性的通知。一般来说,服务帐户比订阅帐户更强大。

从表面上看,订阅号每天可以发送 1 条消息微信公众号开发 php,而服务号每月只能发送 4 条消息,订阅号更强。问题是,群发消息有什么用?当我们在网上做事时,我们想要的是对我来说是新闻。只有服务帐号可以发送此有针对性的通知消息。

在文档中,这种类型的消息称为模板消息。为什么叫模板消息?这是因为这种消息是结合模板生成的。就像我们的手机短信一样。做过手机短信开发的都知道,手机短信是不能随便发的。因为众所周知的原因,肯定有所谓的模板,就是怕内容不合法,内容离谱,也就是短信的格式是固定的,而且很多字也是固定的,我们只需要填写每次我们发送它时都会包含一些内容。此模板必须事先创建并获得电信运营商的批准。微信消息也使用模板。调用发送接口时,需要将模板ID作为参数传递。

目前小程序的模板消息功能已经废弃,取而代之的是所谓的“统一服务消息”,实际上是通过服务号发送的。也就是说,小程序要给用户发送通知,就必须对应一个服务号。

但世界上还有一种叫做订阅消息的东西。公众号叫订阅通知,小程序叫订阅消息。有两种类型:一次性和长期。订阅消息需要用户主动订阅。例如,使用麦当劳小程序点餐时,每次付款后,都会询问您是否接受取餐通知。长期只对部分民生和医院公众账号开放。这是在申请公共帐户时给出的。不要冒险微信公众号开发 php,低估微信折腾人的能力。否则发送时对方永远收不到,也可能没有错误信息;

模板消息和订阅消息有什么区别?订阅新闻不仅仅是要求用户手动订阅,也没什么。问题是,这必须用手机来完成。如果我通过 PC 做事并想在手机上接收提醒怎么办?订阅新闻已完成。

2、公众号调试工具

是微信开发者工具。请注意,它是开发人员工具,而不是开发工具。这个工具确实是小程序的开发工具;对于公众号,它只是一个调试工具,无法通过它输入任何代码;它只是微信网页的调试工具。此时它只是一个微信浏览器。方法是在微信开发者工具顶部输入微信网页地址进行浏览调试,类似普通浏览器按F12。

3、查看微信网页运行结果

公众号可以通过微信客户端查看。这里所说的查看结果是指查看微信网页的运行结果。虽然有“网页”二字,但这不是一个普通的网页。可以用普通浏览器访问,虽然没有报错,但是看不到效果。它应该通过微信浏览器或微信开发者工具运行。需要注意的是,手机上没有微信浏览器这个app,是微信暗示的。如何召唤它?你可以把微信网页的地址发给微信上的朋友,比如“文件传输助手”,然后在聊天记录里点击这个网址,就会用微信浏览器打开。绝对给力的是微信浏览器,QQ浏览器不好用。

4、开发文档

基于微信进行二次开发,上网查资料基本没用。最好老老实实阅读微信官方开发文档。

在公众号管理后台-设置与开发-开发者工具-开发文档中打开公众号开发文档。

微信有两个平台,小程序叫“微信开发开放平台”,公众号叫“微信开发公共平台”。

5、一些术语

1)管理员和操作员

在开发过程中,不可避免地会访问微信公众号管理后台修改或设置一些设置,但要更改设置,必须扫描二维码进行身份认证。这很尴尬。申请公众号的人是管理员,但不一定参与开发。提醒大老板扫描二维码会很不方便,甚至是不可能的。您可以将开发人员添加到操作员列表并自行扫描代码。运营商分为长期和短期两种。他们应该是具有足够权限的长期运营商。

可以在微信公众号管理后台-设置与开发-人事设置中设置。

2)IP 白名单

在开发过程中,我们需要访问微信服务器,比如采集。发出请求的 IP 需要在白名单中。这个IP是指互联网IP。如果我们在腾云网内部开发,那么这个IP就是腾云网的IP,用于上网。问题是,这个IP经常变化。不知道有什么好办法,所以基本上一天换一次白名单。

IP白名单是供我们在本地调试微信开发者工具的。无需手机操作。

3)开发者微信

官方账号管理后台-设置与开发-web开发者工具,添加我们开发者的微信账号。这是用来开发微信网页的。因为微信开发者工具需要微信登录。

4)JS接口安全域名

公众号管理后台-设置与开发-公众号设置-功能设置。

微信网页开发也需要它。我们的页面需要放在这个域名下,才能使用微信的js-sdk。

填写这个域名时,需要下载一个txt文件放在域名下,微信可以验证域名的真实性后再保存。但是填完之后,我们在本地开发的时候,可以修改host文件,把本地ip映射到域名。毕竟是前端的东西。 js-sdk本身需要微信浏览器的支持,它无法判断请求来自哪个IP,我们传给它什么都会相信。

5)微信打开标签

类似于HTML,微信独有的标签。比如

跳转小程序:<wx-open-launch-weapp>
跳转App:<wx-open-launch-app>
服务号订阅通知:<wx-open-subscribe>
音频播放:<wx-open-audio>

三、微信网页开发

1、概览

微信网页其实就是网页,只不过它引用了微信提供的JS库,可能会使用微信独有的所谓开放标签,类似于html。而这个微信网页似乎是在一个普通的浏览器上运行的。虽然不会报错,但似乎没有任何作用。只能在微信浏览器或微信开发者工具上运行。

以下是微信网页(boot下,合并)

DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>wechattitle>
    <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js">script>
    <script src="./libs/jquery.min.js">script>
    <style>
        .sao{
            text-align: center;width: 100%;height:5.5em;background-color: #ddd;line-height: 5.5em;
            cursor:pointer;
        }
        .block{
            height: 100px;
            border:solid 1px red;
        }
    style>
head>
<body>
	
    <div class="sao qr_btn">扫一扫div>
    
    <div class="block">
        
        <wx-open-subscribe th:template="${template}" id="subscribe-btn">
            <script type="text/wxtag-template" slot="style">
                <style>
                    .subscribe-btn {
                        color: #fff;
                        background-color: #07c160;
                    }
                </style>
            script>
            <script type="text/wxtag-template">
                <button class="subscribe-btn">
                    模版消息订阅
                </button>
            script>
        wx-open-subscribe>
    div>
body>
<script th:inline="javascript">
	//微信验证
    wx.config({
        debug: true,
        appId: /*[[${wc.appId}]]*/'',
        timestamp: /*[[${wc.timestamp}]]*/'',
        nonceStr: /*[[${wc.nonceStr}]]*/'',//随机串
        signature: /*[[${wc.signature}]]*/'',
        jsApiList: ['chooseImage','scanQRCode','updateAppMessageShareData','updateTimelineShareData'],//需要使用的微信js-sdk函数列表
        openTagList: ['wx-open-subscribe']//开放标签列表
    });
    wx.ready(function () {
        // 微信分享 -- 分享给朋友
        wx.updateAppMessageShareData({
            title: '分享给您的猪朋狗友吧',
            desc: '独食难肥',
            link: location.href.split('#')[0],
            imgUrl: "http://test.duduchuhai.com/images/share.png",
            success: function(res) {
                console.log(res);
            }
        });
        // 微信分享 -- 分享到朋友圈
        wx.updateTimelineShareData({
            title: '分享到猪圈',
            link: location.href.split('#')[0],
            imgUrl: "http://test.duduchuhai.com/images/share.png",
            success: function(res) {
                console.log(res);
            }
        });
    });
    wx.error(function (res) {
        console.log(res);      // res为微信返回的错误结果
    });

微信公众号开发 php微信公众号开发,开发什么?备忘。。php微信公众号开发教程(图1)

// 微信扫一扫 $(".qr_btn").on('click', function() { wx.scanQRCode({ needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有 success: function (res) { var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果 } }); });
script> <script> var btn = document.getElementById('subscribe-btn'); console.log(btn); btn.addEventListener('success', function (e) { console.log('success', e.detail); }); btn.addEventListener('error',function (e) { console.log('fail', e.detail); }); script> html>

2、验证

微信网页在运行时,必须先通过微信验证,然后才能正常使用微信的各种功能。验证过程是,

1)访问微信服务器获取

2)访问微信服务器

3)使用、随机字符串、时间戳、当前页面地址依次组成一个字符串,然后对该字符串进行sha hash运算得到摘要

4)使用摘要访问微信服务器获取签名

5)注册、时间戳、随机字符串、签名、本页面使用的微信功能、微信打开标签到微信

在上面的例子中,

    wx.config({
        debug: true,
        appId: /*[[${wc.appId}]]*/'',
        timestamp: /*[[${wc.timestamp}]]*/'',//注意是秒,不是毫秒
        nonceStr: /*[[${wc.nonceStr}]]*/'',//随机串
        signature: /*[[${wc.signature}]]*/'',//关键所在
        jsApiList: ['chooseImage','scanQRCode','updateAppMessageShareData','updateTimelineShareData'],//需要使用的微信js-sdk函数列表
        openTagList: ['wx-open-subscribe']//开放标签列表
    });

获取这个json对象并不容易。可以在微信公众号管理后台获取,每个公众号都有唯一的;时间戳也很容易获得;随机字符串由自己决定,比较容易;最麻烦的是这个签名,我调试了一天左右,总的意思是非法签名。

获取这个json对象的java代码:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import javax.annotation.PostConstruct;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;
@Service
public class WxServiceImpl implements WxService {
    @Override
    public WxConfig getWxConfig(String url) {//url是微信网页地址
        WxConfig wc = new WxConfig();//这个是自定义的对象,不必深究
        wc.setAppId(APPID);
        wc.setNonceStr(getNonceStr());//随机串
        wc.setTimestamp((long) (new Date()).getTime() / 1000);//时间戳
        wc.setSignature(getSignature(wc.getNonceStr(), wc.getTimestamp(), url));//签名
        return wc;
    }
    @PostConstruct
    void init() {
    	/*
    		由于从微信服务器获取token和ticket的函数有调用次数限制(每天<=2000),因此用redis将它们缓存起来
    	*/
        this.jedis = new Jedis(redis的IP, redis端口号);
    }
    private String getSignature(String nonceStr, long timestamp, String url) {//获取签名
        String signature = null;
        String ticket = getTicket();
        if (ticket != null) {
            String string1 = String.format("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s",
                    ticket,
                    nonceStr,
                    timestamp,
                    url);
            signature = getSha1(string1);
        }
        return signature;
    }
	//redis对象
    private Jedis jedis;
	//除了redis缓存,也用静态变量保存一份。不过,应用程序重启它们就消失了,并且不会自动过期
	//而从微信获取到的token和ticket有效期是7200秒
    private String _ticket = null;
    private String _token = null;
	//锁。为避免并发,使用锁机制,不要大家都去获取token和ticket
    private ReentrantLock lockTok = new ReentrantLock();
    private ReentrantLock lockTik = new ReentrantLock();
    private String getTicket() {
        String ticket = null;
        String key = "ticket";
        ticket = getKey(key, this._ticket);
        if (ticket == null) {
            //锁定。
            lockTik.lock();
            ticket = getKey(key, this._ticket);//再努力一把
            if (ticket == null) {
                String token = getToken();
                if (token != null) {
                    ticket = callGet(String.format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi",
                            token), "ticket");
                    if (ticket != null) {
                        this._ticket = ticket;
                        setKey(key, ticket);
                    }
                }
            }
            //解锁
            lockTik.unlock();
        }

微信公众号开发 php微信公众号开发,开发什么?备忘。。php微信公众号开发教程(图2)

return ticket; } private String getToken() { String token = null; String key = "token"; token = getKey(key, this._token); if (token == null) { lockTok.lock(); token = getKey(key, this._token); if (token == null) { token = callGet(String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",APPID,AppSecret), "access_token"); if (token != null) { this._token = token; setKey(key, token); } } lockTok.unlock(); } return token; } final static int EXPIRTED = 7200; private String getKey(String key, String v) { String value = null; try { value = jedis.get(key); } catch (Exception ex) { value = v;//如果无法从redis中读取则将候补变量值返回。但变量值可能有过期的问题 System.err.println(ex.getMessage()); } return value; } private void setKey(String key, String value) { try { jedis.set(key, value); jedis.expire(key, EXPIRTED); } catch (Exception ex) { System.err.println(ex.getMessage()); } } final static int NONCESTR = 16;//随机串的长度为16。这个数值是自己定的 private String getNonceStr() {// 生成随机字符串noncestr String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; StringBuffer noncestr = new StringBuffer(); int limit = chars.length() - 1; for (int i = 0; i < NONCESTR; i++) { Random r = new Random(); int j = r.nextInt(limit); noncestr.append(chars.substring(j, j + 1)); } return noncestr.toString(); } private static String getSha1(String string1) { MessageDigest sha = null; // 此处的sha代表sha1 try { sha = MessageDigest.getInstance("SHA"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } byte[] md5Bytes = new byte[0]; try { md5Bytes = sha.digest(string1.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) { hexValue.append("0"); } hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } public static String callGet(String api, String key) {//get的方式访问微信api String re = null; System.out.println(String.format("正在获取 %s : %s", key, api)); try { URL url = new URL(api); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.connect(); BufferedReader br = new BufferedReader( new InputStreamReader(connection.getInputStream(), "UTF-8")); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } br.close(); connection.disconnect(); JSONObject json = JSON.parseObject(sb.toString()); if (json.containsKey(key)) { re = json.getString(key); } System.out.println(re); } catch (Exception ex) { ex.printStackTrace(); System.out.println(String.format("访问接口%s失败", api)); } return re; } }

3、调试

在微信开发者工具上,输入微信网页地址,运行,得到很多提示。对于微信公众号来说,微信开发者工具是一个调试工具,一个开启调试模式的浏览器。但一开始,它总是失败。现在,我在示例中声明需要使用以下微信功能:

    wx.config({
        debug: true,
        appId: /*[[${wc.appId}]]*/'',
        timestamp: /*[[${wc.timestamp}]]*/'',//注意是秒,不是毫秒
        nonceStr: /*[[${wc.nonceStr}]]*/'',//随机串
        signature: /*[[${wc.signature}]]*/'',//关键所在
        jsApiList: ['chooseImage','scanQRCode','updateAppMessageShareData','updateTimelineShareData'],//需要使用的微信js-sdk函数列表
        openTagList: ['wx-open-subscribe']//开放标签列表
    });

结果从返回的信息来看,我能访问的函数是0。除此之外,到处都是“失败,就是”之类的提示。

开启微信开发者工具的调试模式:在微信开发者工具中,顶部菜单“微信开发者工具”-调试-“调试微信开发者工具”-,看这个的返回信息?_r=... , 结果是 { : , : " "}!

签名算法有问题吗?在微信公众号管理后台,我使用了他们提供的微信JS接口签名验证工具,结果完全一致,所以不存在算法错误的问题。

4、填坑

后来发现是网址有问题。在生成签名的过程中,需要传递当前微信网页的URL参与构造字符串,然后对字符串进行哈希处理,传递给微信服务器获取签名。问题是,这个URL应该怎么写?由于我的微信页面名为.html,所以我在访问的时候一般在浏览器上输入地址是这样的: 所以我也用这个地址参与了签名的构建,结果总是提示签名是无效的。后来把地址全写了:,一下子就OK了​​。

但是官方开发文档里写的是什么呢?

不认真复习问题会害死人。

Tag: 微信 公众 开发
网站制作公众号

宿迁腾云网络网站建设公司 | 网站开发 | 网站制作 | 网站优化

咨询电话:13160355545

上一篇

返回栏目

下一篇

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

热推

  • PHP开源项目一下三件事解析请求、三个框架的能力
  • 安卓php代码编辑器智能代码重构和代码分析功能Mac破解版介绍forMacphp代码编辑软件
  • 网站php程序员技术圈的江湖鄙视链:前端需求量垫底,区块链工程师最抢手淘宝客php网站程序
  • php是什么文件格式?如何打开可以使用编辑器?
  • 开源php erp管理系统老司机是如何用PHP高质量、高效率地开发的?php 开源 erp
  • YiiPHP开源框架是一套基于组件用于大规模web应用开发
  • php代码做成图片格式我将为大家介绍如何使用PHP语言来编码和解码JSON对象php 上传图片代码
  • php-fpm应用与php-swoole应用进行通信
  • php刷新当前网页的代码PHP解释型语言来说什么优化的方案?|PHP课堂网页js自动刷新代码
  • php采集网站数据 中国互联网信息中心发展状况统计报告(一):大数据导航多网站采集 php源码

相关

大会现场蒋涛调查参会者,柳峰解析LBS与智能客服开发重难点?

大会现场蒋涛调查参会者,柳峰解析LBS与智能客服开发重难点?

Linux 系统管理员和 web 开发者必知:如何查看 PH

Linux 系统管理员和 web 开发者必知:如何查看 PH

免费开源的轻量级 PHP 开发框架 ThinkPHP,遵循

FastAdmin 开发基础管理插件步骤及环境配置详解

从零开始开发完整网站:前端、后端与 Web 服务器的关键技术

php框架 Java 与 PHP 之争:为何懂技术的大佬选

优化 PHP 代码,提升公司内部电脑监控软件安全性

优化 PHP 代码,提升公司内部电脑监控软件安全性

在 Ubuntu 18.04 系统中使用 Apache 搭建

Web 开发:选择平台与语言的商业考量及代码质量的重要性

PHP 语言学习指南:从零基础到精通,探索 PHP 的用途与

标签

seo(1182) 市场营销(661) 网站制作(573) 网站建设(564) 搜索引擎(553) 网站(482) PHP(361) 编程语言(345) 建站(294) 关键词排名优化(267) 网站建设公司(245) 优化(216) seo排名(207) 域名(190) 软件(171) 网站优化(148) 搜索引擎优化(146) 外链(141) 科技(136) 网站关键词(124) 网站排名优化(123) 域名服务器(120) 网站排名(107) 时政(103) 排名优化(95) 搜索引擎收录(93) 网站设计(92) 电子商务(88) 引擎(86) 移动互联网(85) 开发框架(79) 开发(75) 网站服务器(74) 框架(68) 前端开发(68) 网站分析(66) 网站建设方案(65) 关键(64) 流量(63) 源码(62) 百度优化(62) 网站权重(61) 开放源代码(59) seo培训(53) 网页设计(51) 百度(51) php框架(50) 网站建设知识(50) 大数据(50) 谷歌(49)
宿迁腾云网络网站建设公司
网站建设
  • 私人定制
  • 标准模板建站
  • 经济模板建站
精品模板

宿迁腾云网络网站建设公司

联系电话:13160355545

公司地址:江苏省宿迁市丽景湾华庭北门都市花园公寓9楼907

联系邮箱:admin@tyweb.net

全国分站
  • 北京
  • 广东
  • 东莞 广州 中山 深圳 惠州 江门 珠海 汕头 佛山 湛江 河源 肇庆 潮州 清远 韶关 揭阳 阳江 云浮 茂名 梅州 汕尾
  • 山东
  • 济南 青岛 临沂 济宁 菏泽 烟台 泰安 淄博 潍坊 日照 威海 滨州 东营 聊城 德州 莱芜 枣庄
  • 江苏
  • 苏州 徐州 盐城 无锡 南京 南通 连云港 常州 扬州 镇江 淮安 泰州 宿迁
  • 河南
  • 郑州 南阳 新乡 安阳 洛阳 信阳 平顶山 周口 商丘 开封 焦作 驻马店 濮阳 三门峡 漯河 许昌 鹤壁 济源
  • 上海
  • 河北
  • 石家庄 唐山 保定 邯郸 邢台 沧州 秦皇岛 张家口 衡水 廊坊 承德
  • 浙江
  • 温州 宁波 杭州 台州 嘉兴 金华 湖州 绍兴 舟山 丽水 衢州
  • 陕西
  • 西安 咸阳 宝鸡 汉中 渭南 安康 榆林 商洛 延安 铜川
  • 湖南
  • 长沙 邵阳 常德 衡阳 株洲 湘潭 永州 岳阳 怀化 郴州 娄底 益阳 张家界 湘西
  • 重庆
  • 福建
  • 漳州 泉州 厦门 福州 莆田 宁德 三明 南平 龙岩
  • 天津
  • 云南
  • 昆明 红河 大理 文山 德宏 曲靖 昭通 楚雄 保山 玉溪 丽江 临沧 思茅 西双版纳 怒江 迪庆
  • 四川
  • 成都 绵阳 广元 达州 南充 德阳 广安 阿坝 巴中 遂宁 内江 凉山 攀枝花 乐山 自贡 泸州 雅安 宜宾 资阳 眉山 甘孜
  • 广西
  • 贵港 玉林 北海 南宁 柳州 桂林 梧州 钦州 来宾 河池 百色 贺州 崇左 防城港
  • 安徽
  • 芜湖 合肥 六安 宿州 阜阳 安庆 马鞍山 蚌埠 淮北 淮南 宣城 黄山 铜陵 亳州 池州 巢湖 滁州
  • 海南
  • 三亚 海口 琼海 文昌 东方
  • 江西
  • 南昌 赣州 上饶 吉安 九江 新余 抚州 宜春 景德镇 萍乡 鹰潭
  • 湖北
  • 武汉 宜昌 襄樊 荆州 恩施 孝感 黄冈 十堰 咸宁 黄石 仙桃 随州 天门 荆门 潜江 鄂州 神农架
  • 山西
  • 太原 大同 运城 长治 晋城 忻州 临汾 吕梁 晋中 阳泉 朔州
  • 辽宁
  • 大连 沈阳 丹东 辽阳 葫芦岛 锦州 朝阳 营口 鞍山 抚顺 阜新 本溪 盘锦 铁岭
  • 黑龙江
  • 齐齐哈尔 哈尔滨 大庆 佳木斯 双鸭山 牡丹江 鸡西 黑河 绥化 鹤岗 伊春 大兴安岭 七台河
  • 内蒙古
  • 赤峰 包头 通辽 呼和浩特 乌海 鄂尔多斯 呼伦贝尔
  • 贵州
  • 贵阳 黔东 黔南 遵义 黔西 毕节 铜仁 安顺 六盘水
  • 甘肃
  • 兰州 天水 庆阳 武威 酒泉 张掖 陇南 白银 定西 平凉 嘉峪关 临夏 金昌 甘南
  • 青海
  • 西宁 海西 海东 海北 果洛 玉树 黄南
  • 新疆
  • 乌鲁木齐 伊犁 昌吉 石河子 哈密
  • 西藏
  • 拉萨 山南 林芝 日喀则
  • 吉林
  • 长春 白山 白城 延边 松原 辽源 通化 四平
  • 宁夏
  • 银川 吴忠 中卫 石嘴山 固原
SiteMap
网站地图
TAG标签
Copyright © 2017-2025 TYWEB.NET 宿迁腾云网络科技有限公司 ALL RIGHTS RESERVED.   苏ICP备17033535号-1

热门搜索

百度 下载 2025 2024 2026 货源 货货源 虚拟 禅道 报名 金蝶KIS旗舰版
  • 客服

    在线客服

  • 电话

    13160355545

  • 微信

精品模板
建站费用
成功案例
联系我们