支付宝支付接口tp3.2 SDK接入流程
- 由于在支付宝开放平台注册啊什么生成密钥什么的比较简单,这里就不多做赘述,就从下载完sdk以后怎么使用开始吧。
切记一点!!!不要下载错了,电脑网站支付、手机网站支付、app支付,我这里以电脑网站为例程 - 下载好了以后发现是这样的:
解压后:
- 然后把这些文件一股脑的拖放到thinkphp文件夹内的library/vender目录下:
- 然后sdk就这样安装好啦,开始配置过程:
将最外面的config文件夹里面的config配置内容复制到自己项目common的文件夹内,以便于后期直接在项目文件夹内调用配置内容
- 像是这样,那之后呢,我们就可以在项目里欢快的直接用C函数来条用里面的配置啦
- 然后我们就开始调用sdk里面的函数啦~在自己的控制器,或者logic层(自己建立的一个层次,其实可以直接在控制器里调用的)创建如下一个函数:里面注释应该写的很清楚啦
/**
* 支付宝pc网站支付接口
*
* @author godleisen
* @param [param]
* @return [param]
* @todo nothing to do
*/
public function pay_for_alipay_from_pc_web($po_data, $payment_id)
{
Vendor('Alipay.pagepay.service.AlipayTradeService'); // 引入库里的sdk
Vendor('Alipay.pagepay.buildermodel.AlipayTradePagePayContentBuilder');
$config = C('ALIPAY_CONFIG'); // 这里呢就是调用的公共config里面的配置参数
// 下面是每个接口都会需要的请求参数,具体的话可以直接在支付宝开放平台的接口文档看到。
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $payment_id;
//订单名称,必填
$subject = 'Service of COOPTOPUS';
//付款金额,必填
$total_amount = $po_data['price'];
//$total_amount = '0.01';
//商品描述,可空
$body = 'If you have any problem you can contact with us.';
//超时时间
$timeout_express = "3m";
$payRequestBuilder = new \AlipayTradePagePayContentBuilder(); // 这里要看清处,对应接口的sdk,实例化的名字不一样,比如 电脑网站支付是new \AlipayTradePagePayContentBuilder();,手机网站支付是new \AlipayTradeWapPayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setTimeExpress($timeout_express); // 写入配置的参数
$payResponse = new \AlipayTradeService($config);
$result = $payResponse->pagePay($payRequestBuilder, $config['return_url'], // 好这里就是重点,需要调用什么函数,就直接通过$payResponse->去调用就好,大家可以到sdk里面的函数定义里面去看,里面写的很清楚,哪个接口调用的哪个函数,这里的pagePay就是电脑网站支付接口
if (!empty($result)) {
return $this->setSuccess('get payment_info success!', 0, $result);
} else {
return $this->setError('request fail!');
}
}
-
好的,调用就是如此的简单,饶是如此,作为第一次接触支付接口的我,也是弄了好半天!
-
重点又来了!!!调用接口如果参数都正确的话,那么支付宝会返回一个表单文件,直接渲染在一个新的窗口上就好,下面我以vue为例子,因为这个项目前端我自己用的是vue
-
其实也就是寥寥几句代码的功夫:(这里是请求接收端)
// this.show_alipay = 1;
let routerData = this.$router.resolve({
path: "/payGateWay",
query: { htmlData: e.data.data.return_form } // 这里的e.data.data.return_form就是支付宝返回的表单,用router直接创建一个新的窗口,url传值,然后在另一个窗口直接渲染表单
});
// 打开新页面
window.open(routerData.href, "_ blank");
- 这里是另一个要跳转的窗口,本来是一个空界面,只需要拿来渲染支付宝返回的表单就好:
<template>
<div>
<div v-html="payGateWay">{{payGateWay}}</div>
</div>
</template>
<script>
export default {
name: "payGateWay",
data() {
return {
payGateWay: ""
};
},
mounted() {
let form = this.$route.query.htmlData;
this.payGateWay = form;
this.$nextTick(() => {
document.getElementById("alipaysubmit").submit();
});
}
};
</script>
- 哈哈哈做到这里,已经成功了一大半了,但是后面还有个小坑,就是支付宝支付成功后的异步通知,也就是之前config里面的notify_url地址,等你支付成功后,支付宝会直接异步通知你写的哪个接口。因为支付成功了以后,你肯定要知道吧,然后对应的对自己的订单数据库进行一个更新把,至少我是这么做的。那么就要继续写一个接受的接口,其实sdk也帮你写好了,这里我直接上代码:
/**
* 获取客户的支付跳转提醒,然后去查询支付情况
*
* @author godleisen
* @param [param]
* @return [param]
* @todo nothing to do
*/
public function get_pay_status()
{
Vendor('Alipay.pagepay.service.AlipayTradeService');
Vendor('Alipay.pagepay.buildermodel.AlipayTradePagePayContentBuilder');
$config = C('ALIPAY_CONFIG');
// $this->ajaxReturn('success');die;
\Think\Log::record(date('H:i:s') . json_encode($_POST)); // 这里就是一个小坑,因为支付宝请求回来,是他们自己的服务器异步请求,所以并不会在浏览器的控制台上有请求的记录,所以普通的dump啊var_dump啊echo啊都不会有显示,所以我直接把返回的结果写到日志里,那么调试起来就很方便和谐了。
$pay_id = $_POST['out_trade_no'];
$payResponse = new \AlipayTradeService($config);
$result = $payResponse->check($_POST); // 这里直接将返回的数据传入check函数即可噢
if ($result == true) {
echo 'success'; // 这里,你要是不反回success,支付宝会把你烦死,动不动隔一段时间发你一次。。
} else {
echo 'error';
}
}
好啦!以上就是支付宝支付接口的详细接入过程,因为是第一次接触支付接口,所以有什么不妥或者是更加方便的办法,欢迎留言。虽然是博客小白,但是上面的过程都是自己一步一个脚印再一个坑走出来的,应该是非常完善了,就在这边做个笔记,以免自己忘了,也让能看到的朋友少走一些弯路,不喜勿喷!!!