對于支付寶支付的開發,盡管官網文檔描述的已經比較清楚了,但還是有像我這樣的小白仍然還是不會。。。。今天好好的摸索了一天,在這里分享記錄了一下。
首先我們要拿到企業的支付寶開放平臺賬號(我做的是企業,個人的我不清楚能不能做),登錄進去后創建一個應用(如果之前沒有創建的話);
然后我們就能看到你新創建的應用了,但現在是用不了的,需要完善信息提交審核,通過之后才能使用,點擊查看進入應用
上傳應用圖標,配置授權回調地址和應用公鑰,這里的回調地址一定是公網可以訪問得到的,不是你本地的測試地址!
不會生成秘鑰的話就點擊上面 如何生成秘鑰?
填完了這些信息后就可以提交審核了,審核需要一點時間。這時我們可以先寫我們的邏輯代碼然后利用支付寶沙箱進行測試。
開發可以下載支付寶官方的SDK參考,也可以自行百度大神們整理的代碼,這里小編直接貼出來:
<?php header('Content-type:text/html; Charset=utf-8'); $appid = 'xxxxx'; //https://open.alipay.com 賬戶中心->密鑰管理->開放平臺密鑰,填寫添加了電腦網站支付的應用的APPID $notifyUrl = 'http://www.xxx.com/alipay/notify.php'; //付款成功后的異步回調地址 $outTradeNo = uniqid(); //你自己的商品訂單號 $payAmount = 0.01; //付款金額,單位:元 $orderName = '支付測試'; //訂單標題 $signType = 'RSA2'; //簽名算法類型,支持RSA2和RSA,推薦使用RSA2 //商戶私鑰,填寫對應簽名算法類型的私鑰,如何生成密鑰參考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 $saPrivateKey='這里填你的商戶私鑰'; $aliPay = new AlipayService($appid,$returnUrl,$notifyUrl,$saPrivateKey); $result = $aliPay->doPay($payAmount,$outTradeNo,$orderName,$returnUrl,$notifyUrl); $result = $result['alipay_trade_precreate_response']; if($result['code'] && $result['code']=='10000'){ //生成二維碼 $url = 'http://pan.baidu.com/share/qrcode?w=300&h=300&url='.$result['qr_code']; echo "<img src='{$url}' style='width:300px;'><br>"; echo '二維碼內容:'.$result['qr_code']; }else{ echo $result['msg'].' : '.$result['sub_msg']; } class AlipayService { protected $appId; protected $returnUrl; protected $notifyUrl; //私鑰文件路徑 protected $rsaPrivateKeyFilePath; //私鑰值 protected $rsaPrivateKey; public function __construct($appid, $returnUrl, $notifyUrl,$saPrivateKey) { $this->appId = $appid; $this->returnUrl = $returnUrl; $this->notifyUrl = $notifyUrl; $this->charset = 'utf8'; $this->rsaPrivateKey=$saPrivateKey; } /** * 發起訂單 * @param float $totalFee 收款總費用 單位元 * @param string $outTradeNo 唯一的訂單號 * @param string $orderName 訂單名稱 * @param string $notifyUrl 支付結果通知url 不要有問號 * @param string $timestamp 訂單發起時間 * @return array */ public function doPay($totalFee, $outTradeNo, $orderName, $returnUrl,$notifyUrl) { //請求參數 $requestConfigs = array( 'out_trade_no'=>$outTradeNo, 'total_amount'=>$totalFee, //單位 元 'subject'=>$orderName, //訂單標題 ); $commonConfigs = array( //公共參數 'app_id' => $this->appId, 'method' => 'alipay.trade.precreate', //接口名稱 'format' => 'JSON', 'charset'=>$this->charset, 'sign_type'=>'RSA2', 'timestamp'=>date('Y-m-d H:i:s'), 'version'=>'1.0', 'notify_url' => $notifyUrl, 'biz_content'=>json_encode($requestConfigs), ); $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']); $result = $this->curlPost('https://openapi.alipay.com/gateway.do',$commonConfigs); return json_decode($result,true); } public function generateSign($params, $signType = "RSA") { return $this->sign($this->getSignContent($params), $signType); } protected function sign($data, $signType = "RSA") { $priKey=$this->rsaPrivateKey; $res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($priKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; ($res) or die('您使用的私鑰格式錯誤,請檢查RSA私鑰配置'); if ("RSA2" == $signType) { openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持 } else { openssl_sign($data, $sign, $res); } $sign = base64_encode($sign); return $sign; } /** * 校驗$value是否非空 * if not set ,return true; * if is null , return true; **/ protected function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } public function getSignContent($params) { ksort($params); $stringToBeSigned = ""; $i = 0; foreach ($params as $k => $v) { if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) { // 轉換成目標字符集 $v = $this->characet($v, $this->charset); if ($i == 0) { $stringToBeSigned .= "$k" . "=" . "$v"; } else { $stringToBeSigned .= "&" . "$k" . "=" . "$v"; } $i++; } } unset ($k, $v); return $stringToBeSigned; } /** * 轉換字符集編碼 * @param $data * @param $targetCharset * @return string */ function characet($data, $targetCharset) { if (!empty($data)) { $fileType = $this->charset; if (strcasecmp($fileType, $targetCharset) != 0) { $data = mb_convert_encoding($data, $targetCharset, $fileType); //$data = iconv($fileType, $targetCharset.'//IGNORE', $data); } } return $data; } public function curlPost($url = '', $postData = '', $options = array()) { if (is_array($postData)) { $postData = http_build_query($postData); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 30); //設置cURL允許執行的最長秒數 if (!empty($options)) { curl_setopt_array($ch, $options); } //https請求 不驗證證書和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); return $data; } }
之后我們可以利用支付寶的沙箱環境進行測試我們的代碼是否ok,在開發者中心找到沙箱環境。
這里他會給你分配好appid這些信息,公鑰可以用你的應用的公鑰(我是這樣用的,不知道有沒問題),然后你就可以拿這appid,公鑰秘鑰等去進行測試了(沙箱的網關地址和正式環境的網關地址是不同的!!!這里特別注意!!!),以下是我獲取到的二維碼信息,通過第三方工具可以生成二維碼(比如jquery的qrcode)
然后我們就在頁面將返回的支付碼供用戶掃碼支付了。
這里是不能直接用你的支付寶去掃的,不然的話會提示二維碼已失效,請刷新的字樣。沙箱環境的需要下載沙箱版的支付寶進行掃碼支付,下載地址https://openhome.alipay.com/platform/appDaily.htm,目前只有安卓版,用安卓手機下載就好,安裝好了直接登錄,不是使用你自己的支付寶賬號去登錄,沙箱賬號在
用買家賬號登錄進去掃碼支付就好了,等待支付成功我們的任務就完成啦,等待應用審核通過把正式的appid等(一定要記得替換網關地址)替換掉就可以使用啦。
這里只是實現了掃碼,沒有實現驗簽,驗簽是灰常重要的,不過這塊比較簡單,按照支付寶官方的文檔操作就行了。