PHP支付APIV3回调签名验证与回调通知
PHP⽀付APIV3回调签名验证与回调通知//获取平台证书序列,解密后是平台公钥回调验证签名要⽤到
public
function get_cert()
{
$url='h.weixin.qq/v3/certificates';
$url_parts=parse_url($url);
$http_method='GET';
$timestamp=time();
//        $nonce = md5(time() . $out_trade_no);
$nonce=$this->set_nonce();//⽣成随机字符串
$body='';
$canonical_url=($url_parts['path'].(!empty($url_parts['query'])?"?${url_parts['query']}":""));
$message=$http_method."\n".
$canonical_url."\n".
$timestamp."\n".
$nonce."\n".
$body."\n";
$sign=$this->wechat_sign($message);//签名和统⼀下单调起⽀付签名⼀样
$rs=$this->wechat_req($nonce,$timestamp,$sign,$url,$http_method,'');
//保存
//        $path = APPPATH . '/Wechat/wxp_cert.pem';//平台证书序列
//        file_put_contents($path, json_encode($rs));
半夜妓叫
return$rs;
}
在这⾥插⼊代码⽚
康途网
//回调⾸先是要接收头部信息,回调⽅法⾥最好保存回调信息⽤来调试
$response_body回调主体接收 :
羽绒服有哪些品牌
兼职在家工作$response_body= file_get_contents(‘php://input’);
$header的接收要注意,如果服务器不是Apche不要⽤getallheaders
//百度Nginx getallheaders 就可以到替代⽅法
我⽤的CI框架$header = $this->input->request_headers();
TP应该是$this->request->header();具体看官⽅⽂档
在这⾥插⼊代码⽚
public
function verify_wechatnotify($header,$response_body)
{
//$header 回调头部信息 //$response_body回调主体
//获取平台证书
$plat=$this->get_cert();
//        $path =  'XX/Wechat/wxp_cert.pem';//平台证书
//        $plat_cert = file_get_contents($path);
//        $plat = json_decode($plat_cert, true);
//serial_no平台证书序列号 //跟商户证书序列号不⼀样不要搞混了
$serial_no=$plat['data'][0]['serial_no'];
/
/验证回调头部信息中的平台证书序列号跟平台证书序列号是否⼀致
if($header['Wechatpay-Serial']!=$serial_no){
return$data=['code'=>'0','msg'=>'平台证书序列号不⼀致,签名验证不通过'];
}
//解密平台证书序列
$associatedData=$plat['data'][0]['encrypt_certificate']['associated_data'];
$nonceStr=$plat['data'][0]['encrypt_certificate']['nonce'];
$ciphertext=$plat['data'][0]['encrypt_certificate']['ciphertext'];
室内设计师排名$plat_cert_decrtpt=$this->decryptToString($associatedData,$nonceStr,$ciphertext);//平台证书解密后即⽣成公钥 //这个解密⽅法看官⽅⽂档w echatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/zheng-shu-he-hui-tiao-bao-wen-jie-mi
//$pub_path = 'XX/Wechat/wxp_pub.pem';
//        file_put_contents($pub_path, $plat_cert_decrtpt);//平台公钥 //保存平台公钥回调验签要⽤
//$plat_cert_decrtpt = file_get_contents($pub_path);
蹈组词2字
$pub_key=openssl_pkey_get_public($plat_cert_decrtpt);//平台公钥
$Signature=$header['Wechatpay-Signature'];
$message=$header['Wechatpay-Timestamp']."\n".$header['Wechatpay-Nonce']."\n".$response_body."\n";
$sign=base64_decode($Signature);
$ok=openssl_verify($message,$sign,$pub_key,OPENSSL_ALGO_SHA256);//回调验签
if($ok==1){
//            return $this->error('1', '回调签名验证成功');
return1;
}else{
return false;
}
}
注意:商户证书跟平台证书是不⼀样的,我⼀开始⼀直拿商户证书来验签,浪费了时间。后⾯的获取平台证书序列了之后,⼀直不知道怎么⽣成平台公钥。其实解密之后就是公钥了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。