當前位置:首頁 » 編程語言 » php支付寶支付sdk

php支付寶支付sdk

發布時間: 2022-09-11 18:24:34

A. php 5.3.13怎麼使用支付寶RSA2

  1. 配置開發者信息「私鑰」And「App_id」

/*配置信息*/
//支付寶分配給開發者的應用ID
$app_id='';
//開發者私鑰,為這里填入方便,去頭、去尾、去換行字元串私鑰,私鑰處理放在簽名方法內。
$private_key='';
//商戶生成簽名字元串所使用的簽名演算法類型,目前支持RSA2和RSA,推薦使用RSA2
$sign_type='RSA2';
/*配置信息*/

2.組裝部分請求參數:根據介面文檔組裝參數app_id、method、format、timestamp、charset、version、notify_url、sign_type

/*組裝請求參數部分start*/

//支付寶分配給開發者的應用ID
$params['app_id']=$app_id;
//介面名稱
$params['method']='alipay.trade.app.pay';
//僅支持JSON
$params['format']='json';
//發送請求的時間,格式"yyyy-MM-ddHH:mm:ss"
$params['timestamp']=date("Y-m-dH:i:s");
//請求使用的編碼格式,如utf-8,gbk,gb2312等
$params['charset']='UTF-8';
//調用的介面版本,固定為:1.0
$params['version']='1.0';
//支付寶伺服器主動通知商戶伺服器里指定的頁面http/https路徑。建議商戶使用https
$params['notify_url']='';
//商戶生成簽名字元串所使用的簽名演算法類型,目前支持RSA2和RSA,推薦使用RSA2
$params['sign_type']=$sign_type;

/*組裝請求參數部分end*/

3.組裝業務參數json格式,並填充在$params數組中

/*組裝業務參數json*/
//對一筆交易的具體描述信息。如果是多種商品,請將商品描述字元串累加傳給body。
$bizcontent['body']='非sdk原生php服務端生成請求訂單';
//商品的標題/交易標題/訂單標題/訂單關鍵字等。
$bizcontent['subject']='php代碼示例';

/*生成隨機數作為外部訂單號start*/
$date=date("YmdHis");
$arr=range(1000,9999);
shuffle($arr);
$out_trade_no=$date.$arr[0];
/*生成隨機數作為外部訂單號end*/
//商戶網站唯一訂單號
$bizcontent['out_trade_no']=$out_trade_no;
//設置未付款支付寶交易的超時時間,一旦超時,該筆交易就會自動被關閉。當用戶進入支付寶收銀台頁面(不包括登錄頁面),會觸發即刻創建支付寶交易,此時開始計時。取值范圍:1m~15d。m-分鍾,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。該參數數值不接受小數點,如1.5h,可轉換為90m。
$bizcontent['timeout_express']='10m';
//訂單總金額,單位為元,精確到小數點後兩位,取值范圍[0.01,100000000]
$bizcontent['total_amount']='0.01';
//銷售產品碼,商家和支付寶簽約的產品碼
$bizcontent['proct_code']='QUICK_MSECURITY_PAY';
//商品主類型:0—虛擬類商品,1—實物類商品註:虛擬類商品不支持使用花唄渠道
$bizcontent['goods_type']='0';
//公用回傳參數,如果請求時傳遞了該參數,則返回給商戶時會回傳該參數。支付寶會在非同步通知時將該參數原樣返回。本參數必須進行UrlEncode之後才可以發送給支付寶
$bizcontent['passback_params']='spicy%3d%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%82%e6%95%b01%26custom%3d%e8%87%aa%e5%ae%9a%e4%b9%89%e5%8f%82%e6%95%b02';

$biz_content=json_encode($bizcontent,JSON_UNESCAPED_UNICODE);
/*組裝業務參數json*/

//將業務參數填充在請求參數內
$params['biz_content']=$biz_content;

4.排序簽名得到sign,並填充在$params數組中「簽名方法請往下翻」

//排序
ksort($params);
//調用簽名方法得到sign填入請求參數
$params['sign']=sign($params,$params['sign_type'],$private_key);

5.將參數urlencode輸出查看,列印出來的參數可以直接放在客戶端使用

