ThinkPHP 框架下支付寶支付

背景

  • 近期項目需要接入支付寶支付功能,其中開發使用了ThinkPHP3.2.3框架,通過參考開發平臺文檔可以知道,網站開發有兩種場景。
  • 一種是手機網站支付,直接喚醒支付寶app進入支付操作;
  • 另一種多是 PC 端顯示支付二維碼的形式,然后使用手機的支付寶app掃描。

一.接入配置

1).接入步驟

  • 根據"快速接入"中的流程,兩者大同小異,都是進行:
  • 第一步:創建應用并獲取APPID
  • 第二步:配置密鑰
  • 第三步:搭建和配置開發環境
  • 第四步:調用接口

2).配置截圖

應用配置截圖

3).提示說明

  • 雖然官方文檔已經做的很詳細、成熟,不過還是有幾點需要著重提醒一下,以免不必要的糾結。
  • 應用創建成功后需要大概一到三天的審核
  • 配置密鑰時建議下載其提供的加密工具,可參考RSA密鑰生成方法
  • 此處我所下載的是開發平臺服務端SDK中的PHP版資源,而非DEMO文件,相信兩者還是有所區別的

二.手機網站支付接口實現

1).測試入口頁面

  • 如下圖所示,我在此創建了一個簡單的入口文件,根據開發文檔中的介紹是需要統一編碼格式的,此處我選擇的是UTF-8


    代碼參考-header處理

2).html代碼參考

  • 需要注意的是,接口指明需要POST方式進行提交請求


    入口界面參考截圖

3).支付寶配置信息

  • 對于支付寶的配置信息,我寫在 Application/Common/Conf/config.php中
//支付寶 支付配置
    'ALI_CONFIG'  => array(
        'gatewayUrl'            => 'https://openapi.alipay.com/gateway.do',//支付寶網關(固定)'
        'appId'                 => '2017xxxxxxxx9',//APPID即創建應用后生成
        //由開發者自己生成: 請填寫開發者私鑰去頭去尾去回車,一行字符串
        'rsaPrivateKey'         =>  'MIIExxxxxxxxxxxxxxxxxxxxxxxxxxxq',
        //支付寶公鑰,由支付寶生成: 請填寫支付寶公鑰,一行字符串
        'alipayrsaPublicKey'    =>  'IIBxxxxxxxxxxxxxxxxxxxEFAA',
        'notifyUrl'             => 'http://www.xxx.com/m/cartpay/notify_ali', // 支付成功通知地址
        'returnUrl'             => 'http://www.xxx.com', // 支付后跳轉地址
        'returnPcUrl'           => 'http://www.xxx.com/Home', // PC端掃碼支付后跳轉地址
    ),

4).服務端SDK導入

  • 將前面所下載的SDK放入自定義的位置,在此,我習慣放在如下的路徑中,...\ThinkPHP\Library\Vendor\Alipay,特別提醒一點,對于各文件類的引用會依據代碼框架而不同,需要自行確認。

5).支付接口實現

在請求喚醒支付寶支付的路徑中進行接口代碼的編輯
代碼參考-手機端支付接口

提示

  • 通過實驗發現,如果在電腦端進行此功能的支付測試,會報出如下的類似錯誤,個人認為源于手機和PC的內置配置不同
  • 對于手機網站支付需要在手機上測試,可自行配置虛擬域名手機訪問即可,不要在此問題上花費不必要的時間
  • 因為本人就是在電腦有報錯,手機端訪問卻能完美實現,從而走了驗證簽名的過程到最后卻并非錯在簽名,當然也不排除你的操作過程簽名一定是沒問題的哦.
無效簽名報錯

