## PHP-支付宝-APP支付
*参考文档:*
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.5c86Lp&treeId=204&articleId=105297&docType=1
### 第一步:创建应用并获取APPID
要在您的应用中使用支付宝开放产品的接口能力,您需要先去蚂蚁金服开放平台(open.alipay.com),在管理中心中创建登记您的应用,并提交审核,审核通过后会为您生成应用唯一标识(APPID),并且可以申请开通开放产品使用权限,通过APPID您的应用才能调用开放产品的接口能力。需要详细了解开放平台创建应用步骤请参考《开放平台应用创建指南》。
![](https://box.kancloud.cn/d5aa9d508cb0a1e8e4b6d174f3a5c81c_553x277.png)
如果想要有支付功能,该应用必须参加APP支付的功能。
### 第二步:配置密钥
开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。详细步骤请参考《配置应用环境》。
![](https://box.kancloud.cn/c56fa1a5c4b79ac0eb5090fe9e92162f_554x399.png)
使用工具生成应用私钥和公钥,并设置应用私钥。
### 第三步:集成并配置SDK
接入移动支付需要集成两个SDK,客户端SDK需要集成在商户自己的APP中,用于唤起支付宝APP并发送交易数据,并在支付宝APP返回商户APP时获得支付结果。服务端SDK需要商户集成在自己的服务端系统中,用于协助解析并验证客户端同步返回的支付结果和异步通知。
如何集成客户端SDK
点击查看iOS集成流程详解,Android集成流程详解。
如何集成服务端SDK
为了帮助开发者调用开放接口,我们提供了开放平台服务端SDK,包含JAVA、PHP和.NET三语言版本,封装了签名&验签、HTTP接口请求等基础功能。请先下载对应语言版本的SDK并引入您的开发工程。
#### 第四步:调用接口
![](https://box.kancloud.cn/91852b57e76f54dccfd02fa3edfa16c3_554x318.png)
#### 实现步骤:
在这里只对服务端,进行说明,服务端需要实现只有这几个接口,主要使用官方提供的php sdk。
初始化:
Loader::import('alipay.AopClient', EXTEND_PATH);
$this->aopClient = new \AopClient();
$this->aopClient->appId = config('alipay_config.appid');//应用aapid
$this->aopClient->rsaPrivateKey = config('alipay_config.rsa_private_key');//应用私钥
$this->aopClient->format = 'json';
$this->aopClient->alipayrsaPublicKey = config('alipay_config.alipay_rsa_public_key');//支付宝公钥
#### 1. 签名接口:
用户在客户端下单,发起支付请求,先到服务端生成支付签名,再返回给客户端调支付宝客户端进入支付页面。
~~~
Loader::import('alipay.request.AlipayTradeAppPayRequest', EXTEND_PATH);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.open.public.template.message.industry.modify
$req = new \AlipayTradeAppPayRequest();
$req->setNotifyUrl(config('alipay_config.notify_url'));//异步通知接口
$bizCoent = [];
$bizCoent['timeout_express'] = "1d";
$bizCoent['product_code'] = "QUICK_MSECURITY_PAY";//产品编码,固定
$bizCoent['total_amount'] = $sum_pay;
$bizCoent['subject'] = ‘标题’;
$bizCoent['body'] = '订单描述';
$bizCoent['out_trade_no'] = $order_num;
$req->setBizContent(json_encode($bizCoent));
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$response = $this->aopClient->sdkExecute($req);//生成签名
~~~
#### 2. 客户端同步通知:
当用户支付成功后,调用该接口通知系统支付成功,并做一些订单信息的修改,但是这个接口无法保证一定会成功执行,主要是辅助后台异步通知。
该接口由支付成功后调用:
~~~
$param = json_decode(post('pay_result'),true);//参考支付宝【客户端同步】接口
if ($param['resultStatus'] == 9000) {//交易成功
//支付成功,验证订单信息,验证签名,修改订单信息
} else {
log_error("支付宝同步通知失败", '状态码:' . $param['resultStatus'] . '|' . $param['memo']);
}
~~~
#### 3. 后台异步通知
当支付成功后,异步调用该接口通知系统订单支付成功,这个接口是可信任的,当你没有返回“success”时,支付宝会在一天内定时调用8次。
该接口由支付宝通过签名设置的notify_url调起:
~~~
$param=$_POST;//接受post数据,参考【支付结果异步通知】
$res=$this->aopClient->rsaCheckV1($param);
if(!$res){
log_error("支付宝notify通知",$param['out_trade_no']."参数验证失败");
return error("参数验证失败");
}
f($param['trade_status']=='TRADE_SUCCESS'||$param['trade_status']=='TRADE_FINISHED'){
return $this->updateOrder($param['out_trade_no'],$param['trade_no'],1,$param['total_amount'] );
}else if($param['trade_status']=='TRADE_CLOSED'){//交易关闭,把订单改为已撤销
return $this->cacelOrder($param['out_trade_no']);//取消订单
}else{//其他通知类型
return error("未知通知类型");
}
~~~
- 我的笔记
- 服务器
- ubuntu svn 环境的搭建
- ubuntu Memcache 的配置
- ubuntu 密钥登录服务器
- centos 搭建服务器环境
- nginx+tomcat 集群搭建
- 餐厅运营来看如何构建高性能服务器
- VMware-Centos-网络配置
- Ubuntu-PHP-Apache-Mysql-PhpMyadmin的搭建
- UbuntuApache配置日志
- linux获取当前执行脚本的目录
- Ubuntu svn的快速配置(原创)
- Https配置
- Mysql 不支持远程连接解决方案
- ubuntu+apache+rewrite
- php Mcrypt 扩展
- 重启Apache出现警告信息Could not reliably determine the server's fully qualified domain name,
- Mysql无法远程连接
- 定时任务设置
- Linux中Cache内存占用过高解决办法
- Ubuntu14-04安装redis和php5-redis扩展
- php
- thinkphp3.2 一站多城市配置
- PHP 安全编程建议(转)
- phpexcel导入时间处理
- Mysql按时,天,月,年统计数据
- PHP-支付宝-APP支付
- 百度爬虫-获取全国数据
- PHPEXCEL导入导出excel文件
- php-微信app支付后端设计
- Phpqrcode生成二维码
- 图片+文字水印
- 数据库优化
- java
- Mybatis 二级缓存
- 微信
- 微信公众号多域名授权
- 微信扫码支付
- web
- 网站性能优化方案实施
- ionic环境搭建
- 登录设计方案
- 设置dev元素的宽高比例
- 设计模式
- app
- 版本更新
- 微擎数据库操作扩展
- select
- find
- delete
- update
- insert
- where
- order
- page
- group
- having
- limit
- fields
- debug
- bind
- join
- alias
- query
- 聚合函数
- count
- sum
- max
- min
- avg
- 事务管理
- 自增自减
- 算法设计
- ACM:入口的选择------深度优先搜索
- java:N的N次方
- 最少拦截系统:贪心思想
- ACM:蚕宝宝:搜索
- ACM:n!的位数 :斯特林公式
- 神奇的异或
- 中国剩余定理
- 矩阵翻硬币
- 回溯法
- ACM程序设计网站集锦
- 博弈论
- 多维空间上的搜索算法
- 算法学习笔记之一(排序)
- 算法学习笔记之二(堆排序)
- 算法学习笔记之三(快速排序)
- ACM俱乐部密码
- 原创开源
- 个人感悟