首先登陆微信公众平台 https://mp.weixin.qq.com
,在开发->基本配置中填写服务器配置(接收处理微信消息的地址)
保存好你的配置,在加解密时须要使用。php
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数以下表所示:服务器
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者经过检验 signature
对请求进行校验(下面有校验方式)。若确认这次GET请求来自微信服务器,请原样返回 echostr
参数内容,则接入生效,成为开发者成功,不然接入失败。微信
加密/校验流程以下:微信公众平台
token
、timestamp
、nonce
三个参数进行字典序排序sha1
加密signature
对比,标识该请求来源于微信public function validate() { $echoStr = Input::get('echostr'); if (!empty($echoStr)) { $signature = Input::get('signature'); $timestamp = Input::get('timestamp'); $nonce = Input::get('nonce'); $tmpArr = [ '你配置的Token', $timestamp, $nonce ]; sort($tmpArr); $tmpStr = implode('', $tmpArr); $tmpStr = sha1($tmpStr); if ($tmpStr == $signature) { echo $echoStr; exit; } } }
PHP示例代码下载:下载dom
微信官方文档:加密解密技术方案异步
首先获取微信发送的XML数据:加密
$xmlString = file_get_contents("php://input");
使用下载的示例代码解密消息:spa
//提供提取消息格式中的密文 XmlParse类在xmlparse.php里 $secretData = (new XmlParse())->extract($xmlString); //对密文进行解密 Prpcrypt类在pkcs7Encoder.php里 $result = (new PrpCrypt('你配置的EncodingAESKey'))->decrypt($secretData[1]);
以后就根据具体业务来实现了:code
$xmlFormatData = simplexml_load_string($result[1], 'SimpleXMLElement', LIBXML_NOCDATA); $event = (string)$xmlFormatData->Event; $eventKey = isset($xmlFormatData->EventKey) ? (string)$xmlFormatData->EventKey : ''; $openId = (string)$xmlFormatData->FromUserName; $toUserName = (string)$xmlFormatData->ToUserName; //事件处理 if ($event === 'VIEW' || $event == "CLICK") { //自定义菜单事件 } if (!$eventKey && $event == "subscribe") { //扫描公众号二维码关注事件 } if ($eventKey && $event == "subscribe") { //扫描二维码关注事件 } if ($eventKey && $event == "SCAN") { //扫描生成的二维码 } if ($event == "unsubscribe") { //取消关注事件 } if ($event === 'card_pass_check' || $event === 'card_not_pass_check') { //卡券审核经过或审核未经过事件 } if ($event === 'user_get_card') { //卡券领取事件 } if ($event === 'user_consume_card') { //卡券核销事件 } //其余事件不处理 return false;
须要发送加密消息时:orm
$wxBizMsg = new WxBizMsgCrypt('你配置的Token', '你配置的EncodingAESKey', '你公众号的APPID'); //加密后的消息,传引用 $encryptMsg = ''; //未加密的消息为XML格式的字符串 echo $wxBizMsg->encryptMsg('未加密的消息', time(), str_random(16), $encryptMsg);
假如服务器没法保证在五秒内处理并回复,必须作出下述回复,这样微信服务器才不会对此做任何处理,而且不会发起重试(这种状况下,可使用客服消息接口进行异步回复),不然,将出现严重的错误提示。
详见下面说明:
一旦遇到如下状况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时没法提供服务,请稍后再试”:
具体的各类XML格式见:被动回复用户消息