sbzhu / weworkapi_php

official lib of wework api
https://work.weixin.qq.com/api/doc
355 stars 286 forks source link

use OpenSSL instead of Mcrypt #14

Closed xiaoyouxi01 closed 6 years ago

xiaoyouxi01 commented 6 years ago

使用OpenSSL替换Mcrypt,以兼容新版PHP。 使用Wampserver 3.1.3 64bit测试,PHP 5.6.35、7.0.29、7.1.16、7.2.4这4个版本下均正常运行。

根据官方文档:http://php.net/manual/zh/intro.mcrypt.php Mcrypt扩展从 PHP 7.1.0 开始废弃;自 PHP 7.2.0 起,会移到 PECL。

sbzhu commented 6 years ago

xiaoyou你好,感谢你提交更正! 我之前也尝试用OpenSSL替换,但是发现php的OpenSSL加解密库,在极少情况下会与c++的加解密库不匹配。 下面是我们发现的测试案列,用C++库和php的Mcrypt库都能正确解密,但是OpenSSL会解密失败。能麻烦你也用此案测试下么~

<?php /*
 * Copyright (C) 2018 All rights reserved.
 *   
 * @File encrypt_0.php
 * @Brief 
 * @Author abelzhu, abelzhu@tencent.com
 * @Version 1.0
 * @Date 2018-04-19
 *
 */

include_once "WXBizMsgCrypt.php";
include_once "sha1.php";
include_once "xmlparse.php";
include_once "pkcs7Encoder.php";
include_once "errorCode.php";

echo "######################### 解包测试";
#
$encrypt = "g8fFI09QX1P0VkTitnAAX4p9aHncZBeQKLfmTkBIc+tAB+JKAIeYzRmAdteQ32T9cXkD1Pfk4YLKG625ypRzVVZPnyL2ENGr8P0tnltwbMGCWK6H2FcQJ3UhtZcWi5y0Yvias+VgcRpLO1DEzT0mmt8fBvrDcGbaOcQ0nAJzLqcCP3fb480L/m6YUh/6T3hXIDGLYoYsvLXAuEFZBcFltIS9uMVlnCp0ebN8Zoc3kV8XSsmqWj9QcDl18UUYrDrl0KeQ02CgvIfZXXaqw9YxJ7/jWHV4769HGJnTP4cjBIdTxdbHidgdgH1jB4GpkguXfrk3Zd6nFvGzKWHZpebFZXD39GK4CG0zqjsKltaklFjB3mpAiuGaTx/kU8hVcum9qEORTjIXPzaiA3cti6jM+fwOWPaS74xp0axwssx9J/NyCtr1ZwqbQv3Duk03J7I2aDF4Yvxp1v8QRH7t1AXhMZReXKcU4X/QJ5QF5bRytY2N48O3syMA9SU0dzDAOUW+OXa2P2+cGzoPzo4xMi6aLJtYMO+PZM23v8OlSg1D9CapQ+LuUzHALQ2hJ2rI/O3shIMF0h7FjLDSXy3h+5Ws39pHZU6UNNSBOn6CRfPnsZT0LlNidgc30xXp/uEMNHkg035tVbz/lA2tOV6JgOBYKMxsgRsBqJ4igwsyZxtO0cQ=";
$key = "k66bejMf9xG6XL7dheRDUBYRRiazprVgLZ0GIq4i0y/";

$appid = "wx0449cb288a23c7c3";
$pc = new Prpcrypt($key);
echo "decode : \n";
$result = $pc->decrypt($encrypt, $appid);
var_dump($result);
xiaoyouxi01 commented 6 years ago

我完全是PHP新手啊,代码胡乱写的,请不要见怪。。 看到您能回复,我很开心~ 原来老大也有在考虑这个问题啊~ 我一会儿就去测试下你这个!

xiaoyouxi01 commented 6 years ago

额。。我把你这个文件放到callback文件夹中,在浏览器中直接访问,错误值-40005。 我用原先的Mcrypt和OpenSSL做测试,都是错误值-40005啊。。。 是我哪里测试的不对吗?

sbzhu commented 6 years ago

看起来你的代码是解密成功了~~~~ 不好意思,把 appid改成 wxab249edd27d57738,再试试~ 我这因为没PHP7的环境没法测试,麻烦了~ 其实我才是业余php。。C++工程师。。

xiaoyouxi01 commented 6 years ago

appid还是不对。。。 我暂时注释掉了decrypt函数里的corpid判断,解出来是这样的,不知道对不对。

<xml>
    <ToUserName><![CDATA[wxab249edd27d57738]]></ToUserName>
    <ServiceId><![CDATA[fw9ee0c2ef180ceeec]]></ServiceId>
    <AgentType><![CDATA[chat]]></AgentType>
    <Msg>
        <From>
            <Type><![CDATA[single]]></Type>
            <Id><![CDATA[T21260001A]]></Id>
            <DeviceType><![CDATA[win]]></DeviceType>
        </From>
        <CreateTime><![CDATA[1521532994]]></CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <MsgId><![CDATA[CAEQwoDD1QUYrYr25oWAgAMgnAI=]]></MsgId>
        <Content><![CDATA[a]]></Content>
    </Msg>
</xml>
sbzhu commented 6 years ago

嗯对的,我糊涂了,fw9ee0c2ef180ceeec 才是appid。 那就确认了,没问题~ 应该是我之前用的姿势不对,非常感谢~ 我合并上去~

xiaoyouxi01 commented 6 years ago

echo $from_corpid; 看了下corpid是fw9ee0c2ef180ceeec