## 下載支付寶Demo
手機端
[https://opendocs.alipay.com/open/203/105910](https://opendocs.alipay.com/open/203/105910)

網頁端
[https://opendocs.alipay.com/open/270/106291](https://opendocs.alipay.com/open/270/106291)
## 配置文件
將下載好的SDK放入到extend文件中 , 并將文件名改為 * **AlipayTradePagePay***

##windows環境下 修改lotus.php文件寫入配置
**在windows環境下將 此行注釋 否則報錯 部署到 Linux上后再取消注釋**

##寫入配置 在application 下面的common 的文件里寫入公共支付函數直接調用**alipayPagepay**函數即可
~~~
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 應用公共文件
//訂單號如果有則這個不用
function build_order_no(){
return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
/**
* 支付寶 電腦網站支付
* @auhor hongweizhiyuan
* @param $out_trade_no 商戶訂單號
* @param $subject 訂單名稱
* @param $total_amount 訂單金額
* @param $body 商品描述
* @example alipayPagepay('201791711599526','商品標題','0.01','商品描述');
*/
function alipayPagepay($out_trade_no,$subject,$total_amount,$body)
{
//step1:獲取配置
import('AlipayTradePagePayTrue.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加載交易服務類
$config=config('alipay');
$aop=new AlipayTradeService($config);
//step2:加載表單,構造參數
import('AlipayTradePagePayTrue.pagepay.buildermodel.AlipayTradePagePayContentBuilder',EXTEND_PATH,'.php'); // 支付寶電腦網站支付
$payRequestBuilder = new AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
//step3:創建支付
$response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
//輸出表單
var_dump($response);
}
/**
* 支付寶 電腦網站 交易查詢
* @param $WIDTQout_trade_no 商戶訂單號,商戶網站訂單系統中唯一訂單號(請二選一設置)
* @param $WIDTQtrade_no 支付寶交易號(請二選一設置)
*/
function alipayQuery($WIDTQout_trade_no,$WIDTQtrade_no)
{
//step1:獲取配置
import('AlipayTradePagePayTrue.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加載交易服務類
$config=config('alipay');
$aop = new AlipayTradeService($config);
//step2:加載表單,構造參數
import('AlipayTradePagePayTrue.pagepay.buildermodel.AlipayTradeQueryContentBuilder',EXTEND_PATH,'.php'); // 支付寶電腦網站支付查詢接口
$RequestBuilder = new AlipayTradeQueryContentBuilder();
$RequestBuilder->setOutTradeNo($WIDTQout_trade_no);
$RequestBuilder->setTradeNo($WIDTQtrade_no);
/**
* alipay.trade.query (統一收單線下交易查詢)
* @param $builder 業務參數,使用buildmodel中的對象生成。
* @return $response 支付寶返回的信息
*/
$response = $aop->Query($RequestBuilder);
var_dump($response);
}
/**
* 支付寶 電腦網站 退款
* @param $out_trade_no 商戶訂單號,商戶網站訂單系統中唯一訂單號(請二選一設置)
* @param $trade_no 支付寶交易號(請二選一設置)
* @param $refund_amount 需要退款的金額,該金額不能大于訂單金額,必填
* @param $refund_reason 退款的原因說明
* @param $out_request_no 標識一次退款請求,同一筆交易多次退款需要保證唯一,如需部分退款,則此參數必傳
*/
function alipayRefund($out_trade_no,$trade_no,$refund_amount,$refund_reason,$out_request_no)
{
//step1:獲取配置
import('AlipayTradePagePayTrue.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加載交易服務類
$config=config('alipay');
$aop = new AlipayTradeService($config);
//step2:加載表單,構造參數
import('AlipayTradePagePayTrue.pagepay.buildermodel.AlipayTradeRefundContentBuilder',EXTEND_PATH,'.php'); // 支付寶電腦網站支付退款接口
$RequestBuilder=new AlipayTradeRefundContentBuilder();
$RequestBuilder->setOutTradeNo($out_trade_no);
$RequestBuilder->setTradeNo($trade_no);
$RequestBuilder->setRefundAmount($refund_amount);
$RequestBuilder->setOutRequestNo($out_request_no);
$RequestBuilder->setRefundReason($refund_reason);
/**
* alipay.trade.refund (統一收單交易退款接口)
* @param $builder 業務參數,使用buildmodel中的對象生成。
* @return $response 支付寶返回的信息
*/
$response = $aop->Refund($RequestBuilder);
var_dump($response);;
}
/**
* 支付寶 電腦網站 退款查詢
* @param $out_trade_no 商戶訂單號,商戶網站訂單系統中唯一訂單號(請二選一設置)
* @param $trade_no 支付寶交易號(請二選一設置)
* @param $out_request_no 請求退款接口時,傳入的退款請求號,如果在退款請求時未傳入,則該值為創建交易時的外部交易號,必填
*/
function alipayRefundQuery($out_trade_no,$trade_no,$out_request_no)
{
//step1:獲取配置
import('AlipayTradePagePayTrue.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加載交易服務類
$config=config('alipay');
$aop = new AlipayTradeService($config);
//step2:加載表單,構造參數
import('AlipayTradePagePayTrue.pagepay.buildermodel.AlipayTradeFastpayRefundQueryContentBuilder',EXTEND_PATH,'.php'); // 支付寶電腦網站 統一收單交易退款查詢
$RequestBuilder=new AlipayTradeFastpayRefundQueryContentBuilder();
$RequestBuilder->setOutTradeNo($out_trade_no);
$RequestBuilder->setTradeNo($trade_no);
$RequestBuilder->setOutRequestNo($out_request_no);
/**
* 退款查詢 alipay.trade.fastpay.refund.query (統一收單交易退款查詢)
* @param $builder 業務參數,使用buildmodel中的對象生成。
* @return $response 支付寶返回的信息
*/
$response = $aop->refundQuery($RequestBuilder);
var_dump($response);
}
/**
* 支付寶 電腦網站 交易關閉
* @param $out_trade_no 商戶訂單號,商戶網站訂單系統中唯一訂單號(請二選一設置)
* @param $trade_no 支付寶交易號(請二選一設置)
*/
function alipayClose($out_trade_no,$trade_no)
{
//step1:獲取配置
import('AlipayTradePagePayTrue.pagepay.service.AlipayTradeService',EXTEND_PATH,'.php');// 加載交易服務類
$config=C('ALIPAY_CONFIG');
$aop = new AlipayTradeService($config);
//step2:加載表單,構造參數
import('AlipayTradePagePayTrue.pagepay.buildermodel.AlipayTradeCloseContentBuilder',EXTEND_PATH,'.php'); // 支付寶電腦網站 統一收單交易關閉接口
$RequestBuilder=new AlipayTradeCloseContentBuilder();
$RequestBuilder->setOutTradeNo($out_trade_no);
$RequestBuilder->setTradeNo($trade_no);
/**
* alipay.trade.close (統一收單交易關閉接口)
* @param $builder 業務參數,使用buildmodel中的對象生成。
* @return $response 支付寶返回的信息
*/
$response = $aop->Close($RequestBuilder);
var_dump($response);
}
~~~
此處可以讀取配置appid信息

## 在配置文件里面修改config 的appid等信息

```
'alipay' =>[
//應用ID,您的APPID。
'app_id' => "2017022705923867",
//商戶私鑰,您的原始格式RSA私鑰
'merchant_private_key' => "MIIEowIBAAKCAQEA4SvhwaggPK6YcT9KFcWatlWzmPOGuinPibsSuQOKOzIdndmsobx8gxYsL40SBJZJ7gUzLW53WUPJiu1Cn2K6b1m/PsOQNl6WRQD7fD62fCO5z3Wqitx9bts/LoUbX7vb4Dxpplw7KKVikUCBwe75hOTuhAfQ7dqGzbE0xfKjO2ugRBDceCy5InBK/xfvVbNRk+1DZyexLSUJx7pm5nUCkVj81URlnQYzcW06OBjvSSecTpmAktbvruZE450vhxkfDzxp47R0qba4c8ALRrDlnrUb29EPD4TFmXWGxteZQBQWKbEJWte7tV/sGW9ed/6QeC8A9N3CalnzXpqIF4hpcQIDAQABAoIBAFOUPDnrs/uSOxdeDJvEO0cOzJkrW4jiWByhibOO8tJCKegbkg5+riDiLAiCbnuxZUOqPnLQnBBQLxEYPDB5LwaB45DiejcUKOb4FGDrzkSJ5kBxRppAeXaafvs/gQep7VVwVy7e8T6HFO0haoiXsZp4d2gelpiTEpJrAlGvXJODDzMJPoEcpeHEDUUroH1+PXCGmZL8mB5a+ZzcP14IRsxWEygTy64MADa5RQ3U7qpSKSSiCRvTp1CUIMTEzgcYDziWCpWwdDEjrmyoQy3sUpdxwFrShQ0gwxgFgfawlR31d1rJxarF1/ZOsEa3RbbDdJWS4MwgMbYi70gB4UFTDLkCgYEA9bsfRblnK44C0oWTVxemxtuP96JPpqFj+jtcUMSBDZvnXyV5TKMWiP+agefWgQ5Gz5z6yBEicXvMcC9qcYf2nNnZYeTiCJmSof8dqWg5Uah3l+GBBJ13AVcrhJv/pm1Gkm3+WubREQBEXq3l9F/cRyEMzF2XWFCdrjX7R1JufssCgYEA6pTPTrIxufboxtJJXusdSSueqxN5see4TiqKXizRMuUaEF9h0iHd1fvxHWSMo3zlLt8s4LrR3PlKGXo88RnScNvRE3KyvznLkRhwdaFvTQjSUrMe+wV+OIRJm9UnV2ysqrB3w8+GP6iZPdiRN/AW4rkoPf0SMo2IGYR1/JsLlTMCgYBJxXqW+RlDFyg7wYRBYkVcb/AhvOXCtbMJHacSTFweFM76Xoqy+kc6q9nb5Bket4WEsLENPS+k+DChAWsoWFQuNKyxWgCN6mT+I1PpVvPWUwhMXZPZKdjfWycicZ7nfOjx7vmsmpzrSLQ95GEj41+DLyXjeLmF9vXPpj8g41tuzwKBgQCK31nzDs8ddqzLt4Y0KSCHRsmCId9zkOitbcXIhuO6K6NIeg8hJWd83NAbRIF17+SF4R1iVXcUSIizmIgne8/3fErEJqznREHdPgilutJ3WneY+e2nUdMthjNFi+TkfrOhwSLFyz+AxEEkOeeOpBYIVvEZ8Y4qW1ttL9vhlbA/vQKBgGrC0rchgbdL9Ehd8lG5yDYce1N2ZAxDLLGzyxbp76OExGQMj6vBJZeGp1S6ICNLSbbVWD3Wflk1d0o1o47GgF9p+PXJyeKes2ZTOByH0R+8M92fjVXmOxNUvC0oiqVTlFLd18cH4Yd9d6DaA+msmnkJY62tyZgceJcAmTwRVHkJ",
//異步通知地址
'notify_url' => "http://test.yongtansoft.com:8001/index/alipay/notify_url",
//同步跳轉
'return_url' => "http://test.yongtansoft.com:8001/index/user/index.html",
//編碼格式
'charset' => "UTF-8",
//簽名方式
'sign_type'=>"RSA2",
//支付寶網關
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。
'alipay_public_key' => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4SvhwaggPK6YcT9KFcWatlWzmPOGuinPibsSuQOKOzIdndmsobx8gxYsL40SBJZJ7gUzLW53WUPJiu1Cn2K6b1m/PsOQNl6WRQD7fD62fCO5z3Wqitx9bts/LoUbX7vb4Dxpplw7KKVikUCBwe75hOTuhAfQ7dqGzbE0xfKjO2ugRBDceCy5InBK/xfvVbNRk+1DZyexLSUJx7pm5nUCkVj81URlnQYzcW06OBjvSSecTpmAktbvruZE450vhxkfDzxp47R0qba4c8ALRrDlnrUb29EPD4TFmXWGxteZQBQWKbEJWte7tV/sGW9ed/6QeC8A9N3CalnzXpqIF4hpcQIDAQAB",
],
```
## 設置回調地址內容
```
~~~
public function notify_alipay()
{
import('alipay.aop.AopClient');
$config = config('alipay');
$out_trade_no = input('post.out_trade_no');
$transaction_id = input('post.trade_no');
$aop = new \AopClient;
$aop->appId = $config['app_id'];
$aop->rsaPrivateKey = $config['merchant_private_key'];
$aop->alipayrsaPublicKey = $config['alipay_public_key'];
$aop->signType = $config['sign_type'];
$result = $aop->rsaCheckV1($_POST,'',$config['sign_type']);
if ($result) {
if(input('trade_status') == 'TRADE_FINISHED' || input('trade_status') == 'TRADE_SUCCESS') {
// 處理支付成功后的邏輯業務
$order = db('Order')->where(['order_num'=>$out_trade_no])->find();
if (!$order) {
Log::write('order not exists');
return 'order not exists';
}
//訂單狀態錯誤 1 未付款 其他狀態均為已處理的狀態
if ($order['status'] != 1) {
Log::write('order is completed:'.$order['status']);
return true;
}
if ($order['pay_fee'] != input('post.total_amount') * 100) {
Log::write('total_amount is error:'.$order['pay_fee'].','.input('post.total_amount'));
return 'total_amount is error';
}
$order['transaction_id'] = $transaction_id;
$order['paied_time'] = time();
$order['status'] = 2;
db('Order')->update($order);
//支付成功的邏輯
return 'success';
}
Log::write('trade_status is error:'.input('trade_status'));
return 'fail';
}
Log::write('sign verify is error:'.var_export($_POST));
return 'fail';
}
~~~
```
或者
```
public function notify_url(){
require_once("config.php");
require_once 'wappay/service/AlipayTradeService.php';
$arr=$_POST;
$alipaySevice = new AlipayTradeService($config);
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);
/* 實際驗證過程建議商戶添加以下校驗。
1、商戶需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號,
2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額),
3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)
4、驗證app_id是否為該商戶本身。
*/
if($result) {//驗證成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//請在這里加上商戶的業務邏輯程序代
//——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——
//獲取支付寶的通知返回參數,可參考技術文檔中服務器異步通知參數列表
//商戶訂單號
$out_trade_no = $_POST['out_trade_no'];
//支付寶交易號
$trade_no = $_POST['trade_no'];
//交易狀態
$trade_status = $_POST['trade_status'];
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//判斷該筆訂單是否在商戶網站中已經做過處理
//如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,并執行商戶的業務程序
//請務必判斷請求時的total_amount與通知時獲取的total_fee為一致的
//如果有做過處理,不執行商戶的業務程序
//注意:
//退款日期超過可退款期限后(如三個月可退款),支付寶系統發送該交易狀態通知
}
else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
// $data['$order_no'] = $order_no =$_POST['post.out_trade_no'];
$arr = explode('_',$_POST['post.out_trade_no']);
$money = $_POST['total_amount'];
//$data['uid'] = $arr['1'];
Db::table('wp_userinfo')->where('uid','=', $arr['1'])->update(['usermoney'=>$money]);
//判斷該筆訂單是否在商戶網站中已經做過處理
//如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,并執行商戶的業務程序
//請務必判斷請求時的total_amount與通知時獲取的total_fee為一致的
//如果有做過處理,不執行商戶的業務程序
//注意:
//付款完成后,支付寶系統發送該交易狀態通知
}
//——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
echo "success"; //請不要修改或刪除
}else {
//驗證失敗
echo "fail"; //請不要修改或刪除
}
}
```
# 重點重點重點 重要的事情說三遍 重要的事情說三遍 重要的事情說三遍

## **回調引用的文件一定不要忘了加命名空間**

- tp5圖片上傳
- 文件上傳到七牛云
- 上傳到阿里云
- 富文本編輯器
- phpexcel和spreadsheet
- phpexcel導出
- phpexcel導入
- spreadsheet
- tp5_api接口
- 跨域請求
- JWT
- 圖片和視頻上傳接口
- 驗證碼
- tp5小程序登錄
- tp5小程序支付
- tp5基礎架構
- 驗證層
- 模型層Model
- 控制器構找
- tp5.0支付寶
- 海報二維碼
- 輪播圖
- echarts柱狀圖
- layui的圖片彈窗
- p標簽顯示指定行數(全部)
- jquery和layerdate調用日期
- ajax發送文件和圖片的坑啊
- JS日期點擊上一天和下一天
- 百度分享js
- POST請求
- 商品數據表
- tp5.0支付寶最全
- tp5路由的坑
- 二維數組排序
- tp5模型分組group錯誤
- 二維變一維數組
- 無限樹形結構
- json對象轉數組
- 模型關聯查詢
- tp5的模型獲取器和字段設定
- 經緯度獲取距離排序