By binsee
更新日期:
关于公众平台加密方案的,存在一个问题,请订阅号注意:
由于未认证的订阅号没有appid,所以在解密时,由于没有传入appid,会导致解密时appid效验失败,且回复时对信息的加密到微信服务器时会验证失败,从而用户收不到回信。
解决方法:
步骤1、官方的Prpcrypt类库decrypt()函数
搜索 $from_appid = substr($content, $xml_len + 4);,按如下修改
1 2 3 4 5
| $from_appid = substr($content, $xml_len + 4); if (!$appid) $appid = $from_appid; } catch (Exception $e) {
|
然后下边搜索return array(0, $xml_content)按如下修改
1 2 3 4 5
| if ($from_appid != $appid) return array(ErrorCode::$ValidateAppidError, null); return array(0, $xml_content, $from_appid);
|
注意return array(0, $xml_content)替换为
1
| return array(0, $xml_content, $from_appid);
|
步骤2、
在调用 decrypt($encryptStr,'')方法进行加密时会返回一个数组,如:
1 2 3 4 5 6 7 8 9 10 11 12
| $pc = new Prpcrypt($this->encodingAesKey); $array = $pc->decrypt($encryptStr,$this->appid); if (!isset($array[0]) || ($array[0] != 0)) { if (!$return) { die('解密失败!'); } else { return false; } } $this->postxml = $array[1]; if (!$this->appid) $this->appid = $array[2];
|
这里$array[2] 为你的appid
保存这个appid,在回复信息进行加密时,传入这个appid进行加密即可。
1 2
| $pc = new Prpcrypt($this->encodingAesKey); $array = $pc->encrypt($xmldata, $this->appid);
|
此问题发现和提出解决方案来自开源项目wechat-php-sdk的pull#140
本人在其基础上再次修改方案,见pull#141