背景
- 近期在对接
美餐支付
接口文档时,
重点需根据sha256WithRSA
签名规则,进行加密处理
通过参考网上的签名经验,最后整理出适合自己业务使用的处理方法
欢迎各位指摘 …
实现方式
- 签名加密、解密代码:
/*** @Notes:生成 sha256WithRSA 签名* 提示:SPKI(subject public key identifier,主题公钥标识符)* @param null $signContent 待签名内容* @param string $privateKey 私钥数据(如果为单行,内容需要去掉RSA的标识符)* @param bool $singleRow 是否为单行私钥-标识* @return string 签名串* @User: zhanghj* @DateTime: 2023-09-27 9:41*/public function getSHA256SignWithRSA($signContent = null, $privateKey = '', $singleRow = false){if ($singleRow){//如果传入的私钥是单行数据,且没有RSA的标识符,需做格式转化$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .wordwrap($privateKey, 64, "\n", true) ."\n-----END RSA PRIVATE KEY-----";}$key = openssl_get_privatekey($privateKey);//开始加密openssl_sign($signContent, $signature, $key, OPENSSL_ALGO_SHA256);//进行 base64编码 加密后内容$encryptedData = base64_encode($signature);openssl_free_key($key);return $encryptedData;}/*** @Notes:验证 sha256WithRSA 签名* @param null $signContent 待签名内容* @param string $signatureStr 签名串* @param string $public_key 公钥数据(如果为单行,内容需要去掉RSA的标识符)* @param bool $singleRow 是否为单行私钥-标识* @return int 1:签名成功,0:签名失败* @User: zhanghj* @DateTime: 2023-09-27 10:38*/public static function verifySha256SignWithRSA($signContent = null, $signatureStr = '', $public_key = '',$singleRow = false){if ($singleRow){$public_key = "-----BEGIN PUBLIC KEY-----\n" .wordwrap($public_key, 64, "\n", true) ."\n-----END PUBLIC KEY-----";}$key = openssl_get_publickey($public_key);$ok = openssl_verify($signContent, base64_decode($signatureStr), $key, OPENSSL_ALGO_SHA256);openssl_free_key($key);return $ok;}
- 签名加密,操作举例
/*** 1. 如果得到的 私钥数据,没有RSA标识符,此时,要求私钥为【单行】形式*/
$signature_res = self::getSHA256SignWithRSA($sign_str,$this->private_key,true);/*** 2. 如果得到的 私钥数据,拥有RSA标识符,此时,要求私钥为标准的形式(每行64个字符)*/
$signature_res = self::getSHA256SignWithRSA($sign_str,$this->private_key,false);/*** 3. 如果得到的 私钥数据,是以 pem文件形式存储,此时,需先加载指定目录的 pem文件*/
// 加载私钥文件
$this->private_key = openssl_pkey_get_private(file_get_contents(self::KEY_FILE_DIR.'rsa_private.pem'));
$signature_res = self::getSHA256SignWithRSA($sign_str,$this->private_key,false);
附录
① . 参考文章
-
- php 实现SHA256WithRSA
-
- PHP sha256WithRsa加解密
-
- openssl_sign(): supplied key param cannot be coerced into a private key
②. GuzzleHttp 使用技巧
-
- 实例化类
Client
- 实例化类
配置参数
http_errors
可解决401
授权问题
//实例化 Client
$httpClient = new Client(['base_uri' => self::BASE_URL,'verify' => false,'http_errors' => false]);//请求传参
$options = ['timeout' => 5,//传输 headers'headers' => $header_data,];//判断请求方式
if ($request_method == 'GET'){$options['query'] = $request_body;
}else{//参数需在请求JSON传参//$options['form_params'] = $request_body;$options['json'] = $request_body;
}//请求目标接口,处理反馈信息
$response = $this->httpClient->request($request_method,$url,$options);
$contents = $response->getBody().'';
$opData = json_decode($contents,true);