//htmlspecialchars是為防止瀏覽器將參數中的「×」和「¬」轉義
echohtmlspecialchars(http_build_query($params));

工具方法:簽名方法和檢查是否為空方法

/**
*簽名函數
*
*@paramarray$params請求參數數組
*@paramstring$signType簽名方式
*@paramstring$private_key為了方便只要填一行字元串
*@returnstring返回類型
*/
functionsign($params,$signType,$private_key){
$stringToBeSigned="";
$i=0;
//將數組使用&符號拼接
foreach($paramsas$k=>$v){
if(false===checkEmpty($v)&&"@"!=substr($v,0,1)){
if($i==0){
$stringToBeSigned.="$k"."="."$v";
}else{
$stringToBeSigned.="&"."$k"."="."$v";
}
$i++;
}
}
unset($k,$v);

//私鑰處理
$res="-----BEGINRSAPRIVATEKEY-----".PHP_EOL.wordwrap($private_key,64,PHP_EOL,true).PHP_EOL."-----ENDRSAPRIVATEKEY-----";
($res)ordie('您使用的私鑰格式錯誤,請檢查RSA私鑰配置');

//
if("RSA2"==$signType){
openssl_sign($stringToBeSigned,$sign,$res,OPENSSL_ALGO_SHA256);
}else{
openssl_sign($stringToBeSigned,$sign,$res);
}
returnbase64_encode($sign);
}

/**
*檢查是否為空
*
*@paramstring$value請求參數數組
*@returnbool返回類型
*/
functioncheckEmpty($value){
if(!isset($value))
returntrue;
if($value===null)
returntrue;
if(trim($value)==="")
returntrue;
returnfalse;
}

B. 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,判斷訂單最終支付結果,並做出最終響應。

C. 支付寶SDK怎麼用

可以先去下載一個的有源碼DEMO。
現在的SDK改名叫移動支付集成開發包。
步驟方法:
1、調用支付寶支付介面

2、處理支付寶返回的支付結果
在調用支付寶支付介面前,還需要先生成一個訂單,文檔中描述時,是將這步也放在客戶端來做了,但也可以在伺服器端生成這個訂單(圖中支付寶會在支付成功後通知伺服器端,所以在伺服器端生成訂單的話,可以掌握所有訂單,而且也會更安全):
生成訂單(可以在iOS客戶端內生成,也可以在伺服器端生成)。
3、調用支付寶支付介面,發送訂單
4、處理支付寶返回的支付結果
其實對於業務來說,這些步驟已經夠了,但是有一個安全性問題,不希望接收到的支付結果被截獲修改,所以,這就需要在生成訂單和處理支付結果的時候做一個安全性校驗:
生成訂單時對數據簽名,收到支付結果時對數據進行簽名驗證,以檢驗數據是否被篡改過。
5、採用RSA加密方式做簽名驗證。

D. PHP怎麼做銀聯的支付介面調用

PHP做銀聯支付介面調用問題
//在工商支付介面之前要找到工行提供的介面文件級dll文件
//將訂單簽名數據公鑰加密提供給工行指定頁面
//組織要簽名的數據串
$src="ICBC_PERBANK_B2C1.0.0.0".$infomer["merid"].$infomer["meracct"].$returnaddress."HS".$ddnumber.$amount."0010".$nowtime."0";
$com=new com('ICBCEBANKUTIL.B2CUtil');
$rc=$com->init("c:\WINDOWS\user.crt","c:\WINDOWS\user.crt","c:\WINDOWS\user.key","11111111");
$ssrc=$com->signC($src, strlen($src)); //訂單簽名數據
$rc=$com->verifySignC($src,strlen($src), $ssrc, strlen($ssrc));
$cert=$com->getCert(1); //商城證書公鑰
//將商戶證書存儲到c:\WINDOWS目錄下,然後創建form表單,將指定的數據提交到工行指定的網頁中
<!--支付寶支付的介面操作,提交的數據-->
<td width="100"><a href="<{$link}>"><img src="images/sy_19.gif" width="90" height="25" border="0"></a></td>
<!--——————————————————-->
<!--工行支付的介面操作,提交的數據-->
<form action="https://mybank.icbc.com.cn/" method="post" name="form_bank">
<input name="interfaceName" type="hidden" value="ICBC_PERBANK_B2C"/>
<input name="interfaceVersion" type="hidden" value="1.0.0.0"/>
<input name="orderid" type="hidden" value="<{$ddnumber}>"/>
<input name="amount" type="hidden" value="<{$amount}>"/>
<input name="curType" type="hidden" value="001"/>
<input name="merID" type="hidden" value="<{$merid}>"/>
<input name="merAcct" type="hidden" value="<{$meracct}>"/>
<input name="verifyJoinFlag" type="hidden" value="0"/>
<input name="notifyType" type="hidden" value="HS"/>
<input name="merURL" type="hidden" value="<{$returnaddress}>"/>
<input name="resultType" type="hidden" value="0"/>
<input name="orderDate" type="hidden" value="<{$nowtime}>"/>
<input name="merSignMsg" type="hidden" value="<{$ssrc}>" />
<input name="merCert" type="hidden" value="<{$cert}>" />
</form>

