小程序
小游戏
企业微信
微信支付
扫描小程序码分享
微信小程序开发过程中,开启了消息推送,并且消息是完全模式,需要自己加解密,服务器语言使用PHP,但是问题来了,官方给的代码中的消息加解密方法在PHP7中并不能使用,mcrypt_module_open
等相关方法不支持了,请问在PHP7中如何加解密消息内容。下面是微信官方给的PHP5的加密方法,在php7中出现问题,求大佬解答
3 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
你好,使用你的这个,这里报错,from_appid是空的呢
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
折腾半天,终于解决,将微信官方提供的pkcs7Encoder.php中的两个方法修改如下即可
/**
* 对明文进行加密
* @param string $text 需要加密的明文
* @return string 加密后的密文
*/
public
function
encrypt(
$text
,
$appid
)
{
try
//获得16位随机字符串,填充到明文之前
$random
=
$this
->getRandomStr();
//"aaaabbbbccccdddd";
. pack(
"N"
strlen
(
)) .
.
;
$iv
substr
->key, 0, 16);
$pkc_encoder
new
Pkcsencoder();
->encode(
);
$encrypted
= openssl_encrypt(
'AES-256-CBC'
->key, 0, 32),OPENSSL_ZERO_PADDING,
return
array
(ErrorCode::
$OK
}
catch
(Exception
$e
) {
//print $e;
(Errorcode::
$EncryptAESError
, null);
* 对密文进行解密
* @param string $encrypted 需要解密的密文
* @return string 解密得到的明文
decrypt(
$decrypted
= openssl_decrypt(
$DecryptAESError
//去除补位字符
$result
->decode(
//去除16位随机字符串,网络字节序和AppId
if
) < 16)
'出错啦'
$content
, 16,
));
$len_list
= unpack(
, 0, 4));
$xml_len
[1];
$xml_content
, 4,
$from_appid
+ 4);
$IllegalBuffer
!=
$ValidateAppidError
(0,
你好,请问Pkcsencoder这个类方法是什么样子的呢
<?php
namespace
app\wxapp\controller;
include_once
"Errorcode.php"
class
Pkcsencoder
static
$block_size
= 32;
* 对需要加密的明文进行填充补位
* @param $text 需要进行填充补位操作的明文
* @return 补齐明文字符串
encode(
= Pkcsencoder::
$text_length
//计算需要填充的位数
$amount_to_pad
- (
% Pkcsencoder::
== 0) {
= Pkcsencoder::block_size;
//获得补位所用的字符
$pad_chr
chr
$tmp
""
for
$index
= 0;
<
++) {
.=
* 对解密后的明文进行补位删除
* @param decrypted 解密后的明文
* @return 删除填充补位后的明文
decode(
$pad
= ord(
, -1));
< 1 ||
> 32) {
, 0, (
) -
Pkcsencoder类的所有代码都在这了
嗯嗯好的,多谢多谢
请问官方提供的demo在哪儿下载? 我在这里下载的没有php语言的,只有c++的demohttps://developers.weixin.qq.com/miniprogram/dev/api/signature.html#wxchecksessionobject
php的下载地址为https://wximg.gtimg.com/shake_tv/mpwiki/cryptoDemo.zip
对应的接入指南文档:https://developers.weixin.qq.com/miniprogram/dev/api/custommsg/callback_help.html
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
折腾半天,终于解决,将微信官方提供的pkcs7Encoder.php中的两个方法修改如下即可
/*** 对明文进行加密* @param string $text 需要加密的明文* @return string 加密后的密文*/publicfunctionencrypt($text,$appid){try{//获得16位随机字符串,填充到明文之前$random=$this->getRandomStr();//"aaaabbbbccccdddd";$text=$random. pack("N",strlen($text)) .$text.$appid;$iv=substr($this->key, 0, 16);$pkc_encoder=newPkcsencoder();$text=$pkc_encoder->encode($text);$encrypted= openssl_encrypt($text,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv);returnarray(ErrorCode::$OK,$encrypted);}catch(Exception$e) {//print $e;returnarray(Errorcode::$EncryptAESError, null);}}/*** 对密文进行解密* @param string $encrypted 需要解密的密文* @return string 解密得到的明文*/publicfunctiondecrypt($encrypted,$appid){try{$iv=substr($this->key, 0, 16);$decrypted= openssl_decrypt($encrypted,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv);}catch(Exception$e) {returnarray(Errorcode::$DecryptAESError, null);}try{//去除补位字符$pkc_encoder=newPkcsencoder();$result=$pkc_encoder->decode($decrypted);//去除16位随机字符串,网络字节序和AppIdif(strlen($result) < 16)returnarray('出错啦');$content=substr($result, 16,strlen($result));$len_list= unpack("N",substr($content, 0, 4));$xml_len=$len_list[1];$xml_content=substr($content, 4,$xml_len);$from_appid=substr($content,$xml_len+ 4);}catch(Exception$e) {//print $e;returnarray(Errorcode::$IllegalBuffer, null);}if($from_appid!=$appid)returnarray(Errorcode::$ValidateAppidError, null);returnarray(0,$xml_content,$from_appid);}你好,请问Pkcsencoder这个类方法是什么样子的呢
<?phpnamespaceapp\wxapp\controller;include_once"Errorcode.php";classPkcsencoder{publicstatic$block_size= 32;/*** 对需要加密的明文进行填充补位* @param $text 需要进行填充补位操作的明文* @return 补齐明文字符串*/functionencode($text){$block_size= Pkcsencoder::$block_size;$text_length=strlen($text);//计算需要填充的位数$amount_to_pad= Pkcsencoder::$block_size- ($text_length% Pkcsencoder::$block_size);if($amount_to_pad== 0) {$amount_to_pad= Pkcsencoder::block_size;}//获得补位所用的字符$pad_chr=chr($amount_to_pad);$tmp="";for($index= 0;$index<$amount_to_pad;$index++) {$tmp.=$pad_chr;}return$text.$tmp;}/*** 对解密后的明文进行补位删除* @param decrypted 解密后的明文* @return 删除填充补位后的明文*/functiondecode($text){$pad= ord(substr($text, -1));if($pad< 1 ||$pad> 32) {$pad= 0;}returnsubstr($text, 0, (strlen($text) -$pad));}}Pkcsencoder类的所有代码都在这了
嗯嗯好的,多谢多谢
请问官方提供的demo在哪儿下载? 我在这里下载的没有php语言的,只有c++的demohttps://developers.weixin.qq.com/miniprogram/dev/api/signature.html#wxchecksessionobject
php的下载地址为https://wximg.gtimg.com/shake_tv/mpwiki/cryptoDemo.zip
对应的接入指南文档:https://developers.weixin.qq.com/miniprogram/dev/api/custommsg/callback_help.html