ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 下载支付宝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)