payment 项目2.0版本 php
特别声明:html
如下文档均针对 payment 2.0 以上版本,而且PHP须要5.5以上(含)。
代码中全部编码均使用 utf-8 。git
经过几天的时间,终于把payment 2.0的基本结构搭好了。今天刚完成支付宝 即时到账 接口的开发。赶忙把使用文档给补上。请你们必定仔细查看文档,实在还不行就来问我吧!(我期待你问我,反正我收钱的,哈哈)github
在你使用这个接口时,请先确认你是否在支付宝商户中心签约了该接口。数据库
在商户中心,看到 即时到账(已添加),说明你已签约该接口,可正常使用。若是还不知道如何签约,请 查看支付宝即时到账签约教程数组
OK!完成签约后,服务器
须要把 payment项目导入本身的项目中 安装方法,请参考Payment项目简介。微信
在项目的 examples
文件夹中,我已提供完整的示例。为了便于你们理解,这里对代码再进行说明。异步
在1.x版本中,配置文件被固定写在了sdk中,这种作法太流氓了。为了避免继续流氓下去,在2.x版本中,将配置信息独立出来,让你们能够根据本身的实际状况自定义,灵活程度大大增长。函数
调用时,仅须要提供给我以下的一个数组,至于配置信息写在哪里,彻底由你本身决定。
我在示例中,是将配置信息写在 examples/aliconfig.php
中,而后使用 require_once
包含进来。你彻底能够写cache中、db中。
return [ 'partner' => '2088xxxxxxxxxxx', 'md5_key' => 'xxxxxxxxxxxxxxxxxx', 'rsa_private_key' => './rsa_private_key.pem', "notify_url" => 'http://test.helei.com/pay-notify.html', "return_url" => 'http://test.helei.com/return-url.html', "time_expire" => '14', ];
参数介绍
参数 | 参数名 | 参数说明 | 是否必须 |
---|---|---|---|
partner | 合做者身份ID | 签约的支付宝帐号对应的支付宝惟一用户号。以2088开头的16位纯数字组成。 | 必须 |
md5_key | MD5密钥 | 点击这里 | 必须 |
rsa_private_key | RSA私钥 | 点击这里 | 必须 |
notify_url | 服务器异步通知URI | 支付宝服务器主动通知商户网站里指定的页面http路径。(建议使用https) | 可选 |
return_url | 页面跳转同步通知页面路径 | 支付宝处理完请求后,当前页面自动跳转到商户网站里指定页面的http路径。 | 可选 |
time_expire | 超时时间 | 设置未付款交易的超时时间,一旦超时,该笔交易就会自动被关闭。单位默认为分钟 | 可选 |
特别说明:
若是上述配置文件必须的key的值为空,会抛出 PayException
异常
若是 notify_url
为空,虽然可支付成功,可是客户端将没法收到支付宝的回调结果。
建议采用https协议
项目中的示例代码,参见 examples/charge.php
// 生成订单号 便于测试 function createPayid() { return date('Ymdhis', time()) .substr(floor(microtime()*1000),0,1) .rand(0,9); } // 订单信息 $orderData = [ "orderTradeNo" => createPayid(), "totalFee" => '1', "clientIp" => '127.0.0.1', "subject" => '我是即时到账', "body" => '支付测试即时到账接口', "extraCommonParam" => '', ]; $aliconfig = require_once __DIR__ . '/aliconfig.php'; // 实例化支付环境类,进行支付建立 $charge = new ChargeContext(); try { $charge->initCharge(Config::ALI_CHANNEL_WEB, $aliconfig); $url = $charge->charge($payData); } catch (PayException $e) { echo $e->errorMessage();exit; } // 请求alipay header("Location:{$url}");
以上代码就完成了即时到账的所有调用,下面分步骤来讲明下代码含义:
此部分的key部分,必须采用如下值,不然SDK没法识别。
// createPayid(); 函数是为了演示方便,随手写的一个生成订单号的函数 $orderData = [ "order_no" => createPayid(), "amount" => '1',// 单位为元 "client_ip" => '127.0.0.1', "subject" => '测试支付', "body" => '支付接口测试', "extra_param" => '', ];
参数说明
参数 | 参数名 | 参数说明 | 是否必须 |
---|---|---|---|
order_no | 订单号 | 平台根据规则生成的订单号,最长64位,要在商户数据库中惟一 | 必须 |
amount | 交易总金额 | 该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。 | 必须 |
client_ip | 客户端IP | 用户在建立交易时,该用户当前所使用机器的IP。 | 必须 |
subject | 商品名称 | 商品的标题/交易标题/订单标题/订单关键字等。该参数最长为128个汉字。 | 必须 |
body | 商品描述 | 对一笔交易的具体描述信息。若是是多种商品,请将商品描述字符串累加传给body。 | 必须 |
extra_param | 公用回传参数 | 若是用户请求时传递了该参数,则返回给商户时会回传该参数。 | 可选 |
如下是真正实现数据签名的地方,返回的数据可直接用于发起支付宝支付。你们能够对比下支付宝自身信息,是否是已经大大简化了?
固然简化带来的另一个意思就是:放弃了不少咱们正常状况下用不到的功能,好比:花呗分期
// 实例化支付环境类,进行支付建立 $charge = new ChargeContext(); try { $charge->initCharge(Config::ALI_CHANNEL_WEB, $aliconfig); $url = $charge->charge($payData); } catch (PayException $e) { echo $e->errorMessage();exit; }
这里对于调用者,仅仅须要知道 ChargeContext
这一个类,这里使用了 策略模式 + 简单工厂模式 两种方法来进行调用的简化。这种方式也很是方便后期进行扩展,对于客户端与复杂的逻辑进行了隔离。
经过上一步返回的是请求支付宝的url。因为在页面上可能须要经过js调用支付宝或者还有其余逻辑,由于我并无直接重定向到支付宝,而把控制权交到了客户端手中。
如下代码,示例的是简单的利用返回的url,重定向到支付宝,完成支付。
header("Location:{$url}");
本次支付宝的即时到账接口到这里就完成了调用。下一节把回调通知部分完成,这样一个基本的支付流程就完成了。
若是须要协助集成到项目,可付费得到个人服务!
微信:helei543345
邮箱: dayugog@gmail.com
支持我: