1,申請流程
首先必須通知客戶先申請支付寶商家賬號荞彼,然后認證。地址:https://open.alipay.com/platform/home.htm
[圖片上傳失敗...(image-a11c37-1595316808224)]
這里都是需要客戶操作的抬伺,客戶點擊支付接入后捉撮,會有個認證簽約頁面彤断,簽約完之后野舶,會生成應(yīng)用唯一標識(APPID)。應(yīng)用創(chuàng)建完成后宰衙,系統(tǒng)會自動跳轉(zhuǎn)到應(yīng)用詳情頁面平道。然后可以點擊 添加功能 來添加App支付功能。添加功能完后,我的應(yīng)用列表就會顯示添加的應(yīng)用供炼,即支付寶App支付一屋。這一步我們只需要等待客戶申請就好窘疮,什么也不用做。詳細流程參加支付寶官方文檔:https://docs.open.alipay.com/... 這里面唯一需要開發(fā)者做的就是生成密鑰這一步冀墨。
2闸衫,支付寶配置
[圖片上傳失敗...(image-904263-1595316808224)]
說明:
接口加簽方式
詳細操作見第三步
IP白名單
安全性考慮,添加上IP地址
其他的可以不用設(shè)置
3诽嘉,公鑰密鑰生成
具體教程官網(wǎng)都有蔚出,簡單的說明一下,上傳應(yīng)用公鑰去并獲取支付寶公鑰虫腋。https://docs.open.alipay.com/291/105972
4骄酗,SDK開發(fā)者后臺接入
在開始后臺代碼前,我們必須有3個參數(shù)悦冀,開發(fā)者私鑰
趋翻、支付寶公鑰
、APPID
盒蟆。 這里的開發(fā)者私鑰也叫應(yīng)用私鑰
踏烙。沒有這3個參數(shù),就沒法喚起支付寶支付接口!!!
準備好后可以下載支付寶的官方demo代碼參考茁影。https://docs.open.alipay.com/54/106370
[圖片上傳失敗...(image-90354-1595316808224)]
5宙帝,核心步驟代碼(支付寶APP支付)
說明:參數(shù)定義
const APPID = '2021******';
//開發(fā)者私鑰去頭去尾去回車,一行字符串
const RSA_PRIVATE_KEY = 'MIIEpQIBAA*******';
//支付寶公鑰(上傳開發(fā)者公鑰(又叫應(yīng)用公鑰)后才能生成)
const ALIPAY_RSA_PUBLIC_KEY = 'MIIBIjABAA*******;
說明:前端調(diào)用的方法
/**
*支付方法募闲,調(diào)用支付寶接口成功后步脓,會返回給前端一個長串的參數(shù)字符串。前端利用它喚起支付寶
*/
public function paytoOffi()
{
// 這里接收前端的參數(shù)
// 數(shù)據(jù)庫生成訂單
// 下邊是模擬的數(shù)據(jù)(訂單號浩螺、主題靴患、金額、備注)
$out_trade_no = time();
$subject = time();
$total_amount = 1;
$body = '備注';
$res = $this->getAlipayMsg($body,$subject,$out_trade_no,$total_amount);
return $res; //必須是json格式
}
說明:getAlipayMsg方法
/**
* 調(diào)用支付寶接口方法
* @method
* @param $body 訂單描述
* @param $subject 訂單標題
* @param $out_trade_no 訂單號
* @param $amount 價格
*/
private function getAlipayMsg($body, $subject, $out_trade_no, $amount)
{
vendor('alipay.aop.AopClient');
vendor('alipay.aop.request.AlipayTradeAppPayRequest');
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; //這里是寫死的要出,支付寶網(wǎng)關(guān)地址
$aop->appId = self::APPID;
$aop->rsaPrivateKey = self::RSA_PRIVATE_KEY;
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;
//實例化具體API對應(yīng)的request類,類名稱和接口名稱對應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay
$request = new \AlipayTradeAppPayRequest();
//SDK已經(jīng)封裝掉了公共參數(shù)鸳君,這里只需要傳入業(yè)務(wù)參數(shù)
$bizcontent = "{\"body\":\"{$body}\","http://支付商品描述
. "\"subject\":\"{$subject}\","http://支付商品的標題
. "\"out_trade_no\":\"{$out_trade_no}\","http://商戶網(wǎng)站唯一訂單號
. "\"timeout_express\":\"60m\","http://該筆訂單允許的最晚付款時間,逾期將關(guān)閉交易
. "\"total_amount\":\"{$amount}\","http://訂單總金額患蹂,單位為元或颊,精確到小數(shù)點后兩位,取值范圍[0.01,100000000]
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl('http://text.baidu.com/api/Alipay/notify');//你自己的異步地址传于,必須寫全囱挑,而且不能有參數(shù)
$request->setBizContent($bizcontent);
//這里和普通的接口調(diào)用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
file_put_contents('d.txt',json_encode($response),FILE_APPEND); //寫入txt支付寶的返回數(shù)據(jù)
return $response;
}
說明:異步回調(diào)方法
/**
* 用戶消費異步通知服務(wù)器方法
*/
public function notify()
{
$arr = $_POST;
file_put_contents('d.txt',json_encode($arr),FILE_APPEND); //寫入txt支付寶的返回數(shù)據(jù)
//驗證簽名
$aop = new \AopClient();
$aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;
$flag = $aop->rsaCheckV1($arr, null, "RSA2");
if ($flag) {
// 商戶訂單號
$out_trade_no = $arr['out_trade_no'];
// 支付寶交易號
$trade_no = $arr['trade_no'];
// 交易狀態(tài)
$trade_status = $arr['trade_status'];
// 交易金額
$total_amount = $arr['total_amount'];
if ($arr['trade_status'] == 'TRADE_SUCCESS'
|| $arr['trade_status'] == 'TRADE_FINISHED') { //處理交易完成或者支付成功的通知
//自己的業(yè)務(wù)邏輯,比如修改訂單為已支付
die('success');
//必須有這句,echo 'success'也可以沼溜,否則支付寶會以為支付沒成功平挑,而在一天內(nèi)連續(xù)調(diào)用異步接口,容易出錯
}
}
}
6,踩過的坑
- 首先前臺調(diào)支付接口paytoOffi通熄,然后這個方法就會調(diào)getAlipayMsg方法唆涝,即調(diào)支付寶接口的方法,這4個參數(shù)描述唇辨、標題廊酣、訂單號、價格后3個是必填的助泽。描述可以不填啰扛,這個酌情修改。然后調(diào)接口嗡贺,支付寶會返回請求字符串隐解,即喚起支付寶軟件的一長串字符串,這里有個大坑诫睬,官方文檔上說直接echo 給前臺就行煞茫,但其實應(yīng)該轉(zhuǎn)成json格式返給前臺,否則會報100XX錯誤摄凡,即參數(shù)格式不正確续徽。下面是官方的坑教程截圖:
[圖片上傳失敗...(image-947f2e-1595316808224)]
引入的問題,將下載的demo放在
vendor
目錄下亲澡,vendor('alipay.aop.AopClient');
引入-
php對接app支付寶支付出錯Cannot redeclare Decrypt()
報錯原因
:alipaySDK中定義的Encrypt()/Decrypt()函數(shù)與Laravel中定義的Encrypt()/Decrypt()函數(shù)重名了钦扭。解決辦法
:修改alipaySDK中定義的函數(shù)名稱、修改引用的函數(shù)名稱床绪。解決步驟
:在官方給的SDK中客情,一共有需要修改三個文件中的內(nèi)容:aop/AopEncrypt.php
、aop/AopClient.php
癞己、lotusphp_runtime/Cookie/Cookie.php
在文件中查找encrypt/decrypt替換為alipayEncrypt/alipayDecrypt即可膀斋。
7,額外鏈接
https://segmentfault.com/a/1190000020056817?utm_source=tag-newest