TP5實現支付寶app支付

因公司業務須要,須要給客戶接入支付寶支付,本身之前只作過網頁版支付寶支付。折騰了3天,踩了不少坑,終於搞定了,如今記錄一下,分享給你們.
1、首先必須通知客戶先申請支付寶商家帳號,而後認證。固然這是廢話...沒有帳號還支付個毛線...
而後讓客戶登錄支付寶帳號後,右上角有個開放平臺,點開.php

clipboard.png

點開以後是這個樣子.前端

clipboard.png

這裏都是須要客戶操做的,客戶點擊支付接入後,會有個認證簽約頁面,簽約完以後,會生成應用惟一標識(APPID)。應用建立完成後,系統會自動跳轉到應用詳情頁面。而後能夠點擊 添加功能 來添加App支付功能。添加功能完後,個人應用列表就會顯示添加的應用,即支付寶App支付。由於個人是我的號,因此無法演示。這一部咱們只須要等待客戶申請就好,什麼也不用作。詳細流程參加支付寶官方文檔:https://docs.open.alipay.com/... 這裏面惟一須要開發者作的就是生成密鑰這一步。express

clipboard.png

點擊紅線部分快速簽名教程就能夠跳轉到簽名工具頁面,json

clipboard.png

點擊下載,我是windows環境,下載完成後,打開工具。我是php開發,因此選非JAVA適用,點擊生成密鑰就會出現兩大坨,一個是商戶私鑰一個是商戶公鑰(就是開發者私鑰公鑰).而後右下角有個上傳公鑰按鈕,點擊會跳轉到支付寶開放平臺頁面。windows

clipboard.png

由於我不是商家,沒法認證,因此這是空白的。若是是商家帳號,就會顯示相似於這個頁面:api

clipboard.png

點擊RSA設置,填上 開發者公鑰私鑰,就會生成一個新的支付寶公鑰。到此一步,申請的部分完成。數組

下面是開發者後臺接入的部分服務器

在開始後臺代碼前,咱們必須有3個參數,開發者私鑰、支付寶公鑰、APPID。 這裏的開發者私鑰也叫應用私鑰,一個意思,不要繞暈了。
沒有這3個參數,就無法喚起支付寶支付接口!!!
準備好後能夠下載支付寶的官方demo代碼參考。demo在這個頁面下載:https://docs.open.alipay.com/...
打開是醬紫:微信

clipboard.png

我本身用TP5封裝了一個方法,童鞋能夠參考下:app

<?php
namespace appapicontroller;
use appcommoncontrollerRootsApi;
use thinkDb;
require_once EXTEND_PATH . '/alipay/AopSdk.php';

/**

  • 支付寶

*/
class Alipay extends RootsApi
{

//應用APPID,都是2019開頭
const APPID = '2019*';
//開發者私鑰去頭去尾去回車,一行字符串
const RSA_PRIVATE_KEY = '';
//支付寶公鑰(上傳開發者公鑰(又叫應用公鑰)後才能生成)
const ALIPAY_RSA_PUBLIC_KEY = '';

public function _initialize()
{

parent::_initialize();

}

/**
*支付方法,調用支付寶接口成功後,會返回給前端一個長串的參數字符串。前端利用它喚起支付寶
*/
public function paytoOffi()
{

try {
 //調支付寶接口(這裏寫死測試,實際按邏輯來)
 $res = $this->getAlipayMsg('買單','消費者買單',2342424214234,0.01);

 return json_encode($res);//必須是json格式
   
 } catch (\Exception $e) {
      return false;
 }

}

/**

  • 用戶消費異步通知服務器方法
  • @return void

*/
public function notify()
{
$arr = $_POST;
file_put_contents('d.txt',json_encode($arr),FILE_APPEND);//寫入txt支付寶的返回數據
//驗證簽名
$aop = new AopClient();
$aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;

$flag = $aop->rsaCheckV1($arr, null, "RSA2");
if ($flag) {

//驗籤
//處理業務,並從$arr中提取須要的參數內容
if ($arr['trade_status'] == 'TRADE_SUCCESS'
|| $arr['trade_status'] == 'TRADE_FINISHED') { //處理交易完成或者支付成功的通知
    //本身的業務邏輯,好比修改訂單爲已支付
 
  die('success');
  //必須有這句,echo 'success'也能夠,不然支付寶會覺得支付沒成功,而在一天內連續調用異步接口,容易出錯  
}

}

}

/**

  • 調用支付寶接口方法
  • @param $body 訂單描述
  • @param $subject 訂單標題
  • @param $out_trade_no 訂單號
  • @param string $amount 價格
  • @return array 支付寶返回信息

*/
private function getAlipayMsg($body, $subject, $out_trade_no, $amount)
{

$aop = new \AopClient();
 $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";//這裏是寫死的,支付寶網關地址
 $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對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
 $request = new \AlipayTradeAppPayRequest();
 
 //SDK已經封裝掉了公共參數,這裏只須要傳入業務參數
$bizcontent = "{\"body\":\"{$body}\","//支付商品描述
. "\"subject\":\"{$subject}\","//支付商品的標題
. "\"out_trade_no\":\"{$out_trade_no}\","//商戶網站惟一訂單號
. "\"timeout_express\":\"60m\","//該筆訂單容許的最晚付款時間,逾期將關閉交易
. "\"total_amount\":\"{$amount}\","//訂單總金額,單位爲元,精確到小數點後兩位,取值範圍[0.01,100000000]
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
 
 $request->setNotifyUrl('http:xxxxx.com/api/alipay/notify');//你本身的異步地址,必須寫全,並且不能有參數 
 $request->setBizContent($bizcontent);
 //這裏和普通的接口調用不一樣,使用的是sdkExecute
 $response = $aop->sdkExecute($request);
 $result = array('order_str'=> $response);

 return $result;

}

}

