銀聯オンライン決済ドッキングプロセス及び署名アルゴリズム


銀聯オンライン決済
概要
銀聯オンライン決済はPCゲートウェイ、携帯電話SDK、WAPゲートウェイ、雲閃付などの多種の支払いシーンをサポートし、その中で雲閃付製品はApplePay、Samsung Pay、Huawei Payなどの市販の携帯電話メーカーが発売した支払いブランドを完璧にサポートすることができ、銀聯オンライン決済に接続し、微信クライアントと支付宝クライアントがないことによるユーザーの流失を補うことができる.また、形式の多様な支払い優遇活動を行うことができ、銀聯は商戸号取引のコントロールを通じて、立減、満減などの支払い優遇活動を実現することができる.
支払プロセス
開発ドキュメント組織の支払メッセージに基づいて、ゲートウェイ支払要求を開始します.APPの支払いは、curlが支払いゲートウェイ(appTransReq.do)を要求し、tnコードを取得し、appがtnコードを通じて支払い要求を開始する必要がある.PC、WAPゲートウェイが支払うと、支払メッセージはフォームPOSTを介して銀聯支払ゲートウェイ(frontTransReq.do)に直接提出される.
署名メカニズム
銀聯オンライン決済、商家側は支払いゲートウェイ、返金ゲートウェイ、支払い照会ゲートウェイ、返金照会ゲートウェイなどの業務を呼び出すにはOpenSSLを使用してメッセージを非対称暗号化する必要があり、暗号化証明書タイプはRSA、暗号化アルゴリズムはSHA-1である.同様に、商家側は銀聯から送られてきたデータメッセージに対しても、銀聯が提供した公開鍵ファイルを使用して署名を検証しなければならない.
オンライン開発ドキュメントhttps://open.unionpay.com/ajweb/product
証明書のダウンロード、エクスポートプロセスhttps://open.unionpay.com/ajweb/help/file/techFile?cateLog=agreement
銀聯オンライン決済署名チェックアルゴリズム
PHPバージョン
/**
 *       demo
 *   OpenSSL       、  
 * @author [email protected]
 */
class chinapayPayment
{
    
    
    public function __construct()
    {
        
    }
    
    
    /**
     **@desc         
     **/
    public function ransReqParams()
    {
        //Todo...
    }
    
    
    /**
     **@desc     
     **/
    public function doRefund()
    {
        //Todo...
    }
    
    
    /**
     **@desc     
     **/
    public function doQuery()
    {
        //Todo...
    }
    
    
    /**
     **@desc     
     **/
    public function doRefundQuery()
    {
        //Todo...
    }
    
    
    /**
    *                
    */
    public function signature($postPrams)
    {
        ksort($postPrams);

        $strInfo = '';
        foreach ($postPrams as $key=>$val) {
            if($strInfo){
                $strInfo .= "&".$key."=".$val;
            }else{
                $strInfo = $key."=".$val;
            }
        }
        
        $retval = $this->readPrivateKeyData();
        
        if ($retval['code'] != 200) {
           return false;
        }

        $sha1x16 = sha1($strInfo, FALSE);
        if (openssl_sign($sha1x16, $signature, $retval['privateKey'], OPENSSL_ALGO_SHA1)) {
            $signatureBase64 = base64_encode($signature);
        }

        return $signatureBase64 ? $signatureBase64 : false;
    }
    
    
    /**
    *             
    */
    public function verfiySign($requestData)
    {
        $retval = $this->readPublicKeyData();
        
        if ($retval['code'] != 200) {
           return false;
        }
        
        $isSuccess = false;
        
        if( $retval['certId'] == $requestData['certId'] ){
            $signature = $requestData['signature'];
            unset($requestData['signature']);
            $sRequest = $this->coverParamsToString($requestData);
            $sha1x16 = sha1($sRequest, false);
            $isSuccess = openssl_verify($sha1x16, base64_decode($signature), $retval['publicKey'], OPENSSL_ALGO_SHA1);
        }
        
        return $isSuccess;
    }
    

    /**
     *       ,         .pfx
    **/
    private function readPrivateKeyData()
    {
        $pkcs12 = file_get_contents($this->privateKeyFile);

        if (openssl_pkcs12_read($pkcs12, $certs, $this->privatekeyPass)) { 
            $x509data = $certs ['cert'];
            openssl_x509_read ( $x509data );
            $certdata = openssl_x509_parse ( $x509data );
            return ['code' => 200, 'certId' => $certdata['serialNumber'], 'privateKey' => $certdata['pkey']];
        }
        
        return ['code' => 500, 'certId' => '', 'privateKey' => ''];
    }
    
    

    /**
     *       ,         .cer
    **/
    private function readPublicKeyData()
    {
        $x509data = file_get_contents($this->publicKeyFile);
        openssl_x509_read($x509data);
        $certdata = openssl_x509_parse($x509data);
        
        if ($certdata) {
            return ['code' => 200, 'certId' => $certdata['serialNumber'], 'publicKey' => $x509data];
        }
        
        return ['code' => 500, 'certId' => '', 'publicKey' => ''];
    }

    
    /**
     *             
     * @param array $params            
     * @return string
     */
    public function coverParamsToString($params) 
    {
        $strSign = '';
        ksort($params);
        foreach($params as $key => $val){
            if($key == 'signature'){
                continue;
            }
            $strSign .= sprintf("%s=%s&", $key, $val);
        }
        return substr($strSign, 0, strlen($strSign) - 1);
    }
}