微信公众号与小程序开发实践及安全策略梳理总结

2025-05-30
来源:万象资讯

概述

留出些许时刻,对微信公众号及小程序的实际操作进行一番整理,从中提炼出一些感悟与体会。公众号与小程序在产品定位上有所区别,公众号在开发过程中享有较高的权限和较大的自由度,支持的消息事件类型也较为多样;相对而言,小程序更侧重于用户体验,其认证权限也较为严格,发布前还需经过审核及版本发布等流程。

开发接入流程

以下图表展示了公众号与小程序的接入开发流程,如遇困惑,建议先查阅官方网站,官网内容讲解得较为详尽。接下来,我将从几个关键点进行详细说明:,

安全策略

1、、、Ip白名单

微信公众号及小程序均设有独立的安全措施,其中首要举措便是与相关方协作,一旦察觉到异常情况,便能够进行重置或采取冻结措施。

在公众号的设置与开发模块,具体到功能设置部分,需要配置业务域名、JS接口安全域名以及网页授权域名。完成这些设置后,还需在相应设置中下载加密文件,并将该文件存放在域名的根目录位置。

小程序的配置途径位于“开发与服务”菜单下的“开发设置”选项中,其中包含服务器域名设置。相较于公众号,小程序新增了开发者IP白名单和小程序上传代码IP白名单的功能,而这两个IP白名单的默认状态均为关闭。

2、用户认证

微信网页授权依托于.0机制进行,其可操作的API种类比小程序更为丰富,小程序则是通过这种方式来获取用户的身份信息;在同一个应用中,每个用户都有一个唯一的标识符,这个标识符在同一个应用中保持不变,作为用户身份的独一标志。

1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权(与基础支持中的不同)

3、如果需要,开发者可以刷新网页授权,避免过期

4、通过网页授权和获取用户基本信息(支持机制)

公众号的网页授权流程,通常在进展至第二个阶段时,即可通过获取code来实现,确认用户身份后,方能进行后续的操作。值得注意的是,对于小程序而言,需借助生成的特定方式来获取,服务端的相关代码如下:

//小程序 Talent类继承自MY_Controller基类 { LOGIN的值为“https://api.weixin.qq.com/sns/jscode2session”。 定义一个私有函数,用于获取openid,该函数接受一个名为$js_code的参数。 { 若存在本类配置中的微信应用ID,则将其赋值给$appid,否则将$appid设为空字符串。 若存在该对象的配置数组中定义了微信应用的密钥,则将其赋值给变量$secret;否则,将$secret赋值为空字符串。 若appid为空且secret也为空,{ 执行显示结果操作,参数分别为1000和字符串“请与管理人员取得联系,确认是否已绑定小程序”。 } $data = [ 'appid' => $appid, 将“secret”替换为“$secret”,以示区分。 'js_code' 对应于 $js_code, 将 'grant_type' 的值设定为 'authorization_code'。 ]; 执行登录操作时,我们通过curl_json函数获取了结果,该函数拼接了类常量LOGIN与查询参数,这些参数是通过http_build_query函数对$data数组进行编码后形成的查询字符串。 若存在键名为“openid”的元素于变量$res中,{ 返回该结果中的用户唯一标识符。 } else { 执行展示结果操作,参数分别为1000和“未能成功获取有效的OpenId”。 } } }

事件与响应

公众号和小程序在处理接入请求的顺序上存在显著差异。公众号后台需设置一个URL,以便微信公众号的服务能够回调至该URL。在绑定之前,必须进行验证。若设置不当,系统将提示错误信息。微信公众号的$符号与自定义匹配成功时,将显示调用成功的提示。成功后,双方即可进行交互。如对操作有疑问,可查阅我之前发布的博客。

公众号上内容繁多,而小程序则显得相对单一,小程序主要获取用户的是内部调用,以下展示的是公众号的事件代码。

Request类继承自MY_Wechat { public function console(){ //关注公众号推送 $posts = $this->posts; 若$posts数组中存在键为'openid'的元素,则将该元素的值赋给$this->openid;若不存在,则将$this->openid的值设为空字符串。 若未检测到$_GET数组中存在键名为'openid'的元素,{ 执行结果为:$res = $this->验证签名方法(); if($res){ echo $res; return true; }else{ return false; } }

开发微信小程序要会什么语言_微信公众号开发流程_小程序安全策略

若存在$posts数组中的'MsgType'键对应的值,则将其赋值给$msgType变量,否则将$msgType变量设置为空字符串。 若$posts数组中存在键名为'Event'的元素,则将该元素赋值给$event变量,否则将$event变量赋值为空字符串。 switch ($event){ case 'subscribe': $this->subscribe($posts); break; case 'unsubscribe': $this->unsubscribe(); break; } } }

推送消息

公众号主要负责发布模板信息,而小程序则专注于用户订阅,公众号在发送信息方面几乎不受任何限制,相对而言,小程序的推送则取决于用户的主动行为,用户必须先订阅并授权消息,获得相应权限后才能接收推送。若用户未进行授权,推送过程中可能会出现以下错误提示信息:

