iOS&Android集成支付宝-server篇(PHP)
在上一篇文章《iOS集成支付宝-Swift版》中,我介绍了如何在iOS中集成支付宝。在文章《手机App集成微信支付&支付宝-iOS&Android完整版》中,我介绍了整个支付流程,在App支付成功后返回后,服务器并不知道相关的订单已经支付成功。在用户付款成功后,支付宝会调用你的服务器Notify URL,告诉你支付成功了。所以服务端主要需要实现的工作就是验证签名以及验证是否是支付宝发来的通知。
整个验证过程的实验可以参考官方的demo相关代码,官方demo中有一个AlipayNotify类,里面的verifyNotify方法实现了验证过程。验证通过后,就可以做相应的业务逻辑的处理了。需要注意的是支付宝是用POST方式发送通知信息,因此该页面中获取参数的方式为$_POST['out_trade_no']形式。所有的参数说明请参考官方文档《服务器异步通知参数说明》。 所有这些参数中,我们最关心的就是如下几个:
out_trade_no : 商户网站唯一订单号(通常是你网站的订单ID)
trade_no: 支付宝交易号 (支付宝系统中的交易流水号,请记录到你的DB,以便以后对账)
trade_status:交易状态 (TRADE_SUCCESS 或者 TRADE_FINISHED 就表示支付成功)
获取到这些信息后就可以从自己系统DB里面通过out_trade_no查询出相应的订单,标记为支付成功,并记录下相应的交易流水号trade_no. 需要注意的是,处理玩业务逻辑后需要返回"success"给支付宝。实现代码如下:
$alipay_config_app = $this->config->item('alipay_config_app');
$alipayNotify = new AlipayNotify($alipay_config_app);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {//验证成功
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
$this->log_result('alipay_notify',"【支付宝回调App】:n".json_encode($_POST)."n");
if($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
$order = $this->order_model->get_order_info($out_trade_no);
if($order['TradeStatus'] != 'TRADE_FINISHED' && $order['TradeStatus'] != 'TRADE_SUCCESS'){
$data = array('TradeStatus'=>$trade_status,'TradeNo'=>$trade_no,'PayTime'=>time(),'PayType'=>'alipay');
$this->order_model->update_order_info($out_trade_no,$data);
}
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "success"; //请不要修改或删除
} else {
//验证失败
echo "fail";
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
完整的代码请移步Github下载。
Server端是基于CI框架实现的,如果你不熟悉的话也没有关系,下载demo后打开 /application/config/myconfig.php 文件,将数组 alipay_config 中的 partner,key,seller_email,替换成你自己的配置即可运行。
在本文章Demo实现过程中,我没有采用任何安全验证措施,在实际开放过程中Server端API是需要根据自身情况采取相应安全策略的。
网友评论