PHP之支付宝APP支付

引言:

最近公司项目涉及到支付宝APP支付,因此打算总结一下此次开发过程中遇到的问题和解决方案,从头到尾打通支付宝服务端的代码思路,我用的服务端语言是PHP。

一、支付应用的创建和配置

1-1、登录蚂蚁金服开放平台首页(需实名认证的支付宝账号),点击创建支付应用,并配置应用信息,这里不做过多阐述,去开发指南自己看下。

1-2、着重讲一下密钥。在应用审核之前会让你配置密钥,这里使用支付宝提供的签名生成器,下载你电脑对应系统的版本。选择你开发用的语言和加密方式,其中2048指的是RSA2加密方式,1024指的是RSA加密,支付宝推荐使用RSA2。生成的相关密钥单击打开密钥文件即可查看,生成的密钥建议使用“密钥匹配”功能自检一下,如果匹配失败就重新生成。这两个密钥一定要保存好。

1-3、另外配置中应用网关和授权回调地址这两项容易理不清概念,看一下支付宝开发文档的解释,原文链接

二、接入支付宝SDK

2-1、服务端sdk的获取。打开链接下载对应语言的SDK。解压后把整个目录放入项目对应文件下(这里建议改下名字),新建pay文件夹,这里就是我们支付逻辑的文件夹啦,可以在这里写生成支付和回调逻辑。

2-2、生成支付订单,这里可以在pay文件夹下新建一个OrderInfo.php文件。

2-3、代码

<?php 
//这个地方要引入下面要用到的类
require_once '../aop/AopClient.php';
require_once '../aop/request/AlipayTradeAppPayRequest.php';

$aop = new AopClient;
//这里是支付宝网关,正式环境用这个即可,沙箱环境网关为	https://openapi.alipaydev.com/gateway.do
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
//填写appid,在应用的头上面有
$aop->appId = "app_id";
//这个地方填写私钥,就是我们在上面用工具生成的私钥,这个私钥必须是和上传到支付宝的公钥匹配,不让,支付宝访问的时候会匹配错误
$aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串';
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
//这个地方的公钥也是一样,必须是上传到支付宝的那个公钥要一样
$aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串';
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$bizcontent = "{\"body\":\"我是测试数据\"," 
                . "\"subject\": \"App支付测试\","
                . "\"out_trade_no\": \"20170125test01\","
                . "\"timeout_express\": \"30m\"," 
                . "\"total_amount\": \"0.01\","
                . "\"product_code\":\"QUICK_MSECURITY_PAY\""
                . "}";
$request->setNotifyUrl("商户外网可以访问的异步地址");//这个是异步回调地址
$request->setBizContent($bizcontent);
//调用sdkExecute生成订单url
$response = $aop->sdkExecute($request);
/*htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
*如果这里需要用json返回可以去掉htmlspecialchars
*/
echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。


 ?>

2-4、回调处理,这里说一下异步回调,因为判断支付成功最终要依赖异步回调的结果。同步通知参考开发者文档

<?php
/**
 * 支付宝回调结果处理
 */

//引入一下文件
require_once '../aop/AopClient.php';
require_once '../aop/request/AlipayTradeAppPayRequest.php';

//把回调记录放入日志文件
$file  = 'log.txt';
$contents='平台单号:'.$_POST['out_trade_no'].','.'交易金额:'.$_POST['total_amount'].','.'合作伙伴id:'.$_POST['seller_id'].','.'app_id:'.$_POST['seller_id'].','.'付款时间:'.$_POST['gmt_payment'].',sign:'.$_POST['sign']."\r\n";
file_put_contents($file, $contents,FILE_APPEND);
//支付宝公钥,账户中心->密钥管理->开放平台密钥,找到添加了支付功能的应用,根据你的加密类型,查看支付宝公钥
$aop = new AopClient;
$aop->alipayrsaPublicKey = '填写你打的支付宝公钥';

//验证签名
$result = $aop->rsaCheckV1($_POST,null,$_POST['sign_type']);
file_put_contents($file, '验签结果:'.$result."\r\n",FILE_APPEND);
if($result==='TURE'){

    //1、签名验证通过后需做以下操作,所有操作全部判定成功后才视为支付成功。

    //1-1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;

    //1-2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);

    //1-3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);

    //1-4、验证app_id是否为该商户本身。

    //2、判断返回状态,并根据返回状态做相应处理,
    //2-1、状态TRADE_SUCCESS的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功;
    //2-2、状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。

    if( $trade_status == 'TRADE_FINISHED') {

        //处理更新订单状态等相关逻辑
        
        if($row){

            echo "success";
            
        }else{

            echo "fail";
            
        }
    }elseif ($trade_status  == 'TRADE_SUCCESS'){
       
        //处理更新订单状态等相关逻辑

        if($row){

            echo "success";

        }else{

            echo "fail";
          

        }
    }



    //程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);

}else{
    //验签失败
    echo 'fail';exit();
}

2-5、关于验签失败

