ThinkPHP3.2 整合支付寶RSA加密方式


RSA核心加密驗證算法

<?php
/**
 * RSA簽名
 * @param $data 待簽名數據
 * @param $private_key 商戶私鑰字符串
 * return 簽名結果
 */
function rsaSign($data, $private_key) {
    //以下為了初始化私鑰,保證在您填寫私鑰時不管是帶格式還是不帶格式都可以通過驗證。
    $private_key=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$private_key);
    $private_key=str_replace("-----END RSA PRIVATE KEY-----","",$private_key);
    $private_key=str_replace("\n","",$private_key);

    $private_key="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($private_key, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";

    $res=openssl_get_privatekey($private_key);

    if($res)
    {
        openssl_sign($data, $sign,$res);
    }
    else {
        return false;
    }
    openssl_free_key($res);
    //base64編碼
    $sign = base64_encode($sign);
    return $sign;
}

/**
 * RSA驗簽
 * @param $data 待簽名數據
 * @param $alipay_public_key 支付寶的公鑰字符串
 * @param $sign 要校對的的簽名結果
 * return 驗證結果
 */
function rsaVerify($data, $alipay_public_key, $sign)  {
    //以下為了初始化私鑰,保證在您填寫私鑰時不管是帶格式還是不帶格式都可以通過驗證。
    $alipay_public_key=str_replace("-----BEGIN PUBLIC KEY-----","",$alipay_public_key);
    $alipay_public_key=str_replace("-----END PUBLIC KEY-----","",$alipay_public_key);
    $alipay_public_key=str_replace("\n","",$alipay_public_key);

    $alipay_public_key='-----BEGIN PUBLIC KEY-----'.PHP_EOL.wordwrap($alipay_public_key, 64, "\n", true) .PHP_EOL.'-----END PUBLIC KEY-----';
    $res=openssl_get_publickey($alipay_public_key);
    if($res)
    {
        $result = (bool)openssl_verify($data, base64_decode($sign), $res);
    }
    else {
       return false;
    }
    openssl_free_key($res);    
    return $result;
}

?>

 

 

異步回調修改如下,即可完成MD5 和 RSA的驗證

/**
     * 獲取返回時的簽名驗證結果
     * @param $para_temp 通知返回來的參數數組
     * @param $sign 返回的簽名結果
     * @return 簽名驗證結果
     */
    function getSignVeryfy($para_temp, $sign) {
        //除去待簽名參數數組中的空值和簽名參數
        $para_filter = paraFilter($para_temp);
        
        //對待簽名參數數組排序
        $para_sort = argSort($para_filter);
        
        //把數組所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串
        $prestr = createLinkstring($para_sort);
        
        $isSgin = false;
        switch (strtoupper(trim($this->alipay_config['sign_type']))) {
            case "MD5" :
                $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
                break;
            case "RSA" :
                $isSgin = rsaVerify($prestr, trim($this->alipay_config['alipay_public_key']), $sign);
                break;
            default :
                $isSgin = false;
        }
        
        return $isSgin;
    }

 

添加配置信息:

'alipay'     =>   array(
        'partner'     =>  '',
        'seller_id'   =>  '',
        'key'         =>  '',
        'notify_url'   =>  '',
        'return_url'   =>  '',
        'sign_type'    =>  strtoupper('MD5'),
        'input_charset'=>  strtolower('utf-8'),
        'transport'    =>  'http',
        'payment_type' =>  1,
        'service'      =>  'create_direct_pay_by_user',
        'account'      =>  '',
        'privatekey'   =>  '',        //    私鑰
    'alipay_public_key'    => '', // 支付寶公鑰
 ),

 

因移動支付只有RSA加密,沒有MD5 加密方法,所以可根據實際應用場景進行調整!

 

以上僅為使用過程中記錄的!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM