文章目录

  1. 1. 关于公众平台加密方案的,存在一个问题,请订阅号注意:
  2. 2. 解决方法:
    1. 2.1. 步骤1、官方的Prpcrypt类库decrypt()函数
    2. 2.2. 步骤2、

关于公众平台加密方案的,存在一个问题,请订阅号注意:

由于未认证的订阅号没有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;
//如果传入的appid是空的,则认为是订阅号,使用数据中提取出来的appid
} catch (Exception $e) {

然后下边搜索return array(0, $xml_content)按如下修改

1
2
3
4
5
if ($from_appid != $appid)
return array(ErrorCode::$ValidateAppidError, null);
//不注释上边两行,避免传入appid是错误的情况
return array(0, $xml_content, $from_appid);
//增加appid,为了解决后面加密回复消息的时候没有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) //验证自己原先的appid是否为空
$this->appid = $array[2];//为了没有appid的订阅号。

这里$array[2] 为你的appid
保存这个appid,在回复信息进行加密时,传入这个appid进行加密即可。

1
2
$pc = new Prpcrypt($this->encodingAesKey);
$array = $pc->encrypt($xmldata, $this->appid);

此问题发现和提出解决方案来自开源项目wechat-php-sdkpull#140
本人在其基础上再次修改方案,见pull#141

文章目录
  1. 1. 关于公众平台加密方案的,存在一个问题,请订阅号注意:
  2. 2. 解决方法:
    1. 2.1. 步骤1、官方的Prpcrypt类库decrypt()函数
    2. 2.2. 步骤2、