首先前臺調支付接口paytoOffi,而後這個方法就會調getAlipayMsg方法,即調支付寶接口的方法,這4個參數描述、標題、訂單號、價格後3個是必填的。描述能夠不填,這個酌情修改。而後調接口,支付寶會返回請求字符串,即喚起支付寶軟件的一長串字符串,這裏有個大坑,官方文檔上說直接echo 給前臺就行,但其實應該轉成json格式返給前臺,不然會報100XX錯誤,即參數格式不正確。下面是官方的坑教程截圖:

clipboard.png

每次看見這句不須要再作處理我就來氣...當時坑了我兩天,就是沒想起來要轉JSON格式返回。我這裏是把返回的字符串放進一個數組,而後再json_encode返回。返回的字符串若是在頁面上打印是這個樣子的

clipboard.png

我沒有截全,很長一大串。(前端要去掉order_str的鍵名,取鍵值)
前端拿着這串東西就能夠喚起支付寶軟件,進行支付,支付成功後,你寫的支付寶異步回調函數就會收到一串信息,notify方法的$_POST就有數據了。能夠轉成JSON格式打印出來:
{

"gmt_create": "2019-06-24 17:16:03",
"charset": "UTF-8",
"seller_email": "********",
"subject": "\u4e70\u5355",
"sign": "***********",
"body": "\u6d88\u8d39\u8005\u4e70\u5355",
"buyer_id": "*******",
"invoice_amount": "0.01",
"notify_id": "**********",
"fund_bill_list": "*********",
"notify_type": "trade_status_sync",
"trade_status": "TRADE_SUCCESS",//交易狀態,success爲支付成功
"receipt_amount": "0.01",
"app_id": "*******",
"buyer_pay_amount": "0.01",
"sign_type": "RSA2",
"seller_id": "",
"gmt_payment": "2019-06-24 17:16:03",
"notify_time": "2019-06-24 17:19:10",
"version": "1.0",
"out_trade_no": "1624677580792188",//你本身的訂單號
"total_amount": "0.01",//支付總金額
"trade_no": "************",//支付寶流水號
"auth_app_id":"***********",
"buyer_logon_id": "",//買家的支付寶帳號
"point_amount": "0.00"

}

星號部分都是有值的。
只要trade_status的值是success就是支付成功

取出裏面的訂單號 價格之類的就能夠寫業務邏輯了,具體看https://docs.open.alipay.com/... 參數說明。最後別忘了在異步方法返回一個"SUCCESS",不然支付寶會覺得沒支付成功,24小時內每一個10幾分鐘就調一次異步接口。

至此,整個支付流程就走完了,支付寶雖然有點坑,可是比微信支付強多了,微信的文檔纔是真的坑!歡迎童鞋們參考。

相關文章
相關標籤/搜索