## 下载支付宝Demo
手机端
[https://opendocs.alipay.com/open/203/105910](https://opendocs.alipay.com/open/203/105910)
![](https://img.kancloud.cn/22/46/22468652c72aabf48863ca731dac401b_1623x604.png)
网页端
[https://opendocs.alipay.com/open/270/106291](https://opendocs.alipay.com/open/270/106291)
## 配置文件
将下载好的SDK放入到extend文件中 , 并将文件名改为 * **AlipayTradePagePay***
![](https://img.kancloud.cn/66/48/66482096c17d46b0a1f29e1526cc1cca_353x298.png)
##windows环境下 修改lotus.php文件写入配置
**在windows环境下将 此行注释 否则报错 部署到 Linux上后再取消注释**
![](https://img.kancloud.cn/d6/55/d65561f4df39892700141d4a3eb3e7fb_1433x757.png)
##写入配置 在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信息
![](https://img.kancloud.cn/bb/89/bb89f47c709dc6e33f46a3fcbbd71e05_1427x453.png)
## 在配置文件里面修改config 的appid等信息
![](https://img.kancloud.cn/42/9a/429a4c83fb5e7b50fb56479d72acb406_1736x819.png)
```
'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"; //请不要修改或删除
}
}
```
# 重点重点重点 重要的事情说三遍 重要的事情说三遍 重要的事情说三遍
![](https://img.kancloud.cn/fd/e4/fde47cf34baa2d18cace8e8469d8ed73_443x119.png)
## **回调引用的文件一定不要忘了加命名空间**
![](https://img.kancloud.cn/9e/46/9e46f40fb1ebbd0dcb1e578bf6593791_827x114.png)
- 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的模型获取器和字段设定
- 经纬度获取距离排序