验签失败的原因很多,这里不做说明,建议登录蚂蚁金服开发者社区搜问题或者提问,社区很活跃,一般1-3小时内就会有技术人员回复。贴一下我找到的验签文档,验签失败自查方案-支付宝接口常见错误系列

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/** *SDK调用说明 */ public function index() { //调用测试 import('AlipaySDK.Alipay'); $pay = new \Alipay(); /** * $trade_type 交易类型 app wap web */ $data = $pay->alipay('215360251411626', '0.01', '测试', '测试', 'web', 'http://www.test.com/callback'); //wap 结果string(880) "https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-php-20180705&app_id=2018072660781410&biz;_content={"body":"测试","subject":"测试","out_trade_no":"215360251411626","timeout_express":"90m","total_amount":"0.01","product_code":"QUICK_WAP_PAY"}&charset=UTF-8&format=json&method=alipay.trade.wap.pay&notify_url=http://www.test.com/callback&sign=RKPyAKAPv28GKfhWIdsCCOualcg2DMCbhpny6yw/tTvJ3Och+yIfS1au7zbGBnm5sFoX2enfgfZekTqBCyzK0/Irw01zDSAOJM4mPYxs96OUkOglWS5Zuq64JwQBAzesFvzKBGgsH2ecL8EUCclDbBIIrAT/DWr6KenyvQvXOxVQNwn540NoS754oBU0w9vLdrGj0Jljvn8D6cbDgnHiE8qLOgpaXv1ROLwtol0yj2H7cM/G7A9RM5Y8jV1aVNYWND8M4XAK5Wr8zwoa9RocbqDpYfw66NXSvrsuFpHf7MpWtSybH5TnxOP5kwzr7pJRDi0XRAyD9u1geei9thUsqA==&sign_type=RSA2&timestamp=2018-09-04+11:50:49&version=1.0" //app 结果直接返回客户端无需处理 alipay_sdk=alipay-sdk-php-20180705&app_id=2018072660781410&biz;_content={"body":"测试","subject":"测试","out_trade_no":"215360251411626","timeout_express":"90m","total_amount":"0.01","product_code":"QUICK_MSECURITY_PAY"}&charset=UTF-8&format=json&method=alipay.trade.app.pay¬ify_url=http://www.test.com/callback&sign_type=RSA2×tamp=2018-09-04+11:54:53&version=1.0&sign=Ab6a0lDxaNcWLL7XcETM85DbBrJI8Sj6czPGKBNK17MZ85FBeStKL+nA/Z4tMORC7H39ooVCDz9ILpbRUfU0eaE7Oe2MOz+Jsj7oUEqwvbvt7eebyPgy2PmPlfAwcZypKla0nUJwHOF5F0cL+mvMGk/K7f2PYMtWL/dIfPOQGC1hBoKFiS+ZF7jIJ98R0AaITAjvQ1drAmJqXpMzUCa1XsTCuQXMXYKu8DNGb/hooJu0xUH/qUU+4fKD0TmBYANQHIrKIBNFl6J2Gw504Mlcfh929ce+YdzF8DXQjacsBSp7f08UJ/FfRvhVXqAfX8lAFETGjc7FXGgU6simNgv1UQ== //web 结果 https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-php-20180705&app_id=2018072660781410&biz;_content={"body":"测试","subject":"测试","out_trade_no":"215360251411626","timeout_express":"90m","total_amount":"0.01","product_code":"FAST_INSTANT_TRADE_PAY"}&charset=UTF-8&format=json&method=alipay.trade.page.pay¬ify_url=http://www.test.com/callback&sign=l9+A5ZByhwLjQwzRes9+ymKkFVu7uMND4j6cIWmXIXHjrBnGaHkcr+hVkwocaU3d/hB2hdPnxDruhyYFgchnsIA/XWumosG9uEnKyD/T52+VZ8FxLh5wpwH0ucvKzbMjgIWk9dPVjUAU5Zz7QjqKsJ+AsItFpttd0tEVZD4je2PFp5mizeCWT0id0H+y44IGexN705rNe6TGpfJDG0RSDsbD/ZoCzd8FRzC9cv5uwf00J1E9Yc0bUH/l37WFDBTv/LZnqdfeWpaiu8ro7CJ3R+z/xGQTHToo2zLtEc4Cwop096X8WqwSdGbyI9FCemcFzigRB+6yzD9nS4PsWEG3Ug==&sign_type=RSA2×tamp=2018-09-04+11:56:06&version=1.0 echo $data; exit; } /** * 回调地址 */ public function callback() { import('AlipaySDK.Alipay'); $pay = new \Alipay(); $data = $_POST; $verify_result = $pay->check($data); if ($verify_result) { // 验证成功 $out_trade_no = $data['out_trade_no']; // 支付交易号 $trade_no = $data['trade_no']; // 交易状态 $trade_status = $data['trade_status']; if ($trade_status == 'TRADE_FINISHED') { //成功之后的操作 } else if ($trade_status == 'TRADE_SUCCESS') { //成功之后的操作 } echo "success"; // 请不要修改或删除 } else { // 验证失败 echo "fail"; } } 声明:是文档根据Alipay文档二次整合,完全开源。如果觉得还可以请点击收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值