當前位置:首頁 » 編程語言 » php支付寶介面文檔

php支付寶介面文檔

發布時間: 2022-06-12 21:25:17

php 怎麼調用支付寶介面

支付寶對接文檔里有對接代碼,復制就行。

② php支付寶介面

登錄支付寶,然後有個商戶版的,進入申請雙功能介面,

然後下載下來的介麵包文件有很多語言的源碼

<?php
//這里有一些教程希望能幫到你
//http://www.php100.com/html/shipinjiaocheng/PHP100shipinjiaocheng/2010/0815/5224.html
?>

望採納

③ PHP支付寶介面,付款成功後,返回成功,然後將消費記錄插入到資料庫。插入資料庫的代碼寫在哪個文件里

付款成功的邏輯處理在noticy文件里,這個文件不可見,是支付寶付款成功後台調用通知你的頁面

return這個文件是付款成功後用戶跳回看到的頁面,

官方的文檔寫的很清楚

④ PHP支付寶介面,成功支付後,怎樣讓他跳轉到指定頁面

支付介面代碼里都有用注釋代碼注釋的,有一個地址就是返回你的網站的指定頁面的,你還可以調用參數。
PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標准通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。

⑤ php中支付寶介面怎麼做

開源中國,很不錯的,很多牛人,上面你可以提問:
http://www.oschina.net/alipay
支付寶技術文檔下載:
http://www.oschina.net/question/4882_24033

⑥ thinkphp中怎麼加入支付寶介面

重新整理介麵包文件,這一步應該算是比較關鍵的(個人認為)
下載下來的介麵包文件有很多語言的源碼,

我們選擇 create_direct_pay_by_user-PHP-UTF-8 這個名稱的介面文件。裡麵包括如下文件:

images文件里是支付寶相關的一些標志的圖片,我們暫不管他,lib文件很重要,是整個介面的核心類文件;
alipay.config.php是相關參數的配置文件
alipayapi.php 是支付寶介面入口文件
notify_url.php 是伺服器非同步通知頁面文件;
return_url.php 是頁面跳轉同步通知文件;

在ThinkPHP的框架文件下,找到Extend 進入,再進入Vendor,在Vendor文件夾下,新建文件夾Alipay,把支付寶作為第三方類庫引入。然後,復制支付寶介面文件包中lib文件里的所有文件。一共4個文件,如下:

現在對以上文件進行重命名,
alipay_core.function.php重命名為:Corefunction.php;
alipay_md5.function.php重命名為:Md5function.php;
alipay_notify.class.php重命名為:Notify.php;
alipay_submit.class.php重命名為:Submit.php;

然後,打開Submit.php文件,把以下代碼去掉;
require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");
復制代碼
同樣,打開Notify.php文件,把以下兩段代碼去掉
require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");
復制代碼
為什麼要去掉以上兩個文件中的這兩段代碼,因為在項目中調用介面文件的時候,我把所有4個核心文件都通過vendor來進行引入。所以,這不再需要導入。

到此,支付寶介麵包相關核心類庫的整理基本完成。現在開始在項目中調用;

三、在項目中調用支付寶介面
調用分兩步:
1、在配置文件中Conf/Config.php文件中對支付寶相關參數進行配置:
//支付寶配置參數
'alipay_config'=>array(
'partner' =>'20********50', //這里是你在成功申請支付寶介面後獲取到的PID;
'key'=>'9t***********ie',//這里是你在成功申請支付寶介面後獲取到的Key
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=> getcwd().'\\cacert.pem',
'transport'=> 'http',
),
//以上配置項,是從介麵包中alipay.config.php 文件中復制過來,進行配置;

