好了废话不多说,我这篇文档主要针对初入坑的小白,只要你认真的照着我的文档去开发,轻松拿下支付宝支付。
一、【搭建和配置开发环境】
1、申请开通支付权限(这里是需要商家用户才能进行申请的,个人用户不支持)
2、进入-》开发者中心-》网页&移动开发,确保应用状态已生效
(open.alipay.com/platform/ma…)
3、点击右侧相应应用详情,进入签约相关功能,注意!必须应用生效后再进行签约功能,否则功能不生效
4、进入商家个人中心
5、下载公钥生成器(如果你安装了360,请在下载前关闭它,这是一个坑),图示是已经下载配置好的画面,如果你还没下载,点击后会提示下载的地址
可以看到这里有一个支付跳转地址,其实就是用户支付完成后跳回你想要让用户跳转的地址。
6、将生成的商户公钥填入,会自动生成支付宝公钥,下列是生成的秘钥,到开私钥位置,图中的文件即为个人私钥
7、ok,到这一步,我们的文件获取就算完成了,接下来,查看下官方文档,看下要调起支付宝支付,我们需要传递过去什么参数
二、【接入demo】
1、这里推荐使用数据库创建一个表,用于存储支付宝的相关资料,方便之后的开发(当然,如果为了保密,你可以在存储的时候加多一层加密,取出的时候解密就可以了)
字段类型需要稍稍注意下,私钥和公钥需要用txt存储,否者容易长度不足。
还有一点,商户私钥,在打开我们的私钥文件的时候是长这样的
中间红框部分才是我们需要的,在作为参数传给支付宝的时候,你必须将其作为一段字符串,去头去尾,去空格回车
2、进入官方接入文档,下载demo
(docs.open.alipay.com/203/105910/)
3、使用demo进行支付调起测试,这里使用本地环境就可以了,不需要测试环境或者线上环境,如果你的应用还未生效,可以使用沙盒模式去进行调试
4、配置配置文件,找到你下载好的demo,在主目录下找到config.php
配置成如下即可,如果你没有选择存储到数据库,可以将所有参数都作为字符串存进来,也是一样的
三、【实际项目使用】
1、在本地环境运行demo
正常这时候你已经可以直接支付金额了的,没错,直接通过demo进行支付,当然,我们在实际开发中,其实并不会这么干,需要对demo进行重新封装,让他成为适合我们的函数。
在这之前,我们要明白整个支付到底是这么的一个流程:
2、支付宝调起支付函数
通过查看demo里的index.php,我们可以看到手机web支付,使用的是wappay文件夹里的pay.php,打开该文件
可以看到我们这里最后是引用了一个wapPay的方法,
payRequestBuilder:为调起支付宝的相关参数
return_url:为支付完成后的跳转地址,前面的【搭建和配置开发环境-第5步】有提及在哪里配置
notify_url:为回调地址,每次支付成功后,支付宝都会来访问这个地址,并带上相应的参数
这里的代码,就是开始调起支付宝支付了,把它抽出来,封装成一个方法
把你自己需要的订单信息传进来,构造相应的信息即可
这里有一个参数,公共回传参数,如果你使用了这个参数,支付宝将会在回调的时候一起把参数以json的格式传回来给你,但是打开AlipayTradeWapPayContentBuilder类,你是找不到相应的构造方法的,我们模拟支付宝demo写一个。
打开AlipayTradeWapPayContentBuilder类,构造以下方法,然后调用就可以了,同样的,你如果需要其他参数,类里没有方法的话,可以自己构造,但是注意是setXXX,getXXX两个方法
public function setPassbackParams($passback_params)
{
$this->passback_params = $passback_params;
$this->bizContentarr['passback_params'] = $passback_params;
}
public function getPassbackParams()
{
return $this->passback_params;
}
复制代码
这一步做完,你应该就能在项目里调起自己的支付宝支付了,但是,支付还没做完呢,有一个支付回调的流程。
3、处理支付回调
每次支付完成后,支付宝会以POST的方式,给我们发来一个数组,数组大概长这样的:
我们这里需要做如下的几步操作:
- 对回调的参数进行一个验签的操作;
- 根据回调参数,改变系统订单状态;
- 书写自己的系统逻辑;
- 告诉支付宝成功接收到回调。
在验签之前,根据支付宝返回的外部订单号(out_trade_no)其实就是我们系统自己的内部订单号,去查一遍,看看订单是否真的存在,不存在,就没必要进行下去了
1)在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。
2)将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待签名字符串。
3)将签名参数(sign)使用base64解码为字节码串。
4)使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。
5)需要严格按照如下描述校验通知数据的正确性。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的 操作方(有的时候,一个商户可能有多个seller_id/seller_email),
4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
注意:
- 状态TRADE_SUCCESS的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功;
- 交易状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。
找出自己的订单,把相应的信息填上去就好了,这一步很简单
这一步,建议将自己系统的逻辑完整得封装成一个类,我们这里直接调用逻辑类的主方法就可以了,代码的逻辑层次尽量分明。
function verify_result($result)
{
if ($result) {
echo 'success';
} else {
echo 'fail';
}
}
复制代码
注意!成功时一定要返回的是字符串“success”,否则支付宝将重复进行回调操作 ,就是不断的来访问你的服务器。
OK,支付宝整个就接好了