💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
#### 直接上代码,解决RSA分段加密PHP的问题 ```php <?php /** * 电子保单查示例 */ namespace app\inter\controller; class Demo { /*I云服配置*/ protected $partner = '54**55'; /*正式版*/ protected $key = 'iyb91e**5869a98'; /*正式版*/ protected $dianzibaodan='https://open.firstbx.com/open/v3/route/baoyunChkEncryptSign'; /*正式版*/ protected $uniqueid='C4IpXquJ**P3PrjOPDbPq'; /*正式版*/ protected $publickey='MIGfMA0GCSq**DQEBAQUAA4GNADCBiQKBgQCyzA4ZV7+hQxkaBKxaOxB1r7roIcc5npvf+uMkpkmm8x1ALp/zoeXK83Vuda/ZU0mnAu5IVR4VovDAM6A5Aea2GLBkJbGisMX0LcpCBNYWkTrXK7VarH05oJWuO0nP7leGHg2zB0IS0PRj2v8MoDci8PeRaAQiUaDjB1ZZkpeO4QIDAQAB'; /*正式版*/ protected $selfkey='MIICdwIBADAN**hkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKeAZpfNjU3aTuOfkjA1HppEA52CMZdA2uJLCyzFp4yexbvdpuBiVl2tP5bvrkcXeYHEJxNyxrwKeGcyzXoaC7IDFrXOwDrF964Dsx2CXJcoCqx2Q7uCMKIBrCsHdM3V6U9A2ceS34VUkIZ4pfv7QbFofLsQpHf2EDTAMGS29P4lAgMBAAECgYBP6xaIFV33KFL9jfQtJhsc1Zi3/Rd2KE6HK/EAAqpnkJWdhisJ4kF83p15gZAwgUXLIXDXearSq1g5POcG/AhZtI98QIJWXZeiiCOayfxz6mrvIJMAmonThPOQVg+Rl+AEA160ne5MSdQAVtICeiWU3DkyxX3QziX43gYYRo+rHQJBAPsfwCtOqjyq0x8tl/VJlqz2xspDxQIlkfzgj38sZOQh9IgRSKC8Oq0gzQQVgGj0YR04BINkXnAuXyvLawmuyeMCQQCqwP4BcTJ8ASYNJxOoFMuvCKbjvoXG3Zl9JNXmlO2+FLTPA2S3tTDUxhaEx69zjRL5jaKLk09m7cmHRVzdjbZXAkEA5+47HcRZlg5vTqxdXD3K25RPpR9SJNluK496+ImX5Ns3bTQJT+qIhr10nAD/x+9sgf/qqy9XyWQKofgNs7Oq4QJABgQYrupTEgVkVtBKpABfkMIoRxveULxb/QnAM4iJu8m0+RowgTx0BPsZrgHvD44n3fz8fhhpksHL+OUbuX6VrwJBAKQl6s/q803PAWHQjvpmdF7aj3pHJXFeTkhmHNKlmk8kaj7v9TNTe1GWRdUjcyrLTftINHRO2dgzEHQZITnMo6k='; /*正式版*/ /*RSA分段加密*/ protected function iyyencrypt($originalData){ $publicKey = self::get_public_key($this->publickey); $crypto = ''; foreach (str_split($originalData, 117) as $chunk) { $encryptData = ''; if(openssl_public_encrypt($chunk, $encryptData, $publicKey)){ $crypto .= $encryptData; }else{ die('加密失败'); } } return base64_encode($crypto); } /*RSA分段解密*/ protected function iyydecrypt($encryptData){ $privateKey = self::get_private_key($this->selfkey); $decryptData = ''; $crypto = ''; foreach (str_split(base64_decode($encryptData), 128) as $chunk) { if(openssl_private_decrypt($chunk, $decryptData, $privateKey)){ $crypto .= $decryptData; }else{ die('解密失败'); } } return $crypto; } /**获取私有key字符串 重新格式化 为保证任何key都可以识别*/ protected function get_private_key($private_key){ $search = array( "-----BEGIN RSA PRIVATE KEY-----", //自定义头部 "-----END RSA PRIVATE KEY-----", //自定义尾部 "\n", "\r", "\r\n" ); $private_key=str_replace($search,"",$private_key); return $search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL .$search[1]; } /**获取公共key字符串 重新格式化 为保证任何key都可以识别*/ protected function get_public_key($public_key){ $search = array( "-----BEGIN PUBLIC KEY-----", //自定义头部 "-----END PUBLIC KEY-----", //自定义尾部 "\n", "\r", "\r\n" ); $public_key=str_replace($search,"",$public_key); return $search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1]; } /** * @param $data * @return string * 生成签名 */ protected function setSign($data){ return md5($data.$this->key); } /** * @param string $url post请求地址 * @param array $params * @return mixed */ protected function curl_post($url, array $params = array()) { $data_string = json_encode($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json' ) ); $data = curl_exec($ch); curl_close($ch); return ($data); } /** * 电子保单查询 IH1100015011824503 * RSA 加密解密是核心 https://www.cnblogs.com/makalochen/p/10845033.html */ public function getPolicyList(){ $params = Request::instance()->param(); /*接收数据,不同框架不一样,这个是用的TP5*/ $data = [ 'uniqueId' => $this->uniqueid, 'policyNo' => $params['policyNo'], 'partner' => $this->partner, 'queryType' => 'newElectronicPolicy' ]; $data=self::iyyencrypt(json_encode($data)); $sign = self::setSign($data); $parameter['data'] = $data; $parameter['sign'] = $sign; $parameter['partner'] = $this->partner; $rest = self::curl_post($this->dianzibaodan,$parameter); $result = json_decode($rest,true); // string(355) "{"insurantName":"俞帅","finishTime":"2022-01-19 //23:59:59.0","policyId":"236501959","attributorName":"李秀珍","effectiveTime":"2021-01-20 //00:00:00.0","electronicPolicyUrl":"https://passport-uat.iyunbao.com/m/auth/common_auth_message?token=1366689652517371904","policyNo":"IH1100015011824503","applicantName":"俞帅","productName":"尊享e生2020版"}" if ($result['code']==0){ //私钥解密 $datas=self::iyydecrypt($result['data']); $datainfo=json_decode($datas,true); if($datainfo['electronicPolicyUrl']){ return json(['code'=>1,'data'=>$datainfo,'msg'=>'成功']); }else{ return json(['code'=>0,'msg'=>'暂无电子保单','data'=>'']); } }else{ return json(['code'=>0,'msg'=>'接口调用失败...','data'=>'']); } } } ```