'alipay' =>array(
//這里是賣家的支付寶賬號,也就是你申請介面時注冊的支付寶賬號
'seller_email'=>'[email protected]',

//這里是非同步通知頁面url,提交到項目的Pay控制器的notifyurl方法;
'notify_url'=>'http://www.xxx.com/Pay/notifyurl',

//這里是頁面跳轉通知url,提交到項目的Pay控制器的returnurl方法;
'return_url'=>'http://www.xxx.com/Pay/returnurl',

//支付成功跳轉到的頁面,我這里跳轉到項目的User控制器,myorder方法,並傳參payed(已支付列表)
'successpage'=>'User/myorder?ordtype=payed',

//支付失敗跳轉到的頁面,我這里跳轉到項目的User控制器,myorder方法,並傳參unpay(未支付列表)
'errorpage'=>'User/myorder?ordtype=unpay',
),
復制代碼
2、新建一個PayAction控制器代碼如下:
<?php
class PayAction extends Action{
//在類初始化方法中,引入相關類庫
public function _initialize() {
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
}

//doalipay方法
/*該方法其實就是將介面文件包下alipayapi.php的內容復制過來
然後進行相關處理
*/
public function doalipay(){
/*********************************************************
把alipayapi.php中復制過來的如下兩段代碼去掉,
第一段是引入配置項,
第二段是引入submit.class.php這個類。
為什麼要去掉??
第一,配置項的內容已經在項目的Config.php文件中進行了配置,我們只需用C函數進行調用即可;
第二,這里調用的submit.class.php類庫我們已經在PayAction的_initialize()中已經引入;所以這里不再需要;
*****************************************************/
// require_once("alipay.config.php");
// require_once("lib/alipay_submit.class.php");

//這里我們通過TP的C函數把配置項參數讀出,賦給$alipay_config;
$alipay_config=C('alipay_config');

/**************************請求參數**************************/

$payment_type = "1"; //支付類型 //必填,不能修改
$notify_url = C('alipay.notify_url'); //伺服器非同步通知頁面路徑
$return_url = C('alipay.return_url'); //頁面跳轉同步通知頁面路徑
$seller_email = C('alipay.seller_email');//賣家支付寶帳戶必填
$out_trade_no = $_POST['trade_no'];//商戶訂單號 通過支付頁面的表單進行傳遞,注意要唯一!
$subject = $_POST['ordsubject']; //訂單名稱 //必填 通過支付頁面的表單進行傳遞
$total_fee = $_POST['ordtotal_fee']; //付款金額 //必填 通過支付頁面的表單進行傳遞
$body = $_POST['ordbody']; //訂單描述 通過支付頁面的表單進行傳遞
$show_url = $_POST['ordshow_url']; //商品展示地址 通過支付頁面的表單進行傳遞
$anti_phishing_key = "";//防釣魚時間戳 //若要使用請調用類文件submit中的query_timestamp函數
$exter_invoke_ip = get_client_ip(); //客戶端的IP地址
/************************************************************/

//構造要請求的參數數組,無需改動
$parameter = array(
"service" => "create_direct_pay_by_user",
"partner" => trim($alipay_config['partner']),
"payment_type" => $payment_type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"seller_email" => $seller_email,
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"show_url" => $show_url,
"anti_phishing_key" => $anti_phishing_key,
"exter_invoke_ip" => $exter_invoke_ip,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);
//建立請求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "確認");
echo $html_text;
}

/******************************
伺服器非同步通知頁面方法
其實這里就是將notify_url.php文件中的代碼復制過來進行處理

*******************************/
function notifyurl(){
/*
同理去掉以下兩句代碼;
*/
//require_once("alipay.config.php");
//require_once("lib/alipay_notify.class.php");

//這里還是通過C函數來讀取配置項,賦值給$alipay_config
$alipay_config=C('alipay_config');

//計算得出通知驗證結果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();

if($verify_result) {
//驗證成功
//獲取支付寶的通知返回參數,可參考技術文檔中伺服器非同步通知參數列表
$out_trade_no = $_POST['out_trade_no']; //商戶訂單號
$trade_no = $_POST['trade_no']; //支付寶交易號
$trade_status = $_POST['trade_status']; //交易狀態
$total_fee = $_POST['total_fee']; //交易金額
$notify_id = $_POST['notify_id']; //通知校驗ID。
$notify_time = $_POST['notify_time']; //通知的發送時間。格式為yyyy-MM-dd HH:mm:ss。
$buyer_email = $_POST['buyer_email']; //買家支付寶帳號;
$parameter = array(
"out_trade_no" => $out_trade_no, //商戶訂單編號;
"trade_no" => $trade_no, //支付寶交易號;
"total_fee" => $total_fee, //交易金額;
"trade_status" => $trade_status, //交易狀態
"notify_id" => $notify_id, //通知校驗ID。
"notify_time" => $notify_time, //通知的發送時間。
"buyer_email" => $buyer_email, //買家支付寶帳號;
);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){
orderhandle($parameter);
//進行訂單處理,並傳送從支付寶返回的參數;
}
}
echo "success"; //請不要修改或刪除
}else {
//驗證失敗
echo "fail";
}
}