E. php支付寶驗簽失敗

1可能是編碼問題,看所有文件是不是都使用了統一編碼,比如utf8; 2檢查申請的SDK是否輸入正確,是否完整輸入了申請的SDK; 3如果是支付寶帳號密碼的問題,那就不說了 4建議啟動伺服器後稍等幾分鍾,再做驗證。

F. 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 ?>

G. php開發,如果進行支付寶APP支付

你好,我這里建議你使用支付寶的老介面進行開發,新的介面比較復雜,不太適合新手你。

H. 各支付SDK流程

一、微信支付

微信支付官方流程鏈接: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

簡要來說流程如下:

1.用戶點擊商品下單:「商戶客戶端」調用「商戶服務端」生成訂單,「商戶服務端」後台調用「微信支付系統」的「統一下單API」介面,生成預付訂單後,返回給「商戶服務端後台」,商戶後台再回調給「商戶客戶端」。

2.用戶確認支付:「商戶客戶端」調用「調起微信支付」介面,界面跳轉到微信進行支付。

3.用戶支付成功:這里有三個回調,其一、「微信支付系統」通知「商戶管理後台」支付信息。其二、「微信支付系統」通知「微信客戶端」支付結果。其三、「微信支付系統」通過「商戶客戶端」實現的回調中處理支付狀態,「商戶客戶端」可通過調用「商戶管理後台」的介面查詢當前訂單狀態。(商戶管理後台也需要調用「微信支付系統」查詢訂單介面)

二、支付寶支付

支付流程圖:

支付寶支付對比微信支付流程還進行了簡化,即在生成訂單時,不需要商戶後台請求支付寶生成訂單,基本流程如下:

1.「商家APP」請求「商家後台」下單,「商家後台」返回訂單信息。

2.「商家APP」根據訂單喚起「支付寶App」進行支付。

3.支付成功後,「支付寶支付後台」返回支付結果給「支付寶App」,「支付寶App」返回支付結果給「商家App」、「支付寶支付後台」非同步通知支付結果給「商家後台」。

三、蘋果支付

流程圖:

支付流程:

1.用戶點擊購買,「App客戶端」請求「App服務端」創建交易訂單。

2.「APP客戶端」拿到交易信息,然後開始調起「IAP 伺服器」創建訂單。

3.「IAP伺服器」通知購買成功,並把收據信息寫入APP沙盒中。

4.「APP客戶端」去沙盒中拿到收據信息,並將收據信息上傳到「APP伺服器」,「APP伺服器」把收據信息請求「IAP 伺服器」驗證,如果有則返回到「APP客戶端」,把訂單結束。

參考鏈接: https://juejin.im/post/5a3b14f36fb9a045104aa6c8

I. 支付寶SDK怎麼用

可以先去下載一個的有源碼DEMO。
現在的SDK改名叫移動支付集成開發包。
步驟方法:
1、調用支付寶支付介面
2、處理支付寶返回的支付結果
在調用支付寶支付介面前,還需要先生成一個訂單,文檔中描述時,是將這步也放在客戶端來做了,但也可以在伺服器端生成這個訂單(圖中支付寶會在支付成功後通知伺服器端,所以在伺服器端生成訂單的話,可以掌握所有訂單,而且也會更安全):
生成訂單(可以在iOS客戶端內生成,也可以在伺服器端生成)。
3、調用支付寶支付介面,發送訂單
4、處理支付寶返回的支付結果
其實對於業務來說,這些步驟已經夠了,但是有一個安全性問題,不希望接收到的支付結果被截獲修改,所以,這就需要在生成訂單和處理支付結果的時候做一個安全性校驗:
生成訂單時對數據簽名,收到支付結果時對數據進行簽名驗證,以檢驗數據是否被篡改過。
5、採用RSA加密方式做簽名驗證。

