精华内容
下载资源
问答
  • 如何自己弄一个公众号
    千次阅读
    2019-10-14 16:47:40

    1、业务需求

          现在有个需求就是,需要复制我们主公众号的功能,然后弄成一个新的公众号,需要好多个,可能是好多代理。一个代理是一个公众号。

    2、我是在测试公众号上测试的,配置信息

    js接口安全域名修改,下边的域名也是 与接口配置信息修改的URL是一个主域名

     

    网页授权获取用户基本信息---的url地址配置跟js接口安全域名修改的域名一致。

     

    PHP获取当前域名$_SERVER['HTTP_HOST']和$_SERVER['SERVER_NAME']的区别

    然后根据不同代理下边的公众号菜单之类的传过来的url地址不一样,然后在用户信息表标记是哪个公众号来的

    用 $-SERVER['HTTP_HOST']获取来的域名地址,不能用$-SERVER['SERVER_NAME'];

     

    开发站群软件,用到了根据访问域名判断子站点的相关问题,PHP获取当前域名有两个变量 $_SERVER['HTTP_HOST'] 和 $_SERVER['SERVER_NAME'],两者的区别以及哪个更加可靠?

    相同点:

    当满足以下三个条件时,两者会输出相同信息。

    1、服务器为80端口

    2、apache的conf中ServerName设置正确

    3、HTTP/1.1协议规范

     

    不同点:

    1、通常情况:

    $_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。

    $_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。

    2、当服务器为非80端口时:

    $_SERVER["HTTP_HOST"] 会输出端口号,例如:snsgou.com:8080

    $_SERVER["SERVER_NAME"] 会直接输出ServerName值

    因此在这种情况下,可以理解为:$_SERVER['HTTP_HOST'] = $_SERVER['SERVER_NAME'] : $_SERVER['SERVER_PORT']

    3、当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:

    httpd.conf配置如下:

    1

    2

    3

    4

    <virtualhost *>

        ServerName snsgou.com

        ServerAlias blog.snsgou.com

    </virtualhost>

    客户端访问域名 blog.snsgou.com

    $_SERVER["HTTP_HOST"] 输出 blog.snsgou.com
    $_SERVER["SERVER_NAME"] 输出 snsgou.com

    所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。

     

    更多相关内容
  • LINUX服务器安装宝塔,添加一个站点,站点内不需要什么页面,宝塔默认的就可以 这个文件不需要设置什么,再上传放入公众号验证的文件验证一下域名归属权。 公众号设置ip白名单,授权业务域名,这个是常规操作。很...
  • 为什么要运营一个公众号呢? 下面先上号! 其实一开始也是听了很多人的建议,说你技术多好多好,不分享出去可惜了。写写博客赚赚钱,写写公众号,接接广告都不错啊。你看那些公众号几万粉丝的,每天广告收入能...

    本人就是大家常见的程序员中的下游-测试开发,国际惯例,先介绍下自己当前现状:

    月平均薪:税前+公积金+补助+各种奖金+加班费+股票 = 42000+

    工龄:5.5年

    职称:资深~专家

    为什么要运营一个公众号呢? 下面先上号!

    其实一开始也是听了很多人的建议,说你技术多好多好,不分享出去可惜了。写写博客赚赚钱,写写公众号,接接广告都不错啊。你看那些公众号几万粉丝的,每天广告收入能达到几千块,不比你辛辛苦苦上班加班头发掉光舒服么?

    然后,天真的我就信了,开始运营一个公众号。申请开通的时候还是可以的,很简单就通过审核。

    然后兴致勃勃的写了一篇文章发布。第二天满怀期待的打开一看,阅读量为1。

    是的,就是这么残酷!

    无论1,写的多精致,但是没有宣传和流量都是废纸一张。

    而我们普通人想获取流量,简直难于登天。 可能有的同学会说,可以去买流量。我当时也这么想,可是去了解后发现基本全是僵尸粉或者说假粉。你白花了冤枉钱而已,抖音那些几百万粉丝的红人直播卖货就卖出去几十块钱的例子数不胜数。 然后你还打算指着这些虚假的数据来赚钱?那基本不可能,你去买粉丝的时候,其实就是接盘的时候,想赚钱基本没戏。

    所以我会基于以下几个角度,给大家聊一聊我的公众号怎么弄的:

    1.关于推广

    前面说了,想获得真粉丝,然后赚钱,那你就只能靠自己去推广,最好不要相信任何第三方帮你涨粉的平台。但是作为普通人我们基本没有话语权和流量,推广几乎不可能。其实也可以去找一些行业内的大佬帮忙,他们一般都有自己的公众号,让他们在自己公众号上帮你宣传下,你付点报酬也未尝不可。 但是效果却不尽如人意,比如你花10000块去发推广,结果粉丝可能只有百八十个,这点粉丝给你带来最终的总收益不会超过20块钱。因为就算大佬他也不能强迫他的粉丝去关注你,先不说跟你是不是有技术竞争关系,他本身也不敢轻易做这么伤害粉丝的事情,大佬他差你这一万块么?就好像你是女神xxx的粉丝,结果有一天女神说让你去关注一下某个韩国男星,因为她收了钱,她就把你们这些真爱粉卖了。你会怎么做,怎么想? 女神她只要不是傻子就不会这么做? 而且推广钱不是一般的贵,上万块进去基本连个响都听不到!

    所以,个人想成名推广,难度是肯定存在的,不然所有人都随随便便成为网红,大v。那么这些也就不值钱了,咱一开始想靠私域流量公众号赚钱的愿望也就不会存在了。

    那我是怎么推广的呢?其实还是比较幸运的,因为在这之前,我个人在csdn博客有20万的点击量,被审核评为社区技术专家,几乎是我测试行业内为数不多的30岁之前的社区专家。在脉脉上也有10万左右的访客量。写的文章经常上首页推荐,每次发个动态都会有超过万人收到推送。所以侥幸,靠着这些,一点点开始喂养公众号到现在。

    但是!也不是一帆风顺的!

    首先,你十万二十万的曝光量会引起平台运营的注意,他们一般都是禁止发布个人广告尤其是公众号。原因不用多说。你发多了广告,你会收到一些暗示和警告,甚至是惩罚性的降权,让你的流量瞬间被平台压制,得不偿失。

    还有,大多数同学游客看了一眼你的文章,发现也没写多少内容,顶多给你点个赞。 想给你转发帮你宣传?那基本不可能。 关注就更别提了。

    因为做技术的都知道,各种技术群,最反感的就是有人发公众号文章,基本要被踢或者被群主警告,这是一种抢人脉 抢资源 直接站在技术群群主的 对立面的行为。 就算是公众号作者本人,都不敢轻易在技术群发,何况只是看了你文章的读者。

    当然前面一切概率小且难的事,只要你粉丝基数大了,就都不是问题了,你1000个粉丝,每文章每天 总有那么几十个人帮你分享,宣传,然后拉取到更多的几个 几十个 上百个新粉丝。这就造成了,粉丝越多的号它涨粉越快,越少的号越无法翻身。

    所以万事开头难!无数的公众号都毁在了一开始,在没有坚持到10个粉丝的时候 就结束了。

    毕竟写一篇文章的成本精力很高,结果一个粉丝都没有,连续几天下来,基本99%的作者都会丧失信心,然后草草收场。

    好在后来腾讯给我官方认定成为it-测试技术自媒体,才获得了一丁点的推广。

    2.关于收益

    我就坦白一个事情,粉丝不到1万的话,别想着收益。

    首先我们接广告,变现的方式很多,但是无一例外,都会严重伤害粉丝,你的基数不够大,你这么做基本属于杀鸡取卵,自掘坟墓。 可能你在新榜 或者 tx的官方流量主上看到收益非常非常可观。一个广告,一个粉丝点击一下,你就能赚到5毛钱+! 1000个粉丝,每天就是500块钱! 但是实际的数据会啪啪打脸。

    首先我们就以1000粉丝的基础来说,别提广告文章,就算你正常的技术文章,阅读量过100都难,大多数粉丝都是关注之后懒得再看了。如果是广告文章,那么不好意思,点击量不到10,而且粉丝取消关注100+,你这个号,不要一周就烟消云散了。而那时候,你大概只赚了50块钱不到....

    可能有的同学会吐槽,粉丝1000也太少了吧? 这也是我想骂娘的问题!

    一开始公众号的选型就错了,千万不要做技术公众号,因为实在是没人看。你的受众面太窄了。除了你的同行,别人根本不看!

    你想像下,在微信10亿的用户基础上,一个所有人都受众的搞笑类公众号,能做到10万粉丝,那就是超级牛逼的存在了,那日入几千不是梦。

    但是你看看这个比例,10 0000 0000 / 10 0000 = 10 000

    也就是说,一万个人中,才有一个人选择关注你,但是你就很牛x了。

    可是你做技术公众号呢?你看看全国你有几个同行?我这个行业大概累计不到50万人。

    然后我现在是 50 0000 / 1400 = 357

    也就是说每357人中 就有一个粉丝,这个比例已经可以说不是一般的大了。但是效果呢?1400粉丝,每天稳赚1块钱~

    所以做技术公众号,我劝你不要奔着广告/流量变现 ,那还不如去做个搞笑视频剪辑了公众号了。

    3.关于精力成本

    技术类公众号的运营所耗的成本相当之高,作为一个程序员,每天上班已经够累了。大脑严重超载的情况,你还要下班或者午休去写一篇纯技术的硬核文章,这难度不亚于大学生写毕业论文,可是一篇毕业论文导师给你多久准备,2个月! 而一篇公众号呢?一天一篇!还是要在业余时间。

    可能你说你年轻,能扛住,那不好意思,工作太短的年轻人写的东西大多都只能自我陶醉,这很真实也很残酷。因为在其他同行眼里呢,写得好嫉妒你,写不好嘲讽你。关注?想都别想,同行是冤家这句话不是白说的。

    而且就算你能扛住,你能抗几天呢?这个东西非常非常容易影响主业,你的奖金一个不小心少了几千块。好吧,这可能是你公众号5年的收入!

    然后就是因为你写的是技术类,所以会有大批的,每天几十位读者反馈哪哪有bug,哪哪要怎么改,哪哪为什么跑不通,做程序员的都知道,不同的机器,不同的环境,组件的版本不同,任何一个标点符号 ,空格锁进,字母大小写不对,都会导致程序报错失败。程序员连自己的代码都难保证质量的情况下,还能有余力去帮别人排查错误么?还帮助几十位甚至更多的同学? 而且你要是怠慢了一位,那么就等着人家指着你的鼻子喷吧~ 喷到你怀疑人生。

    4.关于理想

    可能大家能感受到,各种形形色色的公众号中,纯技术的几乎没有,或者说极少! 其实道理很简单,因为上文所说的艰辛和失望导致。在我们娱乐至死的大环境下,连中科院科学家都混不过小鲜肉流量明星的时代,咱区区一个程序员又能掌握什么流量呢? 那还写公众号干什么呢?就为了区区虚荣? 程序员是这个世界上最聪明的一群人,他们才不会傻到去做这种费力不讨好的事,而且大多数都集中在北上广,属于漂泊一足,每天连打游戏 谈恋爱的时间都没有,然后还会去写技术文章培养自己未来的竞争对手?

    所以每当我见到这种不知疲惫,任劳任怨的持续更新,而且看的人很少却能坚持住的 纯技术公众号时,都会停下手指,慢慢的点个赞和分享。

    尤其是发现作者还是一个每天忙着焦头烂额的底层社畜时,更会发自内心的赞赏和尊敬。他们到底为了什么呢?难道真的是书本上说的那种国家栋梁,侠之大者,为国为民?难道他们的理想是让中国的it技术在世界上彻底崛起? 当然无所谓是为了什么,起码我能免费/轻松的 学习到那么多技术,然后拿着这份高薪在这里发帖,这都要感谢他们,这群不图回报分享技术的前辈。

    所以为了回报社会,继承前辈们的理想,我也开始了这种事业,是的,事业!

    当工作添加了远大理想,那么这就变成了事业!

    最后欢迎关注和访问我的博客和公众号,为新时代的工人点赞!

    csdn博客:我去热饭

    我去热饭的博客_CSDN博客-可爱的接口测试平台领域博主​wangzijia.blog.csdn.net图标

    公众号:测试开发干货

    测试开发干货

    展开全文
  • 微信公众号开发

    千次阅读 2022-03-11 11:27:45
    文章目录、微信公众号简介二、注册/登录微信公众号三、功能介绍1、编辑模式(个人开发者,无需服务器)2、开发模式四、实战开发1、配置服务器2、模块化五、获取 access_token1、access_token 是什么?2、获取 ...

    一、微信公众号简介

    1、微信公众号是什么?
    微信公众号平台是给个人、企业和组织提供业务服务与用户管理能力的全新服务平台;
    2、微信公众号分类

    订阅号:针对媒体和个人提供新的信息传播方式,主要是在微信里给用户传达资讯(杂志、新闻、娱乐等),适用于个人和媒体,一天可群发消息一次;
    服务号:为企业和组织提供更加强大的业务服务与用户管理能力偏向于服务类交互(银行),适用于企业、组织、政府,一个月可群发消息4次;
    小程序:一种新的开放能力,开发者可以快速开发一个小程序,小程序可以在微信内便捷的获取和传播;
    企业微信:继承企业号所有能力,同时为企业提供专业的通讯工具,丰富的办公应用与 api,助力企业高效沟通与办公;

    3、订阅号和服务号区别

    • 推送频率:订阅号一天一次,服务号一个月4次;
    • 适用群体:订阅号侧重与媒体、个人,服务号侧重企业、组织、政府;
    • 提供功能:订阅号包含大部分功能,认证的服务号包含全部功能;

    二、注册/登录微信公众号

    1、注册网址
    官网:https://mp.weixin.qq.com/
    2、注册流程(注册直接根据提示填写相应信息就可以了)

    打开官网,点击右上角“立即注册”
    选择订阅号注册(服务号需要公司注册信息,这里注册订阅号)
    依次输入信息点击注册(邮箱需要未注册过微信相关东西的账号)

    3、注册完成之后回到首页,直接输入账号密码登录就可以了,也可以扫码登录;

    4、登录成功之后可以在左侧带单 基本功能 找到自己的 AppID 和 AppSecret ,这两个参数在后面开发的时候会用到;

    三、功能介绍

    1、编辑模式(个人开发者,无需服务器)

    在这里插入图片描述

    草稿箱:查看草稿、新建图文等消息;
    素材库:提前上传图片、音频、视频,方便写文章的时候直接使用;
    发表记录:对已发布的文章进行管理,可编辑删除;
    原创:设置可转载账号;
    消息:消息管理中心;
    赞赏:文章赞赏回复设置以及数据的分析;
    用户管理:管理已关注、黑名单;
    视频弹幕:对视频弹幕进行设置;
    自动回复:对关键词回复、收到消息回复、被关在回复信息进行设置;
    自定义菜单:设置公众号底部的菜单;
    话题标签:针对话题、页面模板设置;
    投票:可以新建和管理投票;
    号内搜索:设置公众号搜索词后,帮助用户更快捷检索号内关联内容

    上面这一部分的功能可以让开发者直接在页面中配置我们的公众号,而不需要任何的代码开发,这种模式只能配置:自动回复、自定义菜单、话题标签、投票、号内搜索等比较通用的功能;如果你的项目里有需要引入第三方页面或者一些通用之外的定制化功能则需要通过开发模式来实现;

    2、开发模式

    在这里插入图片描述

    基本配置:公众号基本信息查看,服务器配置;
    开发者工具:开发这工具(开发者文档、在线调试工具、we开发工具、公众平台测试账号等)入口;
    运维中心:数据监控、日志查询、接口报警等信息;
    接口权限:查看当前用账户接口权限,接口代表的就是页面功能;

    开发模式需要配置服务器,服务器一旦开启配置之后,编辑模式的相关配置将会失效;

    四、实战开发

    开发之前请先打开开发者工具,仔细阅读开发者文档;

    开发模式整体流程图:
    在这里插入图片描述

    1、配置服务器

    开发者文档中打开“接口测试号申请” => “进入微信公众帐号测试号申请系统”,这里需要填写接口配置信息和JS接口安全域名;
    1.1、创建服务 express
    这里是简单的构建一个express 服务,也可以使用 express 提供的项目生成器来构建;

    1、新建文件夹 wechat_test
    2、控制台执行 npm init,创建一个 package.json 文件
    3、安装 express :npm i express
    4、在 package.json 同级新建文件 app.js
    5、控制台运行 app.js 服务,node app.js

    //引入express模块
    const express = require('express');
    //创建app对象
    const app = express();
    //监听端口号
    app.listen(3000,()=>{
    	console.log('服务器运行成功了')
    })
    

    运行成功,控制台会输出:服务器运行成功了;

    1.2、配置测试号-接口配置信息
    url:微信服务器访问不到局域网的网址,这里需要对我们的服务器域名做一下映射,将本地域名映射为外网网址;我们可以借助 花生壳 - 内网穿透 来实现;
    token:是参与服务器返回参数 signature 加密的,这里面可以随意填写,越复杂越好;signature 下面会说到用途;

    配置成功之后控制台会输出如下参数:

    {
      signature: '51631893d3f7711b6bf547090f65389a41a6c4b0', // 微信加密签名
      echostr: '3846949982007385053', //微信随机字符串
      timestamp: '1647073868', // 微信发送请求时间戳
      nonce: '1150241684' // 微信随机数字
    }
    

    1.3、验证服务器的有效性

    将 [token,nonce,timestamp] 按照字典排序,然后转字符串进行sha1加密;
    得到数据和微信传递过来的 signature 进行对比,相等说明消息是来自于微信服务器,否则就不是;

    需要安装sha1:npm i sha1

    //引入express模块
    const express = require('express');
    //引入sha1加密工具
    const sha1 = require('sha1')
    //创建app对象
    const app = express();
    const config = {
    	token:'xxxx'
    }
    //中间件,判断服务器的有效性
    app.use((req,res,next) =>{
    	const { signature, echostr, timestamp, nonce } = req.query;
    	const { token } = config;
    	const sha1Str = sha1([timestamp,nonce,token].sort().join(''));//sha1需要手动安装引入
    	if(sha1Str === signature){
    		res.send(echostr);
    	}else{
    		res.send('error');
    	}
    })
    //监听端口号
    app.listen(3000,()=>{
    	console.log('服务器运行成功了')
    })
    

    token 配置在 config 文件中,和上一步设置的 token 相同;

    2、模块化

    模块复用,针对上面的代码进行模块化拆分,首先文件改造
    在这里插入图片描述
    将 config 配置和中间件函数提出出来
    1、app.js

    //引入express模块
    const express = require('express');
    //引入auth中间件函数
    const auth = require('./wechat/auth');
    //创建app对象
    const app = express();
    //中间件函数
    app.use(auth());
    //监听端口号
    app.listen(3000,()=>{
    	console.log('服务器运行成功了')
    })
    

    2、config.js

    module.exports={
    	token: "xxs520!!",
    	appID: "wx5e6b8daad9eba98f",
    	appsecret: "8bf76bbeeddf977ef5b3a73cca0b831b"
    }
    

    3、auth.js

    //引入配置对象
    const config = require('config');
    //引入sha1加密工具
    const sha1 = require('sha1')
    module.exports = () =>{
    	return (req,res,next) =>{
    		const { signature, echostr, timestamp, nonce } = req.query;
    		const { token } = config;
    		const sha1Str = sha1([timestamp,nonce,token].sort().join(''));//sha1需要手动安装引入
    		if(sha1Str === signature){
    			res.send(echostr);
    		}else{
    			res.send('error');
    		}
    	}
    }
    

    模块化更多的是一种思想,目的是为例复用项目里面的功能或者方法;

    五、获取 access_token

    开发者文档中-开始开发里有个获取 access_token 的功能,这里面有对 access_token 的介绍,可以先去了解一下;

    1、access_token 是什么?

    access_token 是微信公众号的全局唯一的接口调用凭据,公众号的所有接口都需要使用 access_token ;
    特点:

    access_token 的有效期是 2 个小时,过期之后需要重新获取(提前5分钟请求);
    重复获取将会导致上一次的 access_token 失效;
    日调用量 2000次;

    2、获取 access_token 功能实现

    1、设计思路

    初次调用:发送请求获取 access_token ,然后保存在本地;
    再次调用:去本地读取文件,判断是否过期;过期了重新获取并更新本地保存的 access_token ,没过期则跳过;

    整理:获取 access_token 时判断本地是否有access_token ,没有则获取并保存在本地;有则判断是否过去;

    2、代码实现
    安装 request、request-promise-native:npm i request,npm i request-promise-native

    //引入require-promise-native,返回值是一个promise 对象
    const rp = require('request-promise-native');
    //引入fs,读写文件
    const { writeFile, readFile } = require('fs');
    //引入配置对象
    const { appID, appsecret } = require('../config');
    //定义类,获取access_token
    class Wechat {
    	constructor(){}
    	//获取access_token
    	getAccessToken(){
    		//定义请求地址
    		const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appID}&secret=${appsecret}`;
    		//返回一个promise,保证接口所有的状态都能正常返回
    		return new Promise((resolve, reject)=>{
    			//使用request、request-promise-native 
    			//发送请求
    			rp({method:'GET', url, json:true}).then(res=>{
    				//重写过期时间
    				res.expires_in = Date.now() + (res.expires_in -300)*1000;
    				resolve(res);
    			}).catch(err=>{
    				reject('getAccessToken:'+ err);
    			})
    		})
    	}
    	//保存access_token,将入参保存为文件
    	saveAccessToken(accessToken){
    		accessToken = JSON.stringify(accessToken);
    		return new Promise((resolve, reject)=>{
    			//写入的文件,希写入的内容
    			writeFile('./accessToken.txt', accessToken, err=>{
    				if(!err){
    					resolve();
    				}else{
    					reject('saveAccessToken:'+err);
    				}
    			});
    		})	
    	}
    	//读取access_token
    	readAccessToken(){
    		return new Promise((resolve, reject)=>{
    			//写入的文件,希写入的内容
    			readFile('./accessToken.txt', (err, data)=>{
    				if(!err){
    					data = JSON.parse(data);
    					resolve(data);
    				}else{
    					reject('readAccessToken:'+err);
    				}
    			});
    		})	
    	}
    	//判断access_token是否有效
    	isVaildAccessToken(data){
    		if(!data && !data.access_token && !data.expires_in){
    			return false;
    		}
    		return data.expires_in > Date.now();
    	}
    	//获取access_token
    	fetchAccessToken(){
    		return new Promise((resolve, reject)=>{
    			this.readAccessToken().then(async res=>{
    				//判断是否存在,存在直接读取,不存在则重新请求并保存然后暴露出来
    				if(this.isVaildAccessToken(res)){
    					resolve(res);
    				}else{
    					const res = await this.getAccessToken();
    					await this.saveAccessToken(res);
    					resolve(res);
    				}
    			}).catch(async err=>{
    				const res = await this.getAccessToken();
    				await this.saveAccessToken(res);
    				resolve(res);
    			})
    		})
    	}
    }
    //模拟测试
    const wx = new Wechat();
    wx.fetchAccessToken();
    

    然后在控制台执行这个 js 文件;

    六、自动回复功能

    1、准备工作

    关注自己的测试号:在测试号管理里面扫描 “测试号二维码” 来关注自己的测试号;
    然后在测试号发送消息,消息会由微信公众号平台转发到自己的服务器上;

    微信服务器会发送两种请求的数据给开发者服务器:
    1.1、GET:验证服务器的有效性;
    1.2、POST:微信服务器会将用户的消息以 POST 的方式发送给开发者服务器;
    1.3、微信服务器发送 POST 的消息是 XML 类型的数据,我们需要进一步操作:将数据接收、xml转译成 js 对象,格式化;
    1.4、如果开发者服务器没有回复消息给微信服务器,微信服务器回发送3次消息,所以我们需要在接收到消息之后进行回复;

    2、代码实现

    2.1、直接在 auth.js 文件中修改,改造服务器的有效性方法;

    //引入配置对象
    const config = require('../config');
    const { getUserData, parseXml, formatMsg } = require('../utils/tool');
    const msgTemp = require('./msgTemp');
    const replay = require('./replay');
    //引入sha1加密工具
    const sha1 = require('sha1')
    module.exports = () =>{
    	return async (req,res,next) =>{
    		const { signature, echostr, timestamp, nonce } = req.query;
    		const { token } = config;
    		const sha1Str = sha1([timestamp,nonce,token].sort().join(''));//sha1需要手动安装引入
    		if(req.method == 'GET'){
    			//当前是验证服务器有效性消息
    			if(sha1Str === signature){
    				res.send(echostr);
    			}else{
    				res.end('error');
    			}
    		} else if(req.method == 'POST'){
    			if(sha1Str !== signature){
    				res.end('error');
    			}
    			//接收请求体中数据(用户在客户端发送的消息)
    			let xmlData = await getUserData(req);
    			//将xml解析成js对象
    			let jsData = await parseXml(xmlData);
    			//格式化数据
    			let msg = formatMsg(jsData);
    			//实现自动回复
    			let options = replay(msg);
    			let replayMsg = msgTemp(options);
    			//发送数据给微信服务器
    			res.send(replayMsg);
    		} else {
    			res.end('error');
    		}
    	}
    }
    

    2.2、utils/tool.js:接收到微信服务器后对数据处理的一些常规方法;
    安装 xml2js:npm i xml2js

    const { parseString } = require('xml2js');
    module.exports = {
    	//获取用户发送的消息
    	getUserData(req){
    		return new Promise((resolve, reject)=>{
    			let xmlData = '';
    			//当流式数据传递过来时会触发该事件
    			req.on('data', ()=>{
    				//读取的数据是buffer,需要转换成字符串
    				xmlData += data.tostring();
    			})
    			//数据传递结束时触发,将最终数据返回
    			.on('end', ()=>{
    				resolve(xmlData);
    			})
    		})
    	},
    	//解析xml为js,借助插件
    	parseXml(data){
    		return new Promis((resolve, reject)=>{
    			parseString(data, {trim:true}, (err,data)=>{
    				if(!err){
    					resolve(data);
    				}else{
    					reject(err);
    				}
    			})
    		})
    	},
    	//格式化,去除无用数据,去除空数据,数组转化为key-value
    	formatMsg(msg){
    		let message = {};
    		msg = msg.xml;
    		if(typeof msg === 'object'){
    			for(let i in msg){
    				let value = msg[i];
    				if(Array.isArray(value) && value.length != 0){
    					message[i] = value[0]; 
    				}
    			}
    		}
    		return message;
    	}
    }
    

    2.3、replay.js:对所有收到的消息、事件进行统一处理,这里只是写了一部分;

    //处理接收到的消息
    //处理接收普通消息、接收事件推送
    module.exports = (msg) => {
    	//接收人和发送人需要互换角色
    	let options = {
    		ToUserName:msg.FromUserName,
    		FromUserName:msg.ToUserName,
    		CreateTime:Date.now(),
    		MsgType:msg.MsgType
    	}
    	let content = '初始消息';
    	//普通消息
    	if(msg.MsgType == 'text'){
    		if(msg.Content == '1'){//全匹配
    			content = `测试使用数据1`;
    		}else if(msg.Content.match('2')){//半匹配
    			content = `测试使用数据2`;
    		}
    	}else if(msg.MsgType == 'image' || msg.MsgType == 'voice'){
    		options.MediaId = msg.MediaId;
    	}else if(msg.MsgType == 'video'){
    		...
    	}else if(msg.MsgType == 'shortvideo'){
    		...
    	}else if(msg.MsgType == 'location'){
    		...
    	}
    	//事件推送
    	....
    	options.content = content;
    	return options;
    }
    

    2.4、msgTemp.js:用户服务器回复微信服务器消息的模板封装;

    //回复消息的模板
    module.exports = options =>{
    	//消息模板在官网上获取,由于上一步发送和接收人已经替换,这里不需要再次替换
    	let str = `<xml>
        <ToUserName><![CDATA[${options.ToUserName}]]></ToUserName>
        <FromUserName><![CDATA[${options.FromUserName}]]></FromUserName>
        <CreateTime>${options.CreateTime}</CreateTime>
        <MsgType><![CDATA[${options.MsgType}]]></MsgType>`;
    	if(options.MsgType == 'text'){
    		str += `<Content><![CDATA[${options.content}]]></Content>`;
    	}else if(options.MsgType == 'image'){
    		str += `<Image><MediaId><![CDATA[${options.MediaId}]]></MediaId></Image>`;
    	}else if(options.MsgType == 'voice'){
    		str += `<Voice><MediaId><![CDATA[${options.MediaId}]]></MediaId></Voice>`;
    	}else if(options.MsgType == 'video'){
    		str += `<Video>
    				    <MediaId><![CDATA[${options.MediaId}]]></MediaId>
    				    <Title><![CDATA[${options.title}]]></Title>
    				    <Description><![CDATA[${options.description}]]></Description>
    				  </Video>`;
    	}else if(options.MsgType == 'music'){
    		str += `<Music>
    				    <Title><![CDATA[${options.title}]]></Title>
    				    <Description><![CDATA[${options.description}]]></Description>
    				    <MusicUrl><![CDATA[${options.musicUrl}]]></MusicUrl>
    				    <HQMusicUrl><![CDATA[${options.hqMusicUrl}]]></HQMusicUrl>
    				    <ThumbMediaId><![CDATA[${options.MediaId}]]></ThumbMediaId>
    				  </Music>`;
    	}else if(options.MsgType == 'news'){
    		str += `<ArticleCount>${options.content.length+1}</ArticleCount><Articles>`
    		options.content.forEach(item=>{
    			str += `<item>
    				      <Title><![CDATA[${item.title}]]></Title>
    				      <Description><![CDATA[${item.description}]]></Description>
    				      <PicUrl><![CDATA[${item.picUrl}]]></PicUrl>
    				      <Url><![CDATA[${item.url}]]></Url>
    				    </item>`
    		})
        
        str += `</Articles>`;
    	}
    	str += '</xml>';
    	return str;
    }
    

    这里对接收到的普通消息、事件推送进行统一的处理,对回复消息时的模板也进行了封装;最终可以关注自己的测试号,然后手机上发送消息,然后在控制台查看输出信息;

    七、自定义菜单

    请熟读自定义菜单的文档:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html
    注意:

    1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
    2、一级菜单最多4个汉字,二级菜单最多8个汉字,多出来的部分将会以“…”代替。
    3、菜单必须先删除才能再次创建,不能直接覆盖;

    在 accress_token 模块新增两个方法:新增菜单、删除菜单;也就是为 Wechat 类新增两个方法:

    //自定义菜单
    createMenu(menu){
    	return new Promise(async (resolve, reject) => {
    		try{
    			//获取access_token
    			let data = await this.fetchAccessToken();
    			let url = `https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${data.access_token}`;
    			//发送请求
    			const res = await rp({method:'POST', url, json:true, body:menu});
    			resolve(res);
    		}catch(e){
    			console.log(e);
    		}
    	})
    }
    //删除菜单
    deleteMenu(){
    	return new Promise(async (resolve, reject) => {
    		try{
    			//获取access_token
    			let data = await this.fetchAccessToken();
    			let url = `https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=${data.access_token}`;
    			let res = await rp({method:'GET', url, json:true});
    			resolve(res);
    		}catch(e){
    			console.log(e);
    		}
    	})
    }
    

    先执行删除,在执行新增:

    (async ()=>{
    	//模拟测试
    	const wx = new Wechat();
    	await wx.deleteMenu();
    	await wx.createMenu(menu);
    })()
    

    菜单配置:

    module.exports = {
         "button":[
         	{	
              "type":"click",
              "name":"今日歌曲",
              "key":"V1001_TODAY_MUSIC" //随意设置,在点击事件中会在eventKey获取到
          	},
          	{
               "name":"菜单",
               "sub_button":[
               {	
                   "type":"view",
                   "name":"搜索",
                   "url":"http://www.soso.com/" //跳转的网址
                },
                {
                   "type":"click",
                   "name":"赞一下我们",
                   "key":"V1001_GOOD"
                }]
            }
        ]
    }
    

    可以参考官网上的类型来设置菜单的数据;

    八、微信中的网页开发

    1、简单实现

    借助 ejs 模板引擎来实现在微信中网页的开发,安装 ejs 插件:npm i ejs,在 app.js 同级新建 views 文件夹,然后在文件夹里新建 link.ejs 文件;在app.js 里面使用路由:

    //引入express模块
    const express = require('express');
    //引入auth中间件函数
    const auth = require('./wechat/auth');
    //创建app对象
    const app = express();
    //配置模板引擎目录
    app.set('views','./views');
    //配置模板引擎,可以将数据和模板合并然后生成 HTML 文本
    app.set('view engine','ejs');
    //页面路由
    app.get('/link',(req,res)=>{
    	//渲染页面,将渲染好的页面返回给用户
    	res.render('link');
    })
    //中间件函数
    app.use(auth());
    //监听端口号
    app.listen(3000,()=>{
    	console.log('服务器运行成功了')
    })
    

    link.ejs :跟 html 一样

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title>test</title>
    	</head>
    	<body>
    		<div>sasasasas</div>
    	</body>
    </html>
    

    然后运行 app.js ,就可以在浏览器打开 localhost:3000/link 查看 link 页面的内容了;

    2、JS-SDK

    微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包;通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验;

    2.1、获取 ticket
    jsapi_ticket 是公众号用于调用微信 JS 接口的临时票据。正常情况下,jsapi_ticket 的有效期为7200秒,通过 access_token 来获取。由于获取 jsapi_ticket 的 api 调用次数非常有限,频繁刷新 jsapi_ticket 会导致 api 调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket ;

    获取 ticket 跟获取 access_token 的方法基本一致,我将代码放到获取 access_token 文件中:

    //将文件固定在一个位置创建,防止不同位置调用方法文件创建位置变动
    var path = require('path');
    //获取ticket
    	getTicket(){
    		return new Promise(async (resolve, reject)=>{
    			//获取access_token
    		let data = await this.fetchAccessToken();
    		//定义请求地址
    		const url = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${data.access_token}&type=jsapi`;
    		//返回一个promise,保证接口所有的状态都能正常返回
    			//使用request、request-promise-native 
    			//发送请求
    			rp({method:'GET', url, json:true})
    			.then(res=>{
    				//重写过期时间
    				resolve({
    					ticket:res.ticket,
    					expires_in:Date.now() + (res.expires_in -300)*1000
    				});
    			})
    			.catch(err=>{
    				reject('getTicket:'+ err);
    			})
    		})
    	}
    	//保存ticket,将入参保存为文件
    	saveTicket(ticket){
    		ticket = JSON.stringify(ticket);
    		let file = "./ticket.txt";
    		let fileName = path.resolve(__dirname,file );
    		return new Promise((resolve, reject)=>{
    			//写入的文件,希写入的内容
    			writeFile(fileName , ticket, err=>{
    				if(!err){
    					resolve();
    				}else{
    					reject('saveTicket:'+err);
    				}
    			});
    		})	
    	}
    	//读取ticket
    	readTicket(){
    		let file = "./ticket.txt";
    		let fileName = path.resolve(__dirname,file );
    		return new Promise((resolve, reject)=>{
    			//写入的文件,希写入的内容
    			readFile(fileName , (err, data)=>{
    				if(!err){
    					data = JSON.parse(data);
    					resolve(data);
    				}else{
    					reject('readTicket:'+err);
    				}
    			});
    		})	
    	}
    	//判断ticket是否有效
    	isVaildTicket(data){
    		if(!data && !data.ticket && !data.expires_in){
    			return false;
    		}
    		return data.expires_in > Date.now();
    	}
    	//获取ticket
    	fetchTicket(){
    		return new Promise((resolve, reject)=>{
    			this.readTicket().then(async res=>{
    				//判断是否存在,存在直接读取,不存在则重新请求并保存然后暴露出来
    				if(this.isVaildTicket(res)){
    					resolve(res);
    				}else{
    					const res = await this.getTicket();
    					await this.saveTicket(res);
    					resolve(res);
    				}
    			}).catch(async err=>{
    				const res = await this.getTicket();
    				await this.saveTicket(res);
    				resolve(res);
    			})
    		})
    	}
    

    有些方法跟获取 access_token 的方法基本一样,这里可以将方法改造一下,统一调用;

    2.2、验证 JS-SDK
    规则:
    1、组合参与签名的四个参数:jsapi-tacket临时票据、noncestr随机字符串、timestamp时间戳、url当前服务器地址;
    2、排序、以&拼接,sha1加密;

    let arr = [
    	`jsapi-tacket=${tacket}`,
    	`noncestr=${noncestr}`,
    	`timestamp=${timestamp}`,
    	`url=${uel}/link` //拼接上当前页面的路径
    ]
    let sha1Str = sha1(arr.sort().join('&'));
    

    2.3、使用 JS-SDK(参考官网)
    1、登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”,也就是用户服务器的域名(不带协议名);
    2、引入 js 文件:http://res.wx.qq.com/open/js/jweixin-1.6.0.js,引入之后就有一个 wx 对象可以全局使用;
    3、通过 config 接口注入权限验证配置;
    4、通过 ready 接口处理成功验证;
    5、通过 error 接口处理失败验证;
    6、在页面上使用:

    //配置tacket
    //页面路由
    app.get('/link',(req,res)=>{
        //生成js-sdk
        	//组合参与签名的四个参数:jsapi-tacket临时票据、noncestr随机字符串、timestamp时间戳、url当前服务器地址
        	//排序、以&拼接,sha1加密
        let arr = [
        	`jsapi-tacket=${tacket}`,
        	`noncestr=${noncestr}`,
        	`timestamp=${timestamp}`,
        	`url=${uel}/link` //拼接上当前页面的路径
        ]
        let sha1Str = sha1(arr.sort().join('&'))//渲染页面,将渲染好的页面返回给用户
    	res.render('link');
    })
    

    link.ejs

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title>test</title>
    	</head>
    	<body>
    		<div id="link">语音识别</div>
    		<div class="content"></div>
    		<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
    		//引入zepto 方便操作元素
    		<script type="text/javascript" src="http://cdn.bootcss.com/zepto/1.0rc1/zepto.min.js"></script>
    		<script type="text/javascript">
    			wx.config({
    			  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    			  appId: 'wx5e6b8daad9eba98f', // 必填,公众号的唯一标识
    			  timestamp: <%= timestamp %>, // 必填,生成签名的时间戳
    			  nonceStr: <%= noncestr %>, // 必填,生成签名的随机串
    			  signature: <%= signature %>,// 必填,签名
    			  jsApiList: ['startRecord', 'stopRecord', 'translateVoice'] // 必填,需要使用的JS接口列表
    			});
    			//js-sdk相关功能接口一般在这这里使用
    			wx.ready(function(){
    				// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
    				//所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。
    				//对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    				
    				//验证接口是否有权限,测试阶段使用
    				wx.checkJsApi({
    				  jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
    				  success: function(res) {
    				  // 以键值对的形式返回,可用的api值true,不可用为false
    				  // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
    				  }
    				});
    				//语音识别
    				let isLink = false;
    				//点击操作
    				$('#link').tap(function(){
    					if(!isLink){
    						//开始录音
    						wx.startRecord();
    						isLink = true;
    					}else{
    						wx.stopRecord({
    						  success: function (res) {
    						  	//结束录音后会自动上传到微信服务器,并返回一个对应id
    						    var localId = res.localId;
    						    isLink = false;
    						    //转化为文字
    						    wx.translateVoice({
    							  localId: localId, // 需要识别的音频的本地Id,由录音相关接口获得
    							  isShowProgressTips: 1, // 默认为1,显示进度提示
    							  success: function (res) {
    							    $('.content').html(res.translateResult)
    							  }
    							});
    						  }
    						});
    					}
    				})
    			});
    			wx.error(function(res){
    				// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,
    				//也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
    			});
    		</script>
    	</body>
    </html>
    

    九、vue 项目部署在公众号上使用

    1、在vue项目 index.html 文件中引入 http://res.wx.qq.com/open/js/jweixin-1.6.0.js,引入之后就可以全局使用 wx 对象;
    2、配置 wx.config ,这里是使用 JS-SDK 的一下基础配置项,在项目初始化的时候调用一次;
    3、然后在wx.ready 里面处理 JS-SDK 提供的一些调用接口;
    4、代码打包,发布到线上,由公众号服务端调用对应的页面就可以了;

    以上就是微信公众号开发的内容了,根据视频学习;这里只是借助视频资料大致的了解和实现部分功能;

    展开全文
  • 个人微信公众号做外卖优惠券怎么

    千次阅读 热门讨论 2021-06-16 16:55:32
    一定是引流到公众号,小程序是用完即走,不具备留存能力,也不方便做用户激活,如果把用户引流到小程序,用户产出会大大下降。 认识的大量投信息流的伙伴,都是引流到公众号,小程序仅用来做服务。另外外卖小程序...

    为什么要用公众号?因为小程序属于用完即走的产品,不具备留存能力,如果把用户引入小程序,不方便做促活,后期产出就会大大下降。但个人只能注册到微信订阅号,订阅号是不能加网址链接的,怎么办?

    下面我分两个步骤,带你完成外卖优惠券公众号的搭建。
    第一步:关注公众号回复消息
    如下图在微信公众号平台找到自动回复设置界面

    把我们的想好的文案放到上图位置,并保存。

    这里要注意下文案加链接的代码 
     

    <a href="这里放你自己的链接">美团优惠券</a>


    当用户第一次进入公众号时,可以看到下图的消息提示。
     


    第二步:公众号菜单的设置
    虽然个人微信公众号不支持加网址链接,但是支持加入微信小程序的链接。美团和饿了么都提供小程序的页面地址,如果想给粉丝返利,需要借助第三方的外卖系统才可以实现,我截图的公众号对接的是推劵客的程序,当然外卖系统还有很多,比如小飞侠、美赞都有这类系统。下面再来看看个人公众号如何设置小程序菜单链接。
    如下图:找到“自定义菜单”,然后在框选的地方选择小程序页面。设置后就和上一张图片效果一致。

    到这里就完成了一个微信外卖公众号的搭建了,现在你知道外卖优惠券怎么弄吧。

     

    展开全文
  • 外卖优惠券的确是今年比较火的一个cps项目,但我要说的是,外卖优惠券没有你想象的那么挣钱,主要是因为外卖客单价低、佣金比例低、同质化比较严重。从我的角度,最好还是把淘客和外卖组合起来做。其他废话不多说,...
  • 页面写了Css里面有动画,body里面写了svg,怎么才能放在微信公众号排版并且能浏览到动画?
  • 前些天闲来无事想个微信公众号机器人,因为可以用机器人做好多事情,比如可以让它变成一个智能聊天机器人,也可以让它爬取并推送arxiv上自己想要的论文,还可以让它绘制并推送有关肺炎疫情的曲线图等等,所有的...
  • 最近,看到公众号运营群里面,很多小伙伴带着急功近利的色彩。组织各种各样的互推车,一下就开7-8两互推车。一个很多小号。我真怀疑这些人的真实动机。为了增长粉丝,不断的刷新别人的三观。下...
  • 微信公众号沒有页面模板怎么呢?假如你还不清楚,能够 看一下我下面详细介绍哦,期待能够 帮到大家,起来瞧瞧吧。微信公众号页面模板微信公众号后台管理发布了“页面模板”功能,网页页面模板功能,是给公众号...
  • 在网上花费好多币回来的,对我帮助不大。分享给需要的人
  • 最近和朋友们一个公众号,初衷很简单,输出一些技术文章(案例带源码讲解)。酒好也怕巷子深,更何况我这酒属于初酿。我就想着把我公号的二维码放在博客主页上,让更多的读者关注我。 我们公号的名字叫“源代码...
  • 今天在给客户做公众号开发的时候,出现了一个问题:客户有一个商城,还有两个独立的系统,都需要网页授权来获取用户信息,但是公众号只能设置两个业务域名,不满足业务需求,寻找解决办法。 实现原理:做一个code...
  •   最近遇到的一个问题是如果在1台云服务器上部署2个公众号后台,该怎么操作的问题。由于公众号服务器配置的特殊性,比如正确响应微信发送的Token验证,必须以http://或https://开头,分别支持80端口和443端口。在...
  • 自己搭建了一个美团外卖红包的公众号

    千次阅读 热门讨论 2020-11-22 04:23:29
    自己空闲个公众号挂到上面了,提取出来链接是长期有效的,属于那种每天的都可以领取 次的,只要你之前领取的优惠券使用过了,就可以再去领取。 经常点外卖的可以关注一下,公众号,优惠侦探,如下图,菜单...
  • 微擎公众号接入教程

    2022-02-17 14:28:13
    登录微擎后台  平台管理栏目  平台列表  点击【添加平台】按钮  选择【新建公众号】  选择【手动添加公众号】  填写各项参数  直接下一步  按页面提示进行公众号后台设置,最后检测是否接入成功 ...
  • 腾讯在微信现有的基础上开发了一个新的功能模块,叫微信公众平台。开发者或者商家可以在微信公众平台上申请应用账号,即微信公众号。通过微信公众号,可以实现和特定群体的文字、图片、语音、视频的全方位沟通、互动...
  • 如何申请注册微信公众号

    万次阅读 2021-07-09 11:31:27
    或者可以打开微信,在搜索栏输入“微信团队”,然后在聊天框输入“注册公众号”,点击发送,微信团队会给你发送一个网址,复制链接即可。 手机用户也可以,将手机浏览器设置成网页版,然后方法同上。 2. 进入...
  • C#开发微信公众号实现消息自动回复

    热门讨论 2015-09-24 23:08:33
    作为计算机学院的学生的学生,时刻在打计算机学院官网的主意,前段时间我的一个好基友在我面前炫耀他的能够查课表的公众号(服务模拟登录返回数据),把我眼红得,所以我暗自下决心,自己一定要个微信公众号来玩...
  • 公众号怎么抽奖链接_分享几款公众号抽奖活动
  • 微信公众号标题栏设置报名专栏,自我编写, 具有参考价值
  • 公众号排版是运营公众号很重要的部分,今天伯乐网络传媒将从下面四方面进行分享,建议公众号运营小白点赞收藏哦。 为什么要进行公众号排版? 公众号运营要知道哪些最基本的? 进行公众号排版会用到哪些工具? ...
  • 微信报名小程序怎么_教你微信公众号添加报名表的方法
  • 公司原来所有用户用同一个公众号 ,处于代理功能需要 代理商公众号 所有代理商的用户 用他们的公众号 我目前的想法:把代理商的appid secret token 存在数据库 关键是没办法知道调用那一条  ...
  • 个人创建微信公众号步骤

    千次阅读 2021-01-08 14:21:03
    选择帐号类型; 2、填写邮箱,登录您的邮箱,查看激活邮件,填写邮箱验证码激活;...5、填写帐号信息,包括公众号名称、功能介绍,选择运营地区; 恭喜注册成功!可以开始使用公众号了~ ...
  • 一个有趣公众号的简介-网络灯下黑

    千次阅读 2020-09-16 08:38:56
    关注这个公众号已经很久了,今天下载东西时,突然发现作者的简介,深有同感,搬运过来,共觞。 获取更多好玩有趣的资源,请关注微信公众号 网罗灯下黑 wldxh8 公众号简介: 我、为什么、这时候、微信公众号 我 80后...
  • 微信公众号机器人详细教程

    千次阅读 热门讨论 2021-08-31 12:41:34
    文章目录.申请机器人二.接入机器人 .申请机器人 微信对话开放平台: https://openai.weixin.qq.com/ 依次如下: 扫码: 填写信息: 技能: 发布: 机器人信息编辑: 绑定应用: 然后又是微信扫码,点击...
  • 微信公众号如何推广自己的小... 微信公众号投放广告,一方面可以增加粉丝、另外一个可以推广自己的产品,促成销售。主要操作步骤是通过竞价购买,按cpc扣费。操作步骤是广告主可以登陆微信公众平台-广告主模块,点击创
  • 随着自媒体时代的到来 ,很多企业、单位、个人都申请了微信公众号,但是,一个微信公众号如何才能发挥出应有的效果呢?从今天开始,我将总结我的运营经验。上图是第一部分,微信公众号的建立流程图。
  • 在使用微信公众号时,需要先将已有的网站与微信服务器做关联;如何做关联? 在调试过程中,我尝试过很多种可能; 1.在微信公众号开发文档中寻找相关解读资料...1.先在自己的网站上,先调试成功,我先设置好的是hello

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,115
精华内容 11,646
热门标签
关键字:

如何自己弄一个公众号

友情链接: 404499_9826f15cfaa4a827.rar