PHP接入支付寶教程

0.準備工作
支付寶賬號驗證
簽約接口
私鑰生成

1. 拼湊訂單

1.1 拼裝訂單

1.2 私鑰簽名

2 服務器端處理

2.1 支付寶處理流程圖

主要參考文檔

3 代碼實現

3.1 開啟CURL

3.2 填寫配置

3.3 訂單簽名

4 驗簽

1.1 私鑰生成

私鑰可以使用支付寶提供的RSA私鑰生成工具

1.2 將生成的公鑰上傳到支付寶

在簽約管理處,點擊查看PID | Key。輸入支付密碼之后既可以查看相關的公鑰。

上傳公鑰

之后再添加密鑰處復制自己的公鑰(我的已經添加過了,此處顯示為查看)

注意

  1. 此處是上傳密鑰,而不是上傳私鑰,私鑰千萬不能泄露出去,切記,在這里把自己的公鑰公布給支付寶就行,讓支付寶能夠驗證你的簽名。
  2. 要在合作伙伴密鑰管理這里添加公鑰。而不是下面的開放平臺密鑰管理的地方
上傳公鑰

2. 服務器端處理

2.1 支付寶處理流程圖

業(yè)務流程圖


業(yè)務流程圖
業(yè)務流程圖
數據交互流程圖
數據交互流程圖

簡單來說

  1. 客戶端發(fā)起支付請求,在自己的服務器端生成訂單并且使用私鑰給訂單簽名
  2. 客戶端使用拿到服務器端生成的字符串(訂單字符串+簽名字符串)交給支付寶SDK進行支付
  3. 支付寶會回調我們的服務器端,根據訂單信息中傳遞的回調地址來訪問我們的服務器,并且將訂單信息和支付寶的簽名字符串發(fā)送過來,我們可以在這個時候驗證支付是否成功。

3 代碼實現

根據上面的流程寫具體代碼即可。
首先導入支付寶的PHP SDK,下載地址
在支付寶文檔中心下載移動支付(SDK&DEMO下載
解壓之后打開服務端demo->readme.txt。幾乎所有的東西都在這個文檔里了。

3.1 開啟CURL

1、必須開啟curl服務
(1)使用Crul需要修改服務器中php.ini文件的設置,找到php_curl.dll去掉前面的";"即可
(2)文件夾中cacert.pem文件請務必放置到商戶網站平臺中(如:服務器上),并且保證其路徑有效,提供的代碼demo中的默認路徑是當前文件夾下——getcwd().'\\cacert.pem'```
### 3.2 填寫配置

2、需要配置的文件是:
alipay.config.php
key文件夾```
alipay.config.php.打開這個文件之后,里面所有的配置信息都有相應的中文注釋,按照注釋填寫即可。

3.3 訂單簽名

首先在你的支付類中引入lib\alipay_notify.class.php文件。
簽名實現工具,需要的時候調用這個方法,傳遞需要參數,然后將字符串返回給客戶端即可。

//調用方傳遞subject,body,price即可獲取到簽名后的字符串,contentId在簽名過程中用不到,可以根據具體業(yè)務刪除或保留    
public function aliSignUtil($subject, $body, $price, $contentId)
    {
        $order['partner'] = '"商戶號"';
        $order['seller_id'] = '"商戶Id"';
        $order['out_trade_no'] = '"' . $this->getOrderNo() . '"';//獲取訂單號,保證唯一
        $order['subject'] = '"' . $subject . '"';
        $order['body'] = '"' . $body . '"';
        $order['total_fee'] = '"' . $price . '"';
        $order['notify_url'] = '"回調地址"';//支付寶支付成功之后的回調地址,必須公網可以訪問
        $order['service'] = '"mobile.securitypay.pay"';
        $order['payment_type'] = '"1"';
        $order['_input_charset'] = '"utf-8"';
        $order['it_b_pay'] = '"30m"';
        $order['return_url'] = '"m.alipay.com"';
        //需要加簽的內容處理成字符串
        $data = createLinkstring($order);//支付寶提供的方法
        //加簽
        $data = rsaSign($data, AliPay . DIRECTORY_SEPARATOR . 'key' . DIRECTORY_SEPARATOR . 'rsa_private_key.pem');//支付寶提供的簽名方法,第二個參數是私鑰地址
        $history['sign'] = str_replace("\"", "", $data);
        $order['sign'] = '"' . urlencode($data) . '"';
        $order['sign_type'] = '"RSA"';
        //訂單信息處理成字符串
        $result = createLinkstring($order);
        //這里將history訂單信息保存到了數據庫,方便回調的時候根據訂單號查詢出是哪一個用戶產生的訂單。
        $history['out_trade_no'] = str_replace("\"", "", $order['out_trade_no']);
        $history['total_fee'] = str_replace("\"", "", $order['total_fee']);
        $history['contentId'] = $contentId;
        $this->saveOrder($history);//訂單歷史保存到數據庫
        //返回訂單信息,客戶端可以根據result來調用支付寶進行支付。
        return html_entity_decode($result);
    }

4驗簽

根據上面加簽時候填寫的回調地址,寫支付寶驗簽代碼

$order = $_POST;
        $sign = $order;
        //去除簽名和簽名方式以及controller和action,保留待簽名信息
        unset($sign['sign']);
        unset($sign['sign_type']);
        unset($sign['c']);
        unset($sign['a']);
        ksort($sign);
        $sign = createLinkstring($sign);
        //驗證支付寶簽名
        $result = false;
        $result = rsaVerify(
            $sign,
            AliPay . DIRECTORY_SEPARATOR . 'key' . DIRECTORY_SEPARATOR . 'alipay_public_key.pem',
            $order['sign']);
        $db = new Medoo();
        //在訂單歷史表中按支付寶回調訂單號查詢出訂單,判斷狀態(tài)
        $result = $db->select('alipay', '*', ["out_trade_no" => $order["out_trade_no"]])[0];
        //重復驗證
        if ($result['status'] == '1') {
            echo 'success';
            exit();
        }
        if ($result && $order['trade_status'] == 'TRADE_SUCCESS') {//驗證支付寶簽名成功,并且是支付成功的回調
          //這里可以確定是支付寶進行的回調,并且是第一次成功的回調,在這里寫支付成功之后的邏輯就好
            $result['status'] = '1';
            $num = $db->update('alipay', $result, ["out_trade_no" => $order["out_trade_no"]]);
            //添加購買歷史
            $this->addBuyHistory("購買內容", 100, $db, $result['userId']);
            //購買內容
            if (!empty($result['contentId'])) {
                $buy['contentId'] = $result['contentId'];
                $buy['userId'] = $result['userId'];
                $num = $db->insert('contentsubs', $buy);
            }
            //處理完成后輸出succes給支付寶
            echo 'success';
        }

自此,支付寶完成了一次完整的支付。

demo,未進行完整測試,主要提供一種思路

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容