1、https://openhome.alipay.com/ 支付寶開放平臺並建立應用,審覈經過後並簽約app支付拿到pidphp
2、按照官方文檔用 【RSA簽名驗籤工具.bat】生成應用公鑰和私鑰html
三、下載支付寶官方demo(https://docs.open.alipay.com/54/106370/根據本身的開發語言下載)包整合到項目中(說實話這個php的demo着實有些坑)express
整合好開始寫支付寶支付類代碼以下:json
<?php namespace data\extend; use data\extend\alipay_app\aop\AopClient; use data\extend\alipay_app\aop\request\AlipayTradeAppPayRequest as AlipayTradeAppPayRequest; /** * 功能說明:自定義支付寶支付接入類 */ class AliPayApp { protected $aop; /** * 初始化 */ public function __construct() { $this->aop = new AopClient(); $this->aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $this->aop->appId = "步驟一中拿到的應用appid"; $this->aop->rsaPrivateKey = "*******";//私有密鑰(步驟二中生成的商戶私有祕鑰) $this->aop->format = "JSON"; $this->aop->charset = "utf-8"; $this->aop->signType = "RSA2"; $this->aop->alipayrsaPublicKey = "****";//商戶公鑰(步驟二中生成的商戶公鑰) $this->aop->alipayPublicKey = "*****";//支付寶公鑰 } /** * 建立APP支付訂單 * * @param string $body 對一筆交易的具體描述信息。 * @param string $subject 商品的標題/交易標題/訂單標題/訂單關鍵字等。 * @param string $order_sn 商戶網站惟一訂單號 * @return array 返回訂單信息 */ public function createAppPay($order_sn,$body, $subject, $total_amount) { //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay $request = new AlipayTradeAppPayRequest(); //SDK已經封裝掉了公共參數,這裏只須要傳入業務參數 $bizcontent = [ 'body' => $body, 'subject' => $subject, 'out_trade_no' => $order_sn, 'timeout_express' => '1d',//失效時間爲 1天 'total_amount' => $total_amount,//價格 'product_code' => 'QUICK_MSECURITY_PAY', ]; //商戶外網能夠訪問的異步地址 (異步回掉地址,根據本身需求寫) $request->setNotifyUrl("http://".$_SERVER['HTTP_HOST']."/此處爲回調通知地址"); $request->setBizContent(json_encode($bizcontent)); //這裏和普通的接口調用不一樣,使用的是sdkExecute $response = $this->aop->sdkExecute($request); return $response; //htmlspecialchars是爲了輸出到頁面時防止被瀏覽器將關鍵參數html轉義,實際打印到日誌以及http傳輸不會有這個問題 } /** * 異步通知驗籤 * * @param string $params 參數 * @param string $signType 簽名類型:默認RSA * @return bool 是否經過 */ public function rsaCheck($params, $signType) { return $this->aop->rsaCheckV1($params, NULL, $signType); } }
上面代碼注意在調用 data\extend\alipay_app\aop\AopClient 這個類須要注意回調驗籤的過程調用 $this->aop->rsaCheckV1()這個類進行通知的sign和post回來的參數(此處須要主要驗簽過程按照官方要求去掉sign和sign_type後)從新組裝+支付寶公鑰($this->aop->alipayPublicKey切記不是應用公鑰)代碼稍做調整以下api
/** rsaCheckV1 & rsaCheckV2 * 驗證簽名 * 在使用本方法前,必須初始化AopClient且傳入公鑰參數。 * 公鑰是不是讀取字符串仍是讀取文件,是根據初始化傳入的值判斷的。 **/ public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') { $sign = $params['sign']; $params['sign_type'] = null; $params['sign'] = null; return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType); } function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') { if($this->checkEmpty($this->alipayPublicKey)){ $pubKey= $this->alipayrsaPublicKey; $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; //logWrite("商戶RSA公鑰".$res); }else { //讀取公鑰文件(註釋部分爲原來) //$pubKey = file_get_contents($rsaPublicKeyFilePath); //轉換爲openssl格式密鑰 //$res = openssl_get_publickey($pubKey);
//此處更改成支付寶公鑰驗籤 $pubKey= $this->alipayPublicKey; $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; // logWrite("支付寶RSA公鑰".$res); } ($res) or die('支付寶RSA公鑰錯誤。請檢查公鑰文件格式是否正確'); //調用openssl內置方法驗籤,返回bool值 //logWrite("簽名:".$sign); if ("RSA2" == $signType) { $result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256); } else { $result = (bool)openssl_verify($data, base64_decode($sign), $res); } if(!$this->checkEmpty($this->alipayPublicKey) && is_file($this->alipayPublicKey)) { //釋放資源 openssl_free_key($res); } //logWrite("驗簽結果:".var_export($result,true)); return $result; }
至此基本大功告成,最後一步是APP端的調用代碼以下:瀏覽器
public function aliPayApp() { $out_trade_no = $this->GetReqArgc('out_trade_no'); if (empty($out_trade_no)) { $this->error("沒有獲取到支付信息"); } $data = $this->getPayInfo($out_trade_no); if($data < 0) { return $data; } $ali_pay = new AliPayApp(); $retval = $ali_pay->createAppPay($out_trade_no, $data['pay_body'], $data['pay_detail'], $data['pay_money']); if($res){ $this->ExitMessage(SUCCESS,"",array("out_trade_no"=>$out_trade_no,"retData"=>$res)); }else{ $this->ExitMessage(ERROR_CODE,"支付寶參數錯誤",0); } }
以上接口返回給APP端後喚起快捷SDK建立訂單並支付的參數後便可調起支付寶APP進行支付操做,最後就是通知處理支付結果的業務邏輯以下代碼:微信
public function payCallback(){ $request = input('post.'); $pay = new AliPayApp(); $verify = $pay->rsaCheck($params,$signType); if ($verify_result) { // 驗證成功 $out_trade_no = $request['out_trade_no']; // 支付寶交易號 $trade_no = $request['trade_no']; // 交易狀態 $trade_status = $request['trade_status']; //logWrite("支付成功了"); if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') { //此處支付成功後的業務邏輯處理根據本身需求 echo "success"; // 請不要修改或刪除 } } else { // 驗證失敗 echo "fail"; } }
ok大功告成!說實話支付寶支付仍是比微信支付要好許多雖然也有坑,但微信支付的坑是比較多的! app