亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP支付寶接口RSA驗證

2020-03-22 18:44:16
字體:
來源:轉載
供稿:網友
  • 這兩天一直困擾的PHP RSA簽名驗證問題終于解決了,由于之前RSA接觸的不多,再加上官方至今還未有PHP的SDK可供參考,因此走了一些彎路,寫在這里和大家分享。
    雖然支付寶官方還未提供相關SDK,PHP確實可以實現RSA方式的簽名,這點其實很重要,由于不熟悉,在遇到困難的時候,經常會不由自主地想到是否PHP不支持RSA簽名,干脆用MD5得了,這樣就沒有了前進的動力。其實說穿了MD5和RSA簽名,不同的只是簽名方式的區別,其他的都一樣,因此我這里主要說一下如何用RSA進行簽名和驗簽。

    首先你需要準備下面的東西:
    php的openssl擴展里已經封裝好了驗簽的方法openssl_verify。 如果在Windows下的php.ini需要開啟Openssl模塊:extension=php_openssl.dll

    商戶私鑰:

    即RSA私鑰,按照手冊,按以下方式生成:

    openssl genrsa -out rsa_private_key.pem 1024

    商戶公鑰:

    即RSA私鑰,按照手冊,按以下方式生成:
    openssl rsa -in rsa_private_key.pem -pubout -out rsa_html' target='_blank'>public_key.pem

    生成之后,按照手冊的說明,需要在簽約平臺上傳公鑰,需要注意的是,上傳的時候需要把所有的注釋和換行都去掉。

    另外手冊中還有如下命令:

    openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

    該命令將RSA私鑰轉換成PKCS8格式,對于PHP來說,不需要。

    支付寶公鑰:

    根據手冊,在簽約平臺獲得。
    如果你直接復制下來的話,會得到一個字符串,需要進行下面的轉換;
    1)把空格變成換行
    2)添加注釋
    比如你復制下來的公鑰是:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt

    ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j

    TCoccYMDXEIWYTs3CwIDAQAB,那轉換之后為:
    -----BEGIN PUBLIC KEY-----

    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j TCoccYMDXEIWYTs3CwIDAQAB -----END PUBLIC KEY----- 把公鑰保存在文件里。

    注意這個是2048位的公鑰應該是9行或者10行,不能為1行,不然PHP的openssl_pkey_get_public無法讀取,pub_key_id的結果為false,如果沒有-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----可以自己加上,最后保存到一個rsa_public_key.pem文件中。

    好了,現在已經有了所有的東西,先看簽名函數
     1 <?php 2 /** 3  * 簽名字符串 4  * @param $prestr 需要簽名的字符串 5  * return 簽名結果 6  */ 7 function rsaSign($prestr) { 8     $public_key= file_get_contents('rsa_private_key.pem'); 9     $pkeyid = openssl_get_privatekey($public_key);10     openssl_sign($prestr, $sign, $pkeyid);11     openssl_free_key($pkeyid);12     $sign = base64_encode($sign);13     return $sign;14 }15 ?>
    注意點:

    1.$prestr的內容和MD5一樣(參見手冊,但不包含最后的MD5密碼)
    2.簽名用商戶私鑰
    3.最后的簽名,需要用base64編碼
    4.這個函數返回的值,就是這次請求的RSA簽名。

    驗簽函數:

     1 <?php 2 /** 3  * 驗證簽名 4  * @param $prestr 需要簽名的字符串 5  * @param $sign 簽名結果 6  * return 簽名結果 7  */ 8 function rsaVerify($prestr, $sign) { 9     $sign = base64_decode($sign);10     $public_key= file_get_contents('rsa_public_key.pem');11     $pkeyid = openssl_get_publickey($public_key);12     if ($pkeyid) {13         $verify = openssl_verify($prestr, $sign, $pkeyid);14         openssl_free_key($pkeyid);15     }16     if($verify == 1){17         return true;18     }else{19         return false;20     }21 }22 ?>
    注意點:
    1.$prestr的內容和MD5一樣(參見手冊)
    2.$sign是支付寶接口返回的sign參數用base64_decode解碼之后的二進制
    3.驗簽用支付寶公鑰
    4.這個函數返回一個布爾值,直接告訴你,驗簽是否通過

    支付寶官方提供的PHP版SDKdemo中只對MD5加密方式進行了處理,但android端和ios端 請求支付寶加密方式只能用RSA加密算法,這時服務端PHP就無法驗證簽名了,所以需要對demo進行一些修改。

    1、修改alipay_notify.class.php文件
    verifyNotify 函數第46行
    $isSign = $this->getSignVeryfy($_POST, $_POST['sign']);
    改成
    $isSign = $this->getSignVeryfy($_POST, $_POST['sign'], $_POST['sign_type']);

    verifyReturn函數第83行
    $isSign = $this->getSignVeryfy($_GET, $_GET['sign']);
    改成
    $isSign = $this->getSignVeryfy($_GET, $_GET['sign'],$_GET['sign_type']);

    getSignVeryfy 函數 116行
    function getSignVeryfy($para_temp, $sign) {
    改成
    function getSignVeryfy($para_temp, $sign,$sign_type) {
    getSignVeryfy 函數 127行
    switch (strtoupper(trim($this->alipay_config['sign_type']))) {
    case 'MD5' : $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']); break; default : $isSgin = false; }
    改成
    switch (strtoupper(trim($sign_type))) {
    case 'MD5' : $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']); break;
    case 'RSA' : $isSgin = rsaVerify($prestr, $sign); break; default : $isSgin = false; } 2、新建一個alipay_rsa.function.php文件
     1 <?php 2 /* * 3  * RSA 4  * 詳細:RSA加密 5  * 版本:3.3 6  * 日期:2014-02-20 7  * 說明: 8  * 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,并非一定要使用該代碼。 9  * 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。10  */11 /**12  * 簽名字符串13  * @param $prestr 需要簽名的字符串14  * return 簽名結果15  */16 function rsaSign($prestr) {17     $public_key= file_get_contents('rsa_private_key.pem');18     $pkeyid = openssl_get_privatekey($public_key);19     openssl_sign($prestr, $sign, $pkeyid);20     openssl_free_key($pkeyid);21     $sign = base64_encode($sign);22     return $sign;23 }24 /**25  * 驗證簽名26  * @param $prestr 需要簽名的字符串27  * @param $sign 簽名結果28  * return 簽名結果29  */30 function rsaVerify($prestr, $sign) {31     $sign = base64_decode($sign);32     $public_key= file_get_contents('rsa_public_key.pem');33     $pkeyid = openssl_get_publickey($public_key);34     if ($pkeyid) {35         $verify = openssl_verify($prestr, $sign, $pkeyid);36         openssl_free_key($pkeyid);37     }38     if($verify == 1){39         return true;40     }else{41         return false;42     }43 }44 ?>

    最后要說的是官方提供的手冊上說的基本上都是正確的,只是有些地方沒有說的很詳細,開發的時候一定要多參考,大致就是這樣,祝大家好運。

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    成人福利在线观看| 欧美在线视频播放| 国产精品电影一区| 97不卡在线视频| 亚洲精品电影网| 一区二区三区国产视频| 国产日韩欧美在线播放| 97在线精品视频| 日韩欧美在线看| 中文字幕亚洲天堂| 精品中文视频在线| 欧美成人精品一区二区| 久久免费视频这里只有精品| 成人一区二区电影| 国产成人精品免高潮费视频| 欧美成人手机在线| 17婷婷久久www| 精品在线观看国产| 日韩av在线天堂网| 中文字幕不卡在线视频极品| 午夜精品久久久久久久男人的天堂| 91精品国产综合久久久久久蜜臀| 亚洲国产日韩一区| 日韩av在线播放资源| 亚洲午夜未满十八勿入免费观看全集| 成人a视频在线观看| 成人xxxx视频| 欧美国产日韩xxxxx| 欧美日韩成人在线播放| 亚洲男人第一网站| 欧美成人免费小视频| 2019中文字幕免费视频| 97视频免费在线看| 在线播放日韩精品| 欧美激情啊啊啊| 欧美成人午夜激情视频| 国产一区二区三区四区福利| 亚洲成人av资源网| 国产精品免费视频久久久| 亚洲电影在线观看| 久久久成人av| 亚洲大胆美女视频| 欧美中文字幕视频在线观看| 国产日韩欧美在线视频观看| 亚洲成人在线视频播放| 久久精品国产清自在天天线| 日韩中文字幕第一页| 中文字幕av一区二区| 日韩成人在线视频| 欧美理论电影网| 国产美女久久精品香蕉69| 九九热这里只有精品免费看| 国产精品视频网| 亚洲色图第三页| 亚洲黄在线观看| 亚洲精品视频二区| 久久久噜噜噜久久中文字免| 色香阁99久久精品久久久| 亚洲一区av在线播放| 日韩黄在线观看| 国产精品视频中文字幕91| 国产精品欧美激情| 国产精品久久久久秋霞鲁丝| 久久免费少妇高潮久久精品99| 97香蕉超级碰碰久久免费的优势| 久久夜色精品国产| 精品久久久91| 午夜精品一区二区三区在线播放| 欧美电影免费播放| 久久九九有精品国产23| 亚洲人成网站色ww在线| 亚洲电影中文字幕| 一区二区欧美日韩视频| 九九精品视频在线观看| 日本欧美一级片| 欧美大奶子在线| 久久综合色影院| 中文字幕av一区| 亚洲精品福利在线观看| 成人黄色免费片| 亚洲国产精品女人久久久| 精品成人乱色一区二区| 国产成人在线亚洲欧美| 91社区国产高清| 岛国精品视频在线播放| 91在线视频精品| 欧美第一黄网免费网站| 国产欧美精品在线| 国产欧美中文字幕| 国产亚洲精品美女久久久久| 国产精品视频播放| 亚洲性日韩精品一区二区| 韩日欧美一区二区| 亚洲天堂视频在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲电影av在线| 欧美日韩国产在线| 久久综合久久88| 国产精欧美一区二区三区| 色综合导航网站| 国产成+人+综合+亚洲欧美丁香花| 亚洲欧美日韩精品| 国产精品视频白浆免费视频| 色伦专区97中文字幕| 亚洲视频在线观看免费| 日韩国产欧美精品在线| 久久免费在线观看| 国产精品美女久久久免费| 日韩精品有码在线观看| 日韩精品在线视频美女| 日韩在线视频二区| 国产精品福利观看| 91网站在线免费观看| 亚洲精品美女视频| 亚洲女同精品视频| 一本色道久久综合亚洲精品小说| 91沈先生作品| 亚洲国内精品在线| 日韩黄色av网站| 欧美日韩中文字幕| 亚洲成人久久久久| 国产精品大陆在线观看| 欧美成人四级hd版| 欧美性猛交xxxx乱大交3| 国产suv精品一区二区三区88区| 麻豆乱码国产一区二区三区| 久久精品福利视频| 一区二区欧美激情| 国产成人在线亚洲欧美| 日韩动漫免费观看电视剧高清| 色在人av网站天堂精品| 国产不卡一区二区在线播放| 精品人伦一区二区三区蜜桃网站| 国产欧美精品va在线观看| 国产99久久精品一区二区永久免费| 久久久精品久久久| 国产男女猛烈无遮挡91| 7777精品久久久久久| 国产大片精品免费永久看nba| 成人亚洲综合色就1024| 中文字幕欧美精品日韩中文字幕| 国产精品久久久久久久久久久新郎| 欧美激情视频网| 2018中文字幕一区二区三区| 在线观看国产欧美| 久久影视免费观看| 国产精品欧美日韩久久| 亚洲欧美制服中文字幕| 久久天堂av综合合色| 久久频这里精品99香蕉| 欧美成人黄色小视频| 精品亚洲精品福利线在观看| 午夜伦理精品一区| 久久久久亚洲精品成人网小说| 亚洲黄一区二区| 福利视频第一区| 在线播放亚洲激情| 日韩av手机在线看| 精品福利在线观看| 亚洲午夜未删减在线观看| 亚洲男人天堂久| 国产成人自拍视频在线观看| 中文字幕欧美日韩va免费视频| 一个色综合导航|