[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)
>是不是 非常简单 呢 !