微信开放平台-第三方平台开发PHP解密微信推送消息时的方式

在对接微信开放平台
解密微信推送消息的时候
使用了官方给的解密文件和方法
php代码如图
图片描述

但是解密后的msg在日志里是空字符串,可Ticket却解密出来了

图片描述

不能理解的是
使用simplexml_load_string的方式拿到的对象也是空的,这个我能理解,因为msg是空字符串
但是使用DOMDocument的方式loadXML后为什么能取到这个ticket呢?
解密后的msg明明是空的啊

为什么使用simplexml_load_string和DOMDocment的差别这么大呢

请大家给指点下

阅读 3.9k
1 个回答

我是这样解的,你可参考以下:

//解密获取ComponentVerifyTicket
$encodingAesKey = '';    //申请时填写的"消息加解密Key"
$token = '';  //申请时填写的"消息校验Token"
$appId = '';  //申请时填写的"消息校验Token"
$msg_signature = $request['msg_signature'];
$timestamp = $request['timestamp'];
$nonce = $request['nonce'];
$encryptMsg = file_get_contents('php://input');

libxml_disable_entity_loader(true);
$xml_obj = (array)simplexml_load_string($encryptMsg, 'SimpleXMLElement', LIBXML_NOCDATA);

// 重新拼接xml
$encrypt = $xml_obj['Encrypt'];
$encryptMsg = sprintf("<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>", $encrypt);

// 解密
$pc = new WXBizMsgCrypt($token, $encodingAesKey, $appId);
$pc->WXBizMsgCrypt($token, $encodingAesKey, $appId);
$msg = '';
$errCode = $pc->decryptMsg($msg_signature, $timestamp, $nonce, $encryptMsg, $msg);
if ($errCode) {
    return $errCode;
}
else {
    libxml_disable_entity_loader(true);
    $xml_obj = (array)simplexml_load_string($msg, 'SimpleXMLElement', LIBXML_NOCDATA);
    // 返回ComponentVerifyTicket
    return $xml_obj['ComponentVerifyTicket'];
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进