1、支付宝开发平台商户认证
2、创建应用:https://docs.open.alipay.com/203/107084/
创建应用的时候,有个问题,就是关于这个回调地址、应用网关,翻了文档也没看到具体的参数说明。
网上有人说:
单纯的支付接口是不需要配置这两个信息的,简单来说就是:应用网关是用于接收口碑或是生活号的信息的,授权回调地址是第三方授权或是用户信息授权使用的,如果用不到是可以不配置的!
参考地址:https://blog.csdn.net/sinat_32575213/article/details/79713654
3、支付宝文档中说先下载SDK,其实可以直接跳过,直接下载DEMO,直接改来用,下面就放完整个的流程代码
先看下DEMO的结构:
合并到TP的结构
右边是原文件,圈起来的三个文件可以删除掉(也可以不删),直接放到TP的config.php和具体的控制器里面。
1、TP项目的config.php配置文件
'ALIPAY_CONFIG'=>array(
//应用ID,您的APPID。
'app_id' => "自己创建应用的appid",//正式
// 'app_id' => "自己沙盒的appid",//沙盒
//商户私钥,您的原始格式RSA私钥
'merchant_private_key' => "填自己的私钥",
//异步通知地址
'notify_url' => '',//在方法里填,也可以在这里填
//同步跳转
'return_url' => '',//在方法里填,也可以在这里填
//编码格式
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//正式
// 'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//沙盒
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "填自己的",
),
2、前台:HTML点支付按钮页(根据逻辑调整)一定要同步POST
3、后台:请求控制器里的方法(alipayPost支付请求方法,alipayNotifyUrl异步通知方法--直接复制DEMO的,alipayReturnUrl同步反回方法--直接复制DEMO)
/**
* 支付宝支付请求
*/
public function alipayPost(){
// 支付宝生成订单
Vendor('AlipayPHPWebPay.wappay.service.AlipayTradeService');
Vendor('AlipayPHPWebPay.wappay.buildermodel.AlipayTradeWapPayContentBuilder');
$config = C('ALIPAY_CONFIG');//支付宝配置信息
$config['return_url']=$this->url.CONTROLLER_NAME.'/';//同步跳转
$config['notify_url']=$this->url.CONTROLLER_NAME.'/alipayNotifyUrl';//异步通知地址
$requestData=$_POST;
if (!empty($requestData['WIDout_trade_no']) && trim($requestData['WIDout_trade_no']) != "") {
//超时时间
$timeout_express = "1m";
$payRequestBuilder = new \AlipayTradeWapPayContentBuilder();
$payRequestBuilder->setBody($requestData['WIDbody']);
$payRequestBuilder->setSubject($requestData['WIDsubject']);
$payRequestBuilder->setOutTradeNo($requestData['WIDout_trade_no']);
$payRequestBuilder->setTotalAmount($requestData['WIDtotal_amount']);
$payRequestBuilder->setTimeExpress($timeout_express);
$payResponse = new \AlipayTradeService($config);
$result = $payResponse->wapPay($payRequestBuilder, $config['return_url'], $config['notify_url']);
}
}
/**
* 功能:支付宝服务器异步通知页面
* 版本:2.0
* 修改日期:2016-11-01
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*************************页面功能说明*************************
* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
* 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
*/
public function alipayNotifyUrl(){
$res=$_POST;//支付成功的信息
$subOrderInfo = M('记录表')->where(array('字段' => $res['out_trade_no']))->find();
if ($subOrderInfo['status'] >= 1) {
exit;
}
if(!empty($subOrderInfo)){
$saveData = array(
'request_trade_no' => $res['trade_no'],//支付宝订单
'pay_time' => time(),
'status' => 1,
);
M('记录表')->where(array('字段' => $res['out_trade_no']))->save($saveData);
//这里写自己系统的逻辑处理,然后返回
$this->selfAjaxReturn(true,'提交成功!',array(),U('模块/控制器/方法'));
}else{
exit();
}
}
/**
* 功能:支付宝页面跳转同步通知页面
* 版本:2.0
* 修改日期:2016-11-01
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*************************页面功能说明*************************
* 该页面可在本机电脑测试
* 可放入HTML等美化页面的代码、商户业务逻辑程序代码
*/
public function alipayReturnUrl(){
$res=$_GET;//支付成功的信息
$subOrderInfo = M('记录表')->where(array('字段' => $res['out_trade_no']))->find();
if(!empty($subOrderInfo) && $subOrderInfo['status']<1){
$saveData = array(
'request_trade_no' => $res['trade_no'],//支付宝订单
'pay_time' => time(),
'status' => 1,
);
M('记录表')->where(array('字段' => $res['out_trade_no']))->save($saveData);
//这里写自己系统的逻辑处理,然后返回
$this->assign('输出字段',$subOrderInfo['字段']);
}
$this->display();
}
前端支付返回HTML(layer.js是引用了layui的框架的):主要思路是在同步的HTML中,做异步再请求后台,这样就可以弹窗,也可以直接自己定下个模态框显示
XXXXX
4、修改DEMO的相应文件和一些注意事项,不然会报错,
Vendor\AlipayPHPWebPay\wappay\service\AlipayTradeService.php文件
Vendor\AlipayPHPWebPay\lotusphp_runtime\shortcut.php文件C方法跟TP的重复了)
DEMO有个坑,参数不正确,支付宝官网文档上写的请求参数是 product_code (https://docs.open.alipay.com/203/107090/)
Vendor\AlipayPHPWebPay\wappay\buildermodel\AlipayTradeWapPayContentBuilder.php文件
还有要注意金额的格式,这个也是容易错的
以上是在沙盒环境测过没有问题,由于应用要审核,如果有别的BUG,大家自行搜索就好,先解决大问题