/*
頁面跳轉處理方法;
這里其實就是將return_url.php這個文件中的代碼復制過來,進行處理;
*/
function returnurl(){
//頭部的處理跟上面兩個方法一樣,這里不羅嗦了!
$alipay_config=C('alipay_config');
$alipayNotify = new AlipayNotify($alipay_config);//計算得出通知驗證結果
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {
//驗證成功
//獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表
$out_trade_no = $_GET['out_trade_no']; //商戶訂單號
$trade_no = $_GET['trade_no']; //支付寶交易號
$trade_status = $_GET['trade_status']; //交易狀態
$total_fee = $_GET['total_fee']; //交易金額
$notify_id = $_GET['notify_id']; //通知校驗ID。
$notify_time = $_GET['notify_time']; //通知的發送時間。
$buyer_email = $_GET['buyer_email']; //買家支付寶帳號;

$parameter = array(
"out_trade_no" => $out_trade_no, //商戶訂單編號;
"trade_no" => $trade_no, //支付寶交易號;
"total_fee" => $total_fee, //交易金額;
"trade_status" => $trade_status, //交易狀態
"notify_id" => $notify_id, //通知校驗ID。
"notify_time" => $notify_time, //通知的發送時間。
"buyer_email" => $buyer_email, //買家支付寶帳號
);

if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
if(!checkorderstatus($out_trade_no)){
orderhandle($parameter); //進行訂單處理,並傳送從支付寶返回的參數;
}
$this->redirect(C('alipay.successpage'));//跳轉到配置項中配置的支付成功頁面;
}else {
echo "trade_status=".$_GET['trade_status'];
$this->redirect(C('alipay.errorpage'));//跳轉到配置項中配置的支付失敗頁面;
}
}else {
//驗證失敗
//如要調試,請看alipay_notify.php頁面的verifyReturn函數
echo "支付失敗!";
}
}
}
?>

⑦ php開發中app怎麼接入支付寶

