RSA核心加密驗證算法php
<?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 加密方法,因此可根據實際應用場景進行調整!異步
以上僅爲使用過程當中記錄的!this