企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] 在所有关于 **ThinkPHP3.2.3支付宝支付** 的教材中,无疑 `白俊遥` 的支付是我看到的写的最为简单,最为贴近开发者的心声! >当然官方的接口是最好及最新的,因为有代码差异性,白俊遥 的支付是旧版的,当然也能用。在这里我们先讲旧版的,再讲新版的。因为这是一篇ThinkPHP3.2.3,已经集成了支付,所以我们先讲旧版支付,后讲新版本支付。 那么我们,就先按照 `白俊遥` 的教程来做,当然对于没有做过支付的童鞋来说,还是比较容易走弯路的。 因为简单,所以完成支付很快。因为简单,遇到的坑也比较多。 那么我们先按照他的教程来做,期间有需要图文贡献的,我会及时补充! 有人说,你抄他的哎,是的,这一章有一部分内容是抄他的,接下来几章,那就是我的创新了! 它的代码项目地址:https://github.com/baijunyao/thinkphp-bjyadmin 他实现的场景是这样的: >目前有1个叫“测试”的商品名称,价格为1元,订单号为10位数字的时间戳!访问地址直接跳转到支付宝下单! ## 一、导入sdk 将开源项目下的 `/ThinkPHP/Library/Vendor/Alipay` 复制到我们对应的目录下,如图: ![mark](http://qiniu.newthink.cc/blog/20170915-223109892.png) ## 二、配置项 把 `/Application/Common/Conf/config.php`项目中关于支付宝的内容拷贝下来!如图所示: ![mark](http://qiniu.newthink.cc/blog/20170915-223559816.png) 白的代码如下, ``` 'ALIPAY_CONFIG' => array( 'partner' => '', // partner 从支付宝商户版个人中心获取 'seller_email' => '', // email 从支付宝商户版个人中心获取 'key' => '', // key 从支付宝商户版个人中心获取 'sign_type' => strtoupper(trim('MD5')), // 可选md5 和 RSA 'input_charset' => 'utf-8', // 编码 (固定值不用改) 'transport' => 'http', // 协议 (固定值不用改) 'cacert' => VENDOR_PATH.'Alipay/cacert.pem', // cacert.pem存放的位置 (固定值不用改) 'notify_url' => 'http://baijunyao.com/Api/Alipay/alipay_notify', // 异步接收支付状态通知的链接 'return_url' => 'http://baijunyao.com/Api/Alipay/alipay_return', // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。 (扫码支付专用) 'show_url' => 'http://baijunyao.com/User/Order/index', // 商品展示网址,收银台页面上,商品展示的超链接。 (扫码支付专用) 'private_key_path' => '', //移动端生成的私有key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用) 'public_key_path' => '', //移动端生成的公共key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用) ), ``` 修改其中的代码为我们自己的,如下 ``` //*********************************** 支付宝支付 ********************************** 'ALIPAY_CONFIG' => array( 'partner' => '2088821002087646', // partner 从支付宝商户版个人中心获取 'seller_email' => 'sxqiboxx@163.com', // email 从支付宝商户版个人中心获取 'key' => 'fftte2po5zcudr2dlsm136yv6ur9j0ah', // key 从支付宝商户版个人中心获取 'sign_type' => strtoupper(trim('MD5')), // 可选md5 和 RSA 'input_charset' => 'utf-8', // 编码 (固定值不用改) 'transport' => 'http', // 协议 (固定值不用改) 'cacert' => VENDOR_PATH . 'Alipay/cacert.pem', // cacert.pem存放的位置 (固定值不用改) 'notify_url' => 'http://tp3/Api/Alipay/alipay_notify', // 异步接收支付状态通知的链接 'return_url' => 'http://tp3/Api/Alipay/alipay_return', // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。 (扫码支付专用) 'show_url' => 'http://tp3/User/Order/index', // 商品展示网址,收银台页面上,商品展示的超链接。 (扫码支付专用) 'private_key_path' => '', //移动端生成的私有key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用) 'public_key_path' => '', //移动端生成的公共key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用) ), ``` ![mark](http://qiniu.newthink.cc/blog/20170915-231246269.png) 这里需要详细说明一下,各种配置的获取方式,这里主要是`partner`,`seller_email`,`key`这三个是从商户中获取的,如果有不知道的,可以参考《支付宝配置获取》一节 >请注意:`notify_url` ,`return_url` ,`show_url` 这几个路径配置,正确上线的时候需要配置为带有域名的正确网址。 注:本次支付可以先无视 `private_key_path`、`public_key_path `这两个参数 ## 三、支付函数 `/Application/Common/Common/function.php` 中将 `function alipay`拷贝过来。 ![mark](http://qiniu.newthink.cc/blog/20170915-232144616.png) 代码如下: ``` /** * 跳向支付宝付款 * @param array $order 订单数据 必须包含 out_trade_no(订单号)、price(订单金额)、subject(商品名称标题) */ function alipay($order){ vendor('Alipay.AlipaySubmit','','.class.php'); // 获取配置 $config=C('ALIPAY_CONFIG'); $data=array( "_input_charset" => $config['input_charset'], // 编码格式 "logistics_fee" => "0.00", // 物流费用 "logistics_payment" => "SELLER_PAY", // 物流支付方式SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) "logistics_type" => "EXPRESS", // 物流类型EXPRESS(快递)、POST(平邮)、EMS(EMS) "notify_url" => $config['notify_url'], // 异步接收支付状态通知的链接 "out_trade_no" => $order['out_trade_no'], // 订单号 "partner" => $config['partner'], // partner 从支付宝商户版个人中心获取 "payment_type" => "1", // 支付类型对应请求时的 payment_type 参数,原样返回。固定设置为1即可 "price" => $order['price'], // 订单价格单位为元 // "price" => 0.01, // // 调价用于测试 "quantity" => "1", // price、quantity 能代替 total_fee。 即存在 total_fee,就不能存在 price 和 quantity;存在 price、quantity, 就不能存在 total_fee。 (没绕明白;好吧;那无视这个参数即可) "receive_address" => '1', // 收货人地址 即时到账方式无视此参数即可 "receive_mobile" => '1', // 收货人手机号码 即时到账方式无视即可 "receive_name" => '1', // 收货人姓名 即时到账方式无视即可 "receive_zip" => '1', // 收货人邮编 即时到账方式无视即可 "return_url" => $config['return_url'], // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。 "seller_email" => $config['seller_email'], // email 从支付宝商户版个人中心获取 "service" => "create_direct_pay_by_user", // 接口名称 固定设置为create_direct_pay_by_user "show_url" => $config['show_url'], // 商品展示网址,收银台页面上,商品展示的超链接。 "subject" => $order['subject'] // 商品名称商品的标题/交易标题/订单标 题/订单关键字等 ); $alipay=new \AlipaySubmit($config); $new=$alipay->buildRequestPara($data); $go_pay=$alipay->buildRequestForm($new, 'get','支付'); echo $go_pay; } ``` ## 四、调用 ``` <?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index() { $data=array( 'out_trade_no'=>time(), 'price'=>1, 'subject'=>'测试' ); alipay($data); } } ``` 我们访问: `http://tp3/Home/Index/index` 就会得到我们梦寐以求的界面,如图所示: ![mark](http://qiniu.newthink.cc/blog/20170915-232951667.png) >是不是 非常简单 呢 !