| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | <?php/** * Created by PhpStorm. * User: tandunzhao * Date: 2017/12/13 * Time: 下午2:58 */namespace App\Libs\allinpay;class PhpTools{    public $certFile = 'Libs/allinpay/allinpay-pds.pem';//通联公钥证书    public $privateKeyFile = 'Libs/allinpay/20064100000098104.pem';//商户私钥证书    public $password = '111111';//商户私钥密码以及用户密码    public $arrayXml ;//    public $apiUrl = 'https://tlt.allinpay.com/aipg/ProcessServlet';//(生产环境地址,上线时打开该注释)    public $apiUrl = 'http://tlt.allinpay.com/aipg/ProcessServlet';//(生产环境地址,上线时打开该注释)    public function __construct()    {        $this->arrayXml = new ArrayXML();    }    /**     * PHP版本低于 5.4.1 的在通联返回的是 GBK编码环境使用     * 但是本地文件编码是 UTF-8     *     * @param string $hexstr     * @return binary string     */    public function hextobin($hexstr) {        $n = strlen($hexstr);        $sbin = "";        $i = 0;        while($i < $n) {            $a = substr($hexstr, $i, 2);            $c = pack("H*",$a);            if ($i==0) {                $sbin = $c;            } else {                $sbin .= $c;            }            $i+=2;        }        return $sbin;    }    /**     * 验签     */    public function verifyXml($xmlResponse){//	    dd($xmlResponse);        // 本地反馈结果验证签名开始        $signature = '';        if (preg_match('/<SIGNED_MSG>(.*)<\/SIGNED_MSG>/i', $xmlResponse, $matches)) {            $signature = $matches[1];        }        $xmlResponseSrc = preg_replace('/<SIGNED_MSG>.*<\/SIGNED_MSG>/i', '', $xmlResponse);        $xmlResponseSrc1 = mb_convert_encoding(str_replace('<','<',$xmlResponseSrc), "UTF-8", "GBK");//		print_r ('验签原文');//		print_r ($xmlResponseSrc1);        $pubKeyId = openssl_get_publickey(file_get_contents(app_path($this->certFile)));        $flag = (bool) openssl_verify($xmlResponseSrc, hex2bin($signature), $pubKeyId);        openssl_free_key($pubKeyId);//	    echo '<br/>'+$flag;        if ($flag) {//		    echo '<br/>Verified: <font color=green>Passed</font>.';            // 变成数组,做自己相关业务逻辑            $xmlResponse = mb_convert_encoding(str_replace('<?xml version="1.0" encoding="GBK"?>', '<?xml version="1.0" encoding="UTF-8"?>', $xmlResponseSrc), 'UTF-8', 'GBK');            $results = $this->arrayXml->parseString( $xmlResponse , TRUE);//		    dd($results);//		    echo "<br/><br/><font color=blue>-------------华丽丽的分割线--------------------</font><br/><br/>";//		    echo $results;            return $results;        } else {//		    echo '<br/>Verified: <font color=red>Failed</font>.';            return FALSE;        }    }    /**     * 验签     */    public function verifyStr($orgStr,$signature){        echo '签名原文:'.$orgStr;        $pubKeyId = openssl_get_publickey(file_get_contents($this->certFile));        $flag = (bool) openssl_verify($orgStr, hex2bin($signature), $pubKeyId);        openssl_free_key($pubKeyId);        if ($flag) {            echo '<br/>Verified: <font color=red>SUCC</font>.';            return TRUE;        } else {            echo '<br/>Verified: <font color=red>Failed</font>.';            return FALSE;        }    }    /**     * 签名     */    public function signXml($params){        $xmlSignSrc = $this->arrayXml->toXmlGBK($params, 'AIPG');//        dd($xmlSignSrc);        $xmlSignSrc=str_replace("TRANS_DETAIL2", "TRANS_DETAIL",$xmlSignSrc);//		dd($xmlSignSrc);//		echo ($xmlSignSrc);        $privateKey = file_get_contents(app_path($this->privateKeyFile));//        dd($privateKey);        $pKeyId = openssl_pkey_get_private($privateKey, $this->password);        openssl_sign($xmlSignSrc, $signature, $pKeyId);        openssl_free_key($pKeyId);        $params['INFO']['SIGNED_MSG'] = bin2hex($signature);        $xmlSignPost = $this->arrayXml->toXmlGBK($params, 'AIPG');        return  $xmlSignPost;    }    /**     * 发送请求     */    public function send($params){        $xmlSignPost=$this->signXml($params);//        dd($xmlSignPost);//        dd($this->apiUrl);        $xmlSignPost=str_replace("TRANS_DETAIL2", "TRANS_DETAIL",$xmlSignPost);        $response = CURL::factory()->post($this->apiUrl, $xmlSignPost);        if (! isset($response['body'])) {            die('Error: HTTPS REQUEST Bad.');        }        //获取返回报文        $xmlResponse = $response['body'];//		print_r("返回报文如下:\n");//		print_r(str_replace('<','<',$xmlResponse));        //验证返回报文        $result=$this->verifyXml($xmlResponse);        return $result;    }}
 |