先放上微信开放平台文档
1,常规的配置
需要管理员去授权填写相关信息以及地址等等
点击授权如果报错暂时没有相关权限或者该第三方平台未发布等错误,可能就是你的测试公众号不是在测试的授权公众号列表,添加一下就好。
2,获取10分钟推送ticket
这是我自己写的代码
private function dealTicket($postStr, $data)
{
//XML 里面Encrypt 节点的内容
$xml = new \DOMDocument();
$xml->loadXML($postStr);
//获取密文
$arrayE = $xml->getElementsByTagName('Encrypt');
$encrypt = $arrayE->item(0)->nodeValue;
//组装密文
$format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>";
$format_xml = sprintf($format,$encrypt);
//实例化解密类
$wxb = new \WXBizMsgCrypt(TOKEN,KEY,APPID);
//第三方接收到公众平台的消息 解密
$msg = "";
$errCode = $wxb->decryptMsg(
$data['msg_signature'],
$data['timestamp'],
$data['nonce'],
$format_xml,
$msg
);
if ($errCode == 0) {
$xml->loadXML($msg);
//获取ticket
$array = $xml->getElementsByTagName('ComponentVerifyTicket');
$data['ComponentVerifyTicket'] = $array->item(0)->nodeValue;
CouponComponentVerifyTicket::add($data);
} else {
//错误解析存入日志
CouponVerifyTicketLog::addLog('ticket解析错误','ticket_false'.$errCode);
}
接下来是大佬给我改良的代码,一步搞定
$postStr = file_get_contents("php://input");
if($postStr){
$postStr = str_replace("AppId","ToUserName",$postStr);
$wx = new WechatComponent('xxxx');
$msg = $wx->msgCrypt($postStr);
if($msg){
$wxData = (array)(simplexml_load_string($msg, 'SimpleXMLElement', LIBXML_NOCDATA));
switch ($wxData['InfoType'])
{
case 'component_verify_ticket':
//更新tocket
$wx->updateVerifyTicket($wxData);
}
exit('success');
}
}
exit('fail');
}
为什么要在str_replace 替换AppId为ToUserName 在微信的解密demo有这样的一个方法
public function extract($xmltext)
{
try {
$xml = new DOMDocument();
$xml->loadXML($xmltext);
$array_e = $xml->getElementsByTagName('Encrypt');
$array_a = $xml->getElementsByTagName('ToUserName'); //看这里
$encrypt = $array_e->item(0)->nodeValue;
$tousername = $array_a->item(0)->nodeValue;
return array(0, $encrypt, $tousername);
} catch (Exception $e) {
print $e . "\n";
return array(ErrorCode::$ParseXmlError, null, null);
}
}
发送的消息和demo接收的不一样,这样就很尴尬,所以直接替换掉,会比较简单。
3,获取component_token
4,获取pre_auth_code
以上两个步骤,处理相关的数据存储起来就好了
5,授权事件,接收微信access_token 和refresh_token
6,微信卡券创建以及领取jssdk 都是用的之前微信授权返回的授权公众号授权给第三方平台后,第三方平台通过“接口说明”中的 api_authorizer_token 接口得到的 token,而不是当前的第三方平台的基础token (画重点)