J. thinkPHP框架的項目怎麼做支付寶支付功能

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 "支付失敗!";
}
}
}
?>
復制代碼
3、這里有幾個支付處理過程中需要用到的函數,我把這些函數寫到了項目的Common/common.php中,這樣不用手動調用,即可直接使用這些函數,代碼如下:
//////////////////////////////////////////////////////
//Orderlist數據表,用於保存用戶的購買訂單記錄;
/* Orderlist數據表結構;
CREATE TABLE `tb_orderlist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) DEFAULT NULL,購買者userid
`username` varchar(255) DEFAULT NULL,購買者姓名
`ordid` varchar(255) DEFAULT NULL,訂單號
`ordtime` int(11) DEFAULT NULL,訂單時間
`proctid` int(11) DEFAULT NULL,產品ID
`ordtitle` varchar(255) DEFAULT NULL,訂單標題
`ordbuynum` int(11) DEFAULT '0',購買數量
`ordprice` float(10,2) DEFAULT '0.00',產品單價
`ordfee` float(10,2) DEFAULT '0.00',訂單總金額
`ordstatus` int(11) DEFAULT '0',訂單狀態
`payment_type` varchar(255) DEFAULT NULL,支付類型
`payment_trade_no` varchar(255) DEFAULT NULL,支付介面交易號
`payment_trade_status` varchar(255) DEFAULT NULL,支付介面返回的交易狀態
`payment_notify_id` varchar(255) DEFAULT NULL,
`payment_notify_time` varchar(255) DEFAULT NULL,
`payment_buyer_email` varchar(255) DEFAULT NULL,
`ordcode` varchar(255) DEFAULT NULL, //這個欄位不需要的,大家看我西面的修正補充部分的說明!
`isused` int(11) DEFAULT '0',
`usetime` int(11) DEFAULT NULL,
`checkuser` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

*/
//在線交易訂單支付處理函數
//函數功能:根據支付介面傳回的數據判斷該訂單是否已經支付成功;
//返回值:如果訂單已經成功支付,返回true,否則返回false;
function checkorderstatus($ordid){
$Ord=M('Orderlist');
$ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus');
if($ordstatus==1){
return true;
}else{
return false;
}
}

//處理訂單函數
//更新訂單狀態,寫入訂單支付後返回的數據
function orderhandle($parameter){
$ordid=$parameter['out_trade_no'];
$data['payment_trade_no'] =$parameter['trade_no'];
$data['payment_trade_status'] =$parameter['trade_status'];
$data['payment_notify_id'] =$parameter['notify_id'];
$data['payment_notify_time'] =$parameter['notify_time'];
$data['payment_buyer_email'] =$parameter['buyer_email'];
$data['ordstatus'] =1;
$Ord=M('Orderlist');
$Ord->where('ordid='.$ordid)->save($data);
}

熱點內容
巴法雲伺服器帶寬 發布:2025-01-12 13:15:26 瀏覽:676
搭建國外伺服器需要多少錢 發布:2025-01-12 13:08:01 瀏覽:827
我的世界mod伺服器開荒 發布:2025-01-12 13:07:10 瀏覽:757
sql優化書 發布:2025-01-12 13:07:09 瀏覽:455
高校網站伺服器搭建與維護論文 發布:2025-01-12 13:06:31 瀏覽:711
sqlserver實例沒有 發布:2025-01-12 12:57:18 瀏覽:252
代碼文件伺服器地址怎麼寫 發布:2025-01-12 12:50:47 瀏覽:759
java中方法與 發布:2025-01-12 12:50:13 瀏覽:655
如何快速查找c語言編譯時的錯 發布:2025-01-12 12:49:56 瀏覽:32
看門狗上傳病毒 發布:2025-01-12 12:32:54 瀏覽:326