首先,下载支付宝提供的demo。
下载demo,目录结构如下:
把 alipay.trade.wap.pay-PHP-UTF-8文件夹拿出来,放到tp5根目录 vendor 文件夹下,重命名为alipay:
配置config.php内的内容
<?php $config = array ( //应用ID,您的APPID。 'app_id' => "2016102212345813", //商户私钥 'merchant_private_key' => "MIIEvQIBADAN HQL9bkGvrVR/R2QlXFMSBD+HTtH2qjY=", //异步通知地址 'notify_url' => "http://域名/Pay/Alipay/notifyUrl", //同步跳转 'return_url' => "http://域名/Pay/Alipay/returnUrl", //编码格式 'charset' => "UTF-8", //签名方式 'sign_type'=>"RSA2", //支付宝网关 //'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//正式支付地址 'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//沙盒支付地址 //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 'alipay_public_key' => "MIIBIj gD3ogRaVNGHdQIDAQAB", );
添加Alipay.php控制器
<?php namespace app\index\controller; use think\Controller; use think\Request; use think\Db; class Alipay extends Controller { public function index(Request $request){ header("Content-type:text/html;charset=utf-8"); require_once VENDOR_PATH.'/alipay/config.php'; require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; $param = $request->param(); //商户订单号,商户网站订单系统中唯一订单号,必填 $out_trade_no = trim($param['out_trade_no']); //订单名称,必填 $subject = trim($param['subject']); //付款金额,必填 $total_amount = trim($param['total_amount']); //商品描述,可空 $body = trim($param['body']); //公用回传参数 // $passback_params = http_build_query($param['purchaseInfo']); //$passback_params = urlencode($param['buyer']); //构造参数 $payRequestBuilder = new \AlipayTradePagePayContentBuilder(); $payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject); $payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setOutTradeNo($out_trade_no); //电脑网站支付请求 $aop = new \AlipayTradeService($config); $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']); //输出表单 var_dump($response); } /** * 异步 * @param Request $request * @throws \Exception */ public function notifyUrl(Request $request){ $param = $request->param(); require_once VENDOR_PATH.'/alipay/config.php'; require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; $alipaySevice = new \AlipayTradeService($config); $alipaySevice->writeLog(var_export($param,true)); $result = $alipaySevice->check($param); if($result) { //验证成功 $out_trade_no = urldecode($param['out_trade_no']); if($param['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_amount与通知时获取的total_fee为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 } echo "success"; }else { //验证失败 echo "fail"; } } /** * 同步 * @param Request $request * @throws \Exception */ public function returnUrl(Request $request){ $param = $request->param(); require_once VENDOR_PATH.'/alipay/config.php'; require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; $alipaySevice = new \AlipayTradeService($config); $result = $alipaySevice->check($param); /* 实际验证过程建议商户添加以下校验。 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if($result) { //验证成功 echo "验证成功"; } else { //验证失败 echo "验证失败"; } } } ?>
添加自己处理数据的方法
web页面
<!DOCTYPE html> <html> <head> <title>alipay_test</title> </head> <body> <form name=alipayment action="{:url('Alipay/index')}" method="post" target="_blank"> 商户订单号:<input type="text" name="out_trade_no" value="{$out_trade_no}" /><br/> 订单名称:<input type="text" name="subject" value="{$subject}"/><br/> 付款金额:<input type="text" name="total_amount" value="{$body}" /><br/> 商品描述:<input type="text" name="body" value="{$body}"/><br/> <button type="submit">付 款</button> </form> </body> </html>
效果: