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加密方式的主要内容,如果未能解决你的问题,请参考以下文章