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

Posted kevinws

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 加密方法,所以可根据实际应用场景进行调整!

 

以上仅为使用过程中记录的!

 

以上是关于ThinkPHP3.2 整合支付宝RSA加密方式的主要内容,如果未能解决你的问题,请参考以下文章

php 5.3.13怎么使用支付宝RSA2

支付宝支付流程与RSA算法原理

ThinkPHP3.2对接开发支付宝即时到帐接口

golang 支付宝SHA1withRSA加密

支付宝接口加签方式说明

thinkphp3.2大C方法和支付宝app支付sdk中的C方法冲突了怎么解决