准備工作
APP支付介面:alipay.trade.app.pay
伺服器端使用框架:TP5
登錄螞蟻金服開放平台 --> 創建應用 --> 添加App支付功能。具體查看官方文檔
下載官方 SDK (PHP版本資源)——當前SDK版本:106 生成時間:2017-07-25 11:46:10
將SDK原碼放置在TP5的vendor目錄下的alipay文件夾(可根據實際使用框架技術進行實際調整)。
支付介面調用原理
1、APP支付系統架構
APP支付系統架構圖
2、數據校驗原理
數據校驗原理
應用公鑰(商戶自身的RSA公鑰):支付寶使用該公鑰驗證該交易是商戶發起。
支付寶公鑰(支付寶的RSA公鑰):商戶使用該公鑰驗證該結果是支付寶返回的。
3、系統交互流程
系統交互流程圖
4、支付場景具體實現流程(最詳細圖解)
在集成App支付能力時,建議實現如下支付流程,創建訂單並支付,根據返回的結果確定支付狀態,並進行相應的異常處理,其過程如下圖所示.
支付場景具體實現流程
商家APP在創建訂單並且喚起支付寶APP支付,流程如上圖所示,根據第2.2,3步返回的支付結果,確定支付狀態,並且做相應的異常處理(必要時關閉訂單)
代碼實現
步驟1:商戶APP端請求商戶伺服器介面,提交訂單數據。
步驟2:商戶伺服器端接收數據,然後對數據進行簽名,返回請求參數到商戶APP端。
官方介面文檔:https://docs.open.alipay.com/204/105465/
——代碼如下:
//vendor();為TP5框架的方法,作用:導入第三方框架類庫
vendor('alipay.aop.AopClient');
vendor('alipay.aop.request.AlipayTradeAppPayRequest');
//實例化支付介面
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; //支付寶網關
$aop->appId = 「應用ID,填寫你的APPID」;
$aop->rsaPrivateKey = "商戶私鑰,您的原始格式RSA私鑰()";
$aop->alipayrsaPublicKey = "支付寶公鑰";
$aop->apiVersion = '1.0';
$aop->signType = "簽名方式,如 RSA2 ";
$aop->postCharset = 'UTF-8';
$aop->format = "json";
//實例化具體API對應的request類,類名稱和介面名稱對應,當前調用介面名稱:alipay.trade.app.pay
$appRequest = new \AlipayTradeAppPayRequest();
//SDK已經封裝掉了公共參數,這里只需要傳入業務參數
$bizcontent = json_encode([
'body' => '余額充值', //訂單描述
'subject' => '充值', //訂單標題
'timeout_express' => '30m',
'out_trade_no' => 『20170125test01』, //商戶網站唯一訂單號
'total_amount' => '0.01', //訂單總金額
'proct_code' => 'QUICK_MSECURITY_PAY', //固定值
]);
$appRequest->setNotifyUrl($url); //設置非同步通知地址
$appRequest->setBizContent($bizcontent);
//這里和普通的介面調用不同,使用的是sdkExecute
$response = $aop->sdkExecute($appRequest);
//htmlspecialchars是為了輸出到頁面時防止被瀏覽器將關鍵參數html轉義,實際列印到日誌以及http傳輸不會有這個問題
echo htmlspecialchars($response);//就是orderString 可以直接給客戶端請求,無需再做處理。
// 如果最後有問題可以嘗試把htmlspecialchars方法去掉,直接返回$response
說明:sdkExecute()方法,作用生成簽名,詳細步驟如下:
將請求參數組裝分下列3步,以最後第三步獲取到的請求為准。
1)將請求參數的鍵按字典排序,然後按照key=value&key=value方式拼接,得到未簽名原始字元串如下:
app_id=2015052600090779&biz_content={"timeout_express":"30m","proct_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試數據","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0
2)再對原始字元串進行簽名
app_id=2015052600090779&biz_content={"timeout_express":"30m","proct_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試數據","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0&sign=+/=
3)最後對請求字元串的所有一級value(biz_content作為一個value)進行encode,編碼格式按請求串中的charset為准,沒傳charset按UTF-8處理,獲得最終的請求字元串:
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22proct_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=%2B%2F%3D
步驟3:商戶APP接收從商戶伺服器端返回的請求參數,然後調起支付寶支付面板。
若用戶支付成功,支付寶會同步給商戶APP端返回一個支付結果。相應地,支付寶也會通過非同步通知給商戶伺服器端返回一個支付結果。
注意:由於同步通知和非同步通知都可以作為支付完成的憑證,且非同步通知支付寶一定會確保發送給商戶服務端。為了簡化集成流程,商戶可以將同步結果僅僅作為一個支付結束的通知(忽略執行校驗),實際支付是否成功,完全依賴服務端非同步通知。
步驟4:服務端非同步通知處理機制(支付寶主動發起通知,該方式才會被啟用)
官方介面文檔:https://docs.open.alipay.com/204/105301/
注意點:
1)必須保證伺服器非同步通知頁面(notify_url)上無任何字元,如空格、HTML標簽、開發系統自帶拋出的異常提示信息等;
2)支付寶是用POST方式發送通知信息,因此該頁面中獲取參數的方式,如:$_POST[『out_trade_no』];
3)程序執行完後必須列印輸出「success」(不包含引號)。如果商戶反饋給支付寶的字元不是success這7個字元,支付寶伺服器會不斷重發通知,直到超過24小時22分鍾。一般情況下,25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);
4)當商戶收到伺服器非同步通知並列印出success時,伺服器非同步通知參數notify_id才會失效。
——代碼如下:
$aop = new AopClient;
$aop->alipayrsaPublicKey = '請填寫支付寶公鑰,一行字元串';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2"); //驗證簽名
if($flag){
//校驗通知數據的正確性
$out_trade_no = $_POST[『out_trade_no']; //商戶訂單號
$trade_no = $_POST[『trade_no']; //支付寶交易號
$trade_status = $_POST[『trade_status']; //交易狀態trade_status
$total_amount = $_POST[『'total_amount']; //訂單的實際金額
$app_id = $_POST[『app_id'];
if($app_id!=$this->config['app_id']) exit('fail'); //驗證app_id是否為該商戶本身
//只有交易通知狀態為TRADE_SUCCESS或TRADE_FINISHED時,支付寶才會認定為買家付款成功。
if($trade_status != 'TRADE_FINISHED' && $trade_status != 'TRADE_SUCCESS')
exit('fail');
//校驗訂單的正確性
if(!empty($out_trade_no)){
//1、商戶需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號;
//2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額);
//3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)。
//上述1、2、3有任何一個驗證不通過,則表明本次通知是異常通知,務必忽略。在上述驗證通過後商戶必須根據支付寶不同類型的業務通知,正確的進行不同的業務處理,並且過濾重復的通知結果數據。
//校驗成功後在response中返回success,校驗失敗返回failure
}
exit('fail');
}
echo"fail"; //驗證簽名失敗
步驟5:當商戶APP端接收到支付寶的同步返回結果為成功時,商戶APP端再請求商戶伺服器端API,判斷訂單最終支付結果,並做出最終響應。

⑧ 支付寶介面 notify_url.php和return_url.php這兩個頁面應該怎麼寫

汗,怎麼會不能讀取session呢?給你粘貼段淘寶技術的解釋:
返回頁面(return_url文件)工作原理
即:商戶系統請求/支付寶響應交互模式
1、 構造請求數據
商戶通過提供的介面代碼示例,通過代碼示例的規則,程序構造與運算得到sign加密結果以及構造後的請求給支付寶的數據集合。get方式下是url地址鏈接,post方式下是支付寶網關地址及參數集合。
2、 發送請求數據
把構造完成的數據集合,通過頁面鏈接跳轉或表單提交的方式傳遞給支付寶。
3、 請求的交易
支付寶得到這些集合後,會先做安全校驗等驗證,一系列驗證通過後便會處理完成這次發送過來的數據請求。
4、 返回相應數據
支付寶對處理完成的交易,程序上自動進行重新構造成url地址鏈接,以自動跳轉的方式跳回商家在請求時設定好的頁面路徑地址(參數return_url,商家沒設定,則不會跳回)。
5、 對相應的數據進行處理
商家的返回頁面(參數return_url指定頁面文件)得到支付寶返回的數據,把這些數據結合自身網站情況,進行數據處理(如:訂單更新)。
返回頁面(notify_url文件)工作原理
即:支付寶主動通知交互模式(支付寶反饋數據)
前提:若要支付寶能主動通知,需商戶在請求時設定好通知的頁面路徑(參數notify_url),且該頁面文件完全空白,無任何字元。
1、 發起通知
一旦交易狀態發生變更(如:買家已付款,等待賣家發貨),支付寶便會根據自動進行數據處理,並主動調用商戶在請求時設定好通知的頁面路徑(參數notify_url)
2、 對通知數據進行處理
商戶網站收到支付寶發送過來的通知數據,把這些數據結合自身網站情況,進行數據處理,如:處理返回頁(參數return_url)漏掉的訂單,做訂單更新,即補單措施。
3、 在頁面上輸出success
商戶網站處理完成所有的數據處理以後,即程序運行最後,返回寫頁面「success」這7個字元(頁面上只允許輸出success),以表示自己已經成功處理完成自己的業務。
4、 完成處理該次通知,不再發送通知
支付寶得到商戶反饋回來的「success」7個字元信息,進行核對與驗證,結束此次通知流程。
注意:
如果商戶反饋給支付寶的字元不是success這7個字元,支付寶伺服器會不斷重發通知,直到超過24小時22分鍾。一般情況下 25 小時以內完成8 次通知(通知的間隔頻率一般是:2m,10m,10m,1h,2h,6h,15h)。

⑨ php 手機支付寶介面要配置哪些文件

登錄支付寶,然後有個商戶版的,進入申請雙功能介面,

然後下載下來的介麵包文件有很多語言的源碼

我們選擇PHP版的UFT-8

裡麵包括一些文件

images文件里是支付寶相關的一些標志的圖片,lib文件很重要,是整個介面的核心類文件;
alipay.config.php是相關參數的配置文件
alipayapi.php 是支付寶介面入口文件
notify_url.php 是伺服器非同步通知頁面文件;
return_url.php 是頁面跳轉同步通知文件;

按照開發文檔開發即可

注:開發文檔就是支付寶官方給你的一些文檔,這么接入等等的。注意事項。不用擔心,下載下來,已經有例子給你的了,你只能修改下配置即可,更詳細的介紹可以去看下php中文網的這篇文章http://www.php.cn/php-weizijiaocheng-326873.html,希望對你有幫助

⑩ php 支付寶介面官方給的md5簽名版本和rsa簽名版本的區別

雖然支付寶官方還未提供相關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_public_key.pem
生成之後,按照手冊的說明,需要在簽約平台上傳公鑰,需要注意的是,上傳的時候需要把所有的注釋和換行都去掉。
另外手冊中還有如下命令:
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
該命令將RSA私鑰轉換成PKCS8格式,對於PHP來說,不需要。
支付寶公鑰:
根據手冊,在簽約平台獲得。
如果你直接復制下來的話,會得到一個字元串,需要進行下面的轉換;
1)把空格變成換行
2)添加註釋
比如你復制下來的公鑰是:
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那轉換之後為:
-----BEGIN PUBLIC KEY-----

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版SDK demo中只對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 ?>

熱點內容
linux的gz解壓命令 發布:2024-05-05 18:24:13 瀏覽:309
伺服器機櫃屬於什麼輻射 發布:2024-05-05 18:02:10 瀏覽:335
存儲成本計算 發布:2024-05-05 18:02:10 瀏覽:583
如何把手機改安卓10 發布:2024-05-05 17:39:07 瀏覽:497
我的世界怎麼擴容伺服器內存 發布:2024-05-05 17:19:54 瀏覽:48
java讀取文件字元 發布:2024-05-05 17:15:18 瀏覽:11
三星怎麼應用加密 發布:2024-05-05 17:13:18 瀏覽:152
cad字體在那個文件夾 發布:2024-05-05 17:08:20 瀏覽:331
什麼時候用編譯器 發布:2024-05-05 17:08:20 瀏覽:766
應急救援腳本 發布:2024-05-05 17:08:17 瀏覽:338