# 公众号错误状态码 错误代码为43004,提示信息为需要订阅rid:657c07fa-7c3f3c23-2e1c7d41。 # 小程序错误状态码 错误代码为43101,提示信息为用户拒绝接收消息,消息识别码为674d4fb2-7ac109d7-356532c2。

1、获取

存储期限届满后,数据既可保存在本地文件中,亦能存入缓存系统;令人称奇的是,公众号与小程序在调用获取数据的API时,所使用的接口是相同的。

执行#GET请求,目标地址为https://api.weixin.qq.com/cgi-bin/token。 #Redis 存储 定义一个私有函数,名为_get_access_token。 { 我引入了名为'RedisBase'的库。 此操作中,通过调用redisbase对象的get方法,成功获取了名为'access_token'的键对应的值,并将其赋值给$access_token变量。 若存在$access_token变量且其不为空,{ 将访问令牌赋值给当前对象的access_token属性。 return true; } 此代码行中,通过调用`params_format`方法,将`GET_ACCESS_TOKEN_URL`与参数`$params`相结合,生成了获取访问令牌的URL。 获取访问令牌的URL内容被成功读取,并存储在变量$json中。 执行解码操作后,将获取到的JSON数据转换为数组形式,赋值给$result变量。 将结果数组中的`access_token`值赋值给本对象的`access_token`属性。 将结果中“expires_in”对应的值转换为整数,再减去100。 此操作中,$this->redisbase对象将"access_token"键值对存储至缓存,同时将获取到的$result数组中的"access_token"值作为值,并将$expires变量指定的过期时间作为参数,完成这一设置。 return true; } #文件缓存 定义了一个受保护的方法,用于获取访问令牌。 { $file = $this->config->config['site_dir']加上"cache"目录中的"wechat_access_token.php"文件。 若目录不存在于文件路径中,{ 创建目录时,指定目录名为变量$file所指向的值,赋予其权限0777,并确保创建过程为递归模式。 } if (file_exists($file)) { //读取内容 获取文件内容后,将结果赋值给变量 $con。 将接收到的内容解码为JSON格式,并确保转换结果为真数组形式。 若$data数组中存在非空值的'access_token'键和'expires_in'键。 若该数据中的过期时间戳大于当前时间戳,{ } 返回$data数组中键名为'access_token'的值。 } } } //略 //写入缓存文件 $con = [ 将 'access_token' 映射至 $res['access_token'],逗号分隔。 'expires_in' 对应的时间设置为当前时间加上 $res['expires_in'] 指定的时间长度。 ]; 执行json_encode函数,将变量$cone的值转换为JSON格式,同时设置JSON_UNESCAPED_UNICODE标志,确保输出结果中的非ASCII字符不会被转义。 执行文件写入操作后,变量 $count 被赋值为该操作返回的结果值。 if ($count <= 0) { return false; } return $res['access_token']; }

在推送消息之前,小程序和公众号必须满足一定的条件。具体到小程序的推送,必须对模版字段格式、模版ID以及长度进行规范化处理,否则系统将显示错误信息:其中,模版字段格式和模版ID的对应关系为空,错误代码为“rid: --”。

模板数据保持一致,模板的标识符及架构必须准确无误,且长度不得超出既定限制,其基本Json格式如下:

{ "thing17": { "value": "面访方案审批" }, "thing49": { "value": "济南龙腾人力资源管理有限公司" }, "thing6": { "value": "无" }, "name1": { "value": "邢海燕" }, "time2": { 该记录的“时间戳”为:2024年11月30日13时31分14秒。 } }

使用PHP语言,编写的小程序和公众号推送的Demo

#小程序推送Demo 向微信API发送POST请求,访问路径为https://api.weixin.qq.com/cgi-bin/message/subscribe/send。 将给定的JSON字符串解码,并转换为数组形式存储在$template_data变量中。 $data = [ "template_id" 对应于 "$push_message" 中的 "examine_template",即:将 "$push_message" 里的 "examine_template" 值赋给 "template_id"。 将“page”变量赋值给$push_message数组中的“push_url”键。 'touser'对应于$push_message中的'to_openid'字段。 将'data'变量赋值给$template_data。 'miniprogram_state' 被定义为 'formal' ,代表正式状态,与 'formal' 相同。 将语言标识符从'lang'更改为'zh_CN'。 ]; 执行curl_json函数,参数包括self::SEND_MESSAGE拼接上问号和access_token,然后是逗号和数据,得到$result。 ## 公众号推送 $url等于"https://api.weixin.qq.com/cgi-bin/message/template/send",其中包含一个查询参数,即access_token,其值为通过调用this对象中的_get_access_token方法获取的。 $params = [ 将“page”替换为当前实例的配置数组中“base_url”对应的值。 'miniprogram' => [ 将 'appid' 映射至 `$this->cf['wechat_AppID']`,即:将 'appid' 的值替换为 `$this->cf` 数组中 'wechat_AppID' 对应的值。 'pagepath' 对应于 '$push_info' 数组中的 'push_url' 元素。 ], 将推送信息中的内容字段解析为JSON格式,并确保解码结果为真。 ]; 执行curl_json方法,将URL和参数传入,获取$result变量。

分享