小程序
小游戏
企业微信
微信支付
扫描小程序码分享
自己根据文档写的加密和签名,出来始终是签名不通过。谁有通过了的PHP版本的,只要能用发红包可以,喊爸爸也行,给你烧香供起来也可以,太折磨人了。
3 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
一整天的时间都花在找验证签名上,什么业务代码都没写,还是没找出问题
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
贴出来,研究研究啊
让chatgpt之类的把java版/nodejs版的代码转换成php的不就行了?
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
一整天的时间都花在找验证签名上,什么业务代码都没写,还是没找出问题
贴出来,研究研究啊
对小程序的api请求进行加密处理,得到加密后的请求对象
@param array $req 请求的对象
@param string $url_path 加密的api请求url地址(不包含url参数)
@return object 返回加密后的请求对象
**/
public static function makeEncryptReq($req, $url_path)
{
$local_ts = floor(time());
$nonce = str_replace("=", "",base64_encode(random_bytes(16)));
$reqex = array(
"_n" => $nonce,
"_appid" => self::miniAppID,
"_timestamp" =>$local_ts
);
$real_req = array_merge($req, $reqex);
ksort($real_req);
$plaintext = json_encode($real_req, 320);
//$url_path = self::getExpressAPiUrl()['addorder'];
$aad = $url_path.'|'.self::miniAppID.'|'.$local_ts.'|'.self::apiAES256['sn'];
$real_key = base64_encode(self::apiAES256['key']);
$real_iv = random_bytes(12);
$real_aad = utf8_encode($aad);
$real_plaintext = utf8_encode($plaintext);
$real_ciphertext = openssl_encrypt($plaintext, 'aes-256-gcm', $real_key, OPENSSL_RAW_DATA, $real_iv, $tag, $real_aad, 16);
$iv = base64_encode($real_iv);
$data = base64_encode($real_ciphertext);
$authtag = base64_encode($tag);
$req_data = array(
"iv" => $iv,
"data" => $data,
"authtag" => $authtag
);
$new_req = array(
"req_ts" => $local_ts,
"req_data" => json_encode($req_data)
);
return json_decode(json_encode($new_req)); //返回加密后的对象
}
/**
对小程序的api请求进行签名,返回base64加密后的签名
@param array $new_req 经过加密后的请求对象
@param string $url_path 签名的api请求url地址(不包含url参数)
@return string 返回加base64加密后的签名
**/
public static function sign($new_req, $url_path)
{
$signature = '';
$access_token = MiniBase::getMiniAccessToken();
$appid = MiniBase::miniAppID;
$timestamp = $new_req->req_ts;
$postdata = $new_req->req_data;
$signStr = "$url_path\n $appid\n $timestamp\n $postdata";
$api_private_key = openssl_pkey_get_private(self::apiRSA256['private_key']);
$api_public_key = openssl_pkey_get_public(self::apiRSA256['public_key']);
$postdataUtf8 = utf8_encode($postdata);
openssl_sign($postdataUtf8, $signature, $api_private_key, OPENSSL_ALGO_SHA256);
$signature = base64_encode($signature);
$plainSignature = base64_decode($signature);
$ok = openssl_verify($postdata, $plainSignature, $api_public_key, OPENSSL_ALGO_SHA256); //验签
if ($ok == 1){
//echo $ok;
return $signature;
}
}
让chatgpt之类的把java版/nodejs版的代码转换成php的不就行了?