手機支付參考截圖
代碼實現如下:
    /**
     * 支付寶支付post提交頁面
     */
    public function alipay(){
        if (IS_POST){
            Vendor('Alipay.aop.AopClient');
            Vendor('Alipay.aop.request.AlipayTradeWapPayRequest');
            //$out_trade_no = I('post.order_sn');
            /*
             *  $out_trade_no 為自己業務邏輯中要支付的訂單號
             *      可從POST數據中提取,具體安全起見可自行加密操作 此處僅舉例測試數據
             *  $order_amount 為要進行支付的金額 注意要用小數轉換
             *      例如:3.50,10.00
             *  $aliConfig 獲取支付寶配置數據
             */
            $out_trade_no = '2017M'.time();
            $body = '歡迎購買商品,愿您購物愉快';
            $subject = '你好';
            $order_amount = 9.00;
            $aliConfig = C('ALI_CONFIG');
            $aop = new \AopClient();
            $aop->gatewayUrl = $aliConfig['gatewayUrl'];
            $aop->appId = $aliConfig['appId'];
            $aop->rsaPrivateKey = $aliConfig['rsaPrivateKey'];
            $aop->alipayrsaPublicKey=$aliConfig['alipayrsaPublicKey'];
            $aop->apiVersion = '1.0';
            $aop->postCharset='UTF-8';
            $aop->format='json';
            $aop->signType='RSA2';
            $request = new \AlipayTradeWapPayRequest ();
            $bizContent = "{" .
                "    \"body\":\"$body.\"," .
                "    \"subject\":\"$subject\"," .
                "    \"out_trade_no\":\"$out_trade_no\"," .
                "    \"timeout_express\":\"90m\"," .
                "    \"total_amount\":$order_amount," .
                "    \"product_code\":\"QUICK_WAP_WAY\"" .
                "  }";
            $request->setBizContent($bizContent);
            $request->setNotifyUrl($aliConfig['notifyUrl']);
            $request->setReturnUrl($aliConfig['returnUrl']);
            $result = $aop->pageExecute ( $request);
            echo $result;
        }else{
            echo 'sorry,非法請求失敗';
        }
    }

6).支付成功后的通知處理

  • 此時,通過獲取所提交過來的post數據,進行訂單號的剝離,從而進行下一步的業務邏輯處理即可.
    [注意]:
  • 接口文檔中有點明,支付通知功能最后需要輸出‘success
  • 此處的通知路徑要與配置中確定的 ‘notifyUrl’完全一致
  /**
   * 支付寶支付通知功能
   */
    public function notify_ali(){
        $out_trade_no = I('post.out_trade_no');
        $this->toUpdatePayInfo($out_trade_no,'ali');
        echo 'success';
    }

三.電腦網站支付接口實現

  • 對比來看,其實 PC 端的代碼設計與手機端大同小異,在此點明一下使用情景,可進行參考。

1).支付接口實現

電腦端支付接口代碼截圖

提示:

  • 測試發現,接口中定義“subject”時,對于文字的數目有要求,不能超過四個字,至于字母似乎沒有特別限制,開發過程中原想顯示全部的商品名稱卻無法實現,還請注意。
  • 提供的代碼暫時未進行界面的設計,可參考 手機端接口思想,接收并處理訂單信息后再喚醒支付寶,當前的代碼可以在公共文件配置正確的情況下,直接公網訪問接口鏈接即可展示效果。
  • 支付成功后的通知處理,請參考手機端實現方式.

實現效果截圖

電腦端喚醒支付寶接口
手機掃碼效果
電腦端支付方式-登錄

3).代碼實現如下:

 /**
     * 電腦端喚醒 支付寶掃碼支付接口
     */
    public function aliPayPage(){
        $out_trade_no = '2017PC'.time();
        $order_amount = '12.88';
        $proName = "真米黑米 XXXXXX";
        Vendor('Alipay.aop.AopClient');
        Vendor('Alipay.aop.request.AlipayTradePagePayRequest');
        //構造參數
        $aop = new \AopClient();
        $aliConfig = C('ALI_CONFIG');
        $aop->gatewayUrl = $aliConfig['gatewayUrl'];
        $aop->appId = $aliConfig['appId'];
        $aop->rsaPrivateKey = $aliConfig['rsaPrivateKey'];

        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset= 'utf-8';
        $aop->format='json';
        $request = new \AlipayTradePagePayRequest ();
        $request->setReturnUrl($aliConfig['returnPcUrl']);
        $request->setNotifyUrl($aliConfig['notifyUrl']);
        $request->setBizContent(
            "{" .
            "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," .
            "    \"subject\":\"$proName\"," .
            "    \"out_trade_no\":\"$out_trade_no\"," .
            "    \"total_amount\":$order_amount," .
            "    \"body\":\"Iphone6 16G\"" .
            "  }");
        //請求
        $result = $aop->pageExecute ($request);
        //輸出
        echo $result;
    }

附錄:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容