收藏
回答

谁有服务端的api加密和签名示例,php版本的?·

自己根据文档写的加密和签名,出来始终是签名不通过。谁有通过了的PHP版本的,只要能用发红包可以,喊爸爸也行,给你烧香供起来也可以,太折磨人了。

回答关注问题邀请回答
收藏

3 个回答

  • 刘洋
    刘洋
    2023-08-16

    一整天的时间都花在找验证签名上,什么业务代码都没写,还是没找出问题

    2023-08-16
    有用 1
    回复
  • 李超
    李超
    2023-08-17

    贴出来,研究研究啊

    2023-08-17
    有用
    回复 2
    • 刘洋
      刘洋
      2023-08-18
      /**
          对小程序的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;
              }
          }
      2023-08-18
      回复
    • 刘洋
      刘洋
      2023-08-18
      2023-08-18
      回复
  • 浪花骑士
    浪花骑士
    2023-08-16

    让chatgpt之类的把java版/nodejs版的代码转换成php的不就行了?

    2023-08-16
    有用
    回复 3
    • 刘洋
      刘洋
      2023-08-16
      不行,函数不一样,我照着一句句写的,自己加密解密,签名验签都通过,但是发送到接口就是签名失败
      2023-08-16
      回复
    • 浪花骑士
      浪花骑士
      2023-08-17回复刘洋
      那你注意了参数顺序啥的没有?用过这个微信调试工具没有?https://developers.weixin.qq.com/apiExplorer
      2023-08-17
      回复
    • 刘洋
      刘洋
      2023-08-18回复浪花骑士
      用过工具,注意了参数位置
      2023-08-18
      回复
登录 后发表内容