微信消息推送服务器吗,消息推送

# 消息推送

接入微信小程序消息推送服务,可以两种方式选择其一:

# 开发者服务器接收消息推送

开发者需要按照如下步骤完成: 填写服务器配置

验证服务器地址的有效性

据接口文档实现业务逻辑,接收消息和事件

# 第一步:填写服务器配置

登录小程序后台后,在「开发」-「开发设置」-「消息推送」中,管理员扫码启用消息服务,填写服务器地址(URL)、令牌(Token) 和 消息加密密钥(EncodingAESKey)等信息。 URL: 开发者用来接收微信消息和事件的接口 URL。开发者所填写的URL 必须以 http:// 或 https:// 开头,分别支持 80 端口和 443 端口。

Token: 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。

EncodingAESKey: 由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式(默认)、兼容模式和安全模式。可以选择消息数据格式:XML 格式(默认)或 JSON 格式。

eaea012db80a3c9822b81d1a8129d690.png

模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。切换加密方式和数据格式需要提前配置好相关代码,详情请参考 消息加解密说明。

# 第二步:验证消息的确来自微信服务器

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数 描述 signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

timestamp 时间戳

nonce 随机数

echostr 随机字符串

开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次 GET 请求来自微信服务器,请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下: 将token、timestamp、nonce三个参数进行字典序排序

将三个参数字符串拼接成一个字符串进行sha1加密

开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

验证URL有效性成功后即接入生效,成为开发者。

检验signature的PHP示例代码:

private function checkSignature()

{

$signature = $_GET["signature"];

$timestamp = $_GET["timestamp"];

$nonce = $_GET["nonce"];

$token = TOKEN;

$tmpArr = array($token, $timestamp, $nonce);

sort($tmpArr, SORT_STRING);

$tmpStr = implode( $tmpArr );

$tmpStr = sha1( $tmpStr );

if ($tmpStr == $signature ) {

return true;

} else {

return false;

}

}

PHP示例代码下载:下载

# 第三步:接收消息和事件

当某些特定的用户操作引发事件推送时(如用户向小程序客服发送消息、或者进入会话等情况),微信服务器会将消息(或事件)的数据包以 POST 请求发送到开发者配置的 URL,开发者可以依据自身业务逻辑进行响应。

微信服务器在将用户的消息发给开发者服务器地址后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有 msgid 的消息推荐使用 msgid 排重。事件类型消息推荐使用 FromUserName + CreateTime 排重。

服务器收到请求必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试,否则,将出现严重的错误提示。详见下面说明: 直接回复success(推荐方式)

直接回复空串(指字节长度为0的空字符串,而不是结构体中content字段的内容为空)

若接口文档有指定返回内容,应按文档说明返回

对于客服消息,一旦遇到以下情况,微信会在小程序会话中向用户下发系统提示“该小程序客服暂时无法提供服务,请稍后再试”: 开发者在5秒内未回复任何内容

开发者回复了异常数据

如果开发者希望增强安全性,可以在开发者中心处开启消息加密,这样,用户发给小程序的消息以及小程序被动回复用户消息都会继续加密,详见消息加解密说明。

# 云函数接收消息推送 需开发者工具版本大于 1.02.1904220,目前需 Nightly Build

开通了云开发的小程序可以使用云函数接收消息推送,目前仅支持客服消息推送。

接入步骤如下: 开发者工具中填写配置并上传

云函数中处理消息

# 第一步:开发者工具中填写配置并上传

在项目根目录下新建消息推送配置文件 temp-cloud-callback-config.json 并在填写完成后右键该文件选择上传配置。

配置文件格式如下(以客服消息推送配置为例):

{

"enable": true,

"callbacks": [

{

"msgType": 1,

"functionName": "云函数名",

"env": "环境ID"

}

]

}

字段说明: enable: 只有为 true 时云函数消息推送才会启用,否则所有云函数消息推送都不会生效

callbacks: 接收推送的所有云函数配置

callbacks.msgType: 消息的 msgType,客服消息的 msgType 为 1

callbacks.functionName: 接收消息推送的云函数名称

callbacks.env: 云函数所在环境

写好后,右键该文件,选择上传配置。

# 第二步:云函数中处理消息

云函数被触发时,其 event 参数即是接口所定义的 JSON 结构的对象(统一 JSON 格式,不支持 XML 格式)。

以客服消息为例,接收到客服消息推送时,event 结构如下:

{

"FromUserName": "ohl4L0Rnhq7vmmbT_DaNQa4ePaz0",

"ToUserName": "wx3d289323f5900f8e",

"Content": "测试",

"CreateTime": 1555684067,

"MsgId": "49d72d67b16d115e7935ac386f2f0fa41535298877_1555684067",

"MsgType": "text"

}

此时可调用客服消息发送接口回复消息,一个简单的接收到消息后统一回复 “收到” 的示例如下:

// 云函数入口文件

const cloud = require('wx-server-sdk')

cloud.init()

// 云函数入口函数

exports.main = async (event, context) => {

const wxContext = cloud.getWXContext()

await cloud.openapi.customerServiceMessage.send({

touser: wxContext.OPENID,

msgtype: 'text',

text: {

content: '收到',

},

})

return 'success'

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值