php 服务端集成支付宝APP支付实例

 更新时间:2018年03月21日 10:49:11   作者:lvfk  
下面小编就为大家分享一篇php 服务端集成支付宝APP支付实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

支付宝支付分为了很多种场景,这里只讲述支付宝APP支付功能集成,期间遇到了特别大的坑,因此我简单描述下集成过程,并概述遇到的问题及解决方案

由于公司业务简单,只支持支付宝支付,而无需关心退款,查询等等额外功能,因此该篇内容仅仅讲述支付宝支付接口时服务端如何准备APP拉取支付订单的信息,大概流程如下

一、创建应用及配置

首先,需要到蚂蚁金服开发平台(open.alipay.com)注册应用,并获取应用ID,并配置应用,这里在配置时主要是签约,生成应用的RSA2公私钥,同时获取到支付宝提供的支付公钥等,这部分官网后台都有提示,比较简单

二、下载对应SDK

这里我是在PHP后台集成服务,因此下载的是PHP SDK,地址:https://docs.open.alipay.com/54/103419/

三、准备一个可以访问的真实域名

四、案例

当以上三部完成之后,此时就可以进入配置我们自己的业务代码了

4.1、组织APP支付时的支付订单信息

<?php

require_once (__DIR__.'/alipay-sdk-PHP-20171023143822/AopSdk.php');

class Alipay
{
 /**
 * 应用ID
 */
 const APPID = '你的应用ID';
 /**
 *请填写开发者私钥去头去尾去回车,一行字符串
 */
 const RSA_PRIVATE_KEY = '应用对应开发者私钥';
 /**
 *请填写支付宝公钥,一行字符串
 */
 const ALIPAY_RSA_PUBLIC_KEY = '支付宝提供的公钥';
 /**
 * 支付宝服务器主动通知商户服务器里指定的页面
 * @var string
 */
 private $callback = "http://www.test.com/notify/alipay_notify.php";

 /**
 *生成APP支付订单信息
 * @param string $orderId 商品订单ID
 * @param string $subject 支付商品的标题
 * @param string $body 支付商品描述
 * @param float $pre_price 商品总支付金额
 * @param int $expire 支付交易时间
 * @return bool|string 返回支付宝签名后订单信息,否则返回false
 */
 public function unifiedorder($orderId, $subject,$body,$pre_price,$expire){
 try{
  $aop = new \AopClient();
  $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
  $aop->appId = self::APPID;
  $aop->rsaPrivateKey = self::RSA_PRIVATE_KEY;
  $aop->format = "json";
  $aop->charset = "UTF-8";
  $aop->signType = "RSA2";
  $aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;
  //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
  $request = new \AlipayTradeAppPayRequest();
  //SDK已经封装掉了公共参数,这里只需要传入业务参数
  $bizcontent = "{\"body\":\"{$body}\"," //支付商品描述
  . "\"subject\":\"{$subject}\"," //支付商品的标题
  . "\"out_trade_no\":\"{$orderId}\"," //商户网站唯一订单号
  . "\"timeout_express\":\"{$expire}m\"," //该笔订单允许的最晚付款时间,逾期将关闭交易
  . "\"total_amount\":\"{$pre_price}\"," //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  . "\"product_code\":\"QUICK_MSECURITY_PAY\""
  . "}";
  $request->setNotifyUrl($this->callback);
  $request->setBizContent($bizcontent);
  //这里和普通的接口调用不同,使用的是sdkExecute
  $response = $aop->sdkExecute($request);
  //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
  return htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
 }catch (\Exception $e){
  return false;
 }

 }
}

4.2、支付宝支付成功之后异步回调处理

<?php
/**
 * alipay_notify.php.
 * User: lvfk
 * Date: 2017/10/26 0026
 * Time: 13:48
 * Desc: 支付宝支付成功异步通知
 */
include_once (__DIR__.'/../alipay-sdk-PHP-20171023143822/AopSdk.php');

//验证签名
$aop = new \AopClient();
$aop->alipayrsaPublicKey = \Comm\Pay\Alipay::ALIPAY_RSA_PUBLIC_KEY;
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");

//验签
if($flag){
 //处理业务,并从$_POST中提取需要的参数内容
 if($_POST['trade_status'] == 'TRADE_SUCCESS'
 || $_POST['trade_status'] == 'TRADE_FINISHED'){//处理交易完成或者支付成功的通知
 //获取订单号
 $orderId = $_POST['out_trade_no'];
 //交易号
 $trade_no = $_POST['trade_no'];
 //订单支付时间
 $gmt_payment = $_POST['gmt_payment'];
 //转换为时间戳
 $gtime = strtotime($gmt_payment);

 //此处编写回调处理逻辑

		//处理成功一定要返回 success 这7个字符组成的字符串,
		//die('success');//响应success表示业务处理成功,告知支付宝无需在异步通知
 
 }
}

五、遇到的问题

5.1、一直报错40001=>isv.invalid-signature

为了搞清楚原因,先后多次重新生成应用的RSA2公私密钥,发现都没有作用。最后结合网上资料,才发现,原来是支付宝回调地址notifyUrl不能有 '?' 以及 ?后面加参数

5.2、支付宝异步通知成功了,但是$_POST为空

这个也花费了一点时间查找,开始做的时候就是遵照支付宝的建议使用HTTS方式请求。但这样应用后台一直通知没有参数内容。最后才想起来由于我们的应用使用了HTTS双向认证,这个原因导致支付宝的服务器回调的参数为空。最后,把回调地址改为了HTTP方式,验证通过

通过遇到的问题,首先查看支付宝的文档描述以及支付宝提供的错误码解释,实在不行就百度或者谷歌,再加上自己不断测试验证,最终一定可以解决问题

至此,支付宝APP支付这块功能完成,其他的APP退款、对账单等等功能就没继续做,不过按照支付宝官网文档以及支付宝提供的SDK,集成到自己应用也只是时间问题。

以上这篇php 服务端集成支付宝APP支付实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • codeigniter集成ucenter1.6双向通信的解决办法

    codeigniter集成ucenter1.6双向通信的解决办法

    用codeigniter开发一个子网站,之后想和原来的论坛进行同步,包括同步登陆和双向通信。这篇文章主要介绍了codeigniter集成ucenter1.6双向通信的解决办法,需要的朋友可以参考下
    2014-06-06
  • 又一个PHP实现的冒泡排序算法分享

    又一个PHP实现的冒泡排序算法分享

    这篇文章主要介绍了又一个PHP实现的冒泡排序算法分享,标题中的又一个是指本站已经有好几篇冒泡排序算法的文章了,如果这个没有满足你的要求,请看相关文章里的其他实现方法吧,需要的朋友可以参考下
    2014-08-08
  • PHP并发查询MySQL的实例代码

    PHP并发查询MySQL的实例代码

    本篇文章主要介绍了PHP并发查询MySQL的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • PHP使用Memcache时模拟命名空间及缓存失效问题的解决

    PHP使用Memcache时模拟命名空间及缓存失效问题的解决

    这篇文章主要介绍了PHP使用Memcache时模拟命名空间及缓存失效问题的解决,这里谈到的缓存失效主要针对高并发场景下取不到缓存的情况,需要的朋友可以参考下
    2016-02-02
  • PHP7.3.10编译安装教程

    PHP7.3.10编译安装教程

    这篇文章主要介绍了PHP7.3.10编译安装教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • ThinkPHP基本的增删查改操作实例教程

    ThinkPHP基本的增删查改操作实例教程

    这篇文章主要介绍了ThinkPHP基本的增删查改操作,在ThinkPHP程序设计中有着非常广泛的应用,需要的朋友可以参考下
    2014-08-08
  • YII使用url组件美化管理的方法

    YII使用url组件美化管理的方法

    这篇文章主要介绍了YII使用url组件美化管理的方法,结合实例形式较为详细的分析了urlManager组件的具体功能及相关使用技巧,需要的朋友可以参考下
    2015-12-12
  • Yii统计不同类型邮箱数量的方法

    Yii统计不同类型邮箱数量的方法

    这篇文章主要介绍了Yii统计不同类型邮箱数量的方法,涉及Yii数据库查询及字符串的遍历、截取与判断相关操作技巧,需要的朋友可以参考下
    2016-10-10
  • YII2 全局异常处理深入讲解

    YII2 全局异常处理深入讲解

    这篇文章主要介绍了YII2 全局异常处理深入讲解,文中列举了异常处理的实例,有感兴趣的同学可以学习下
    2021-03-03
  • php app支付宝回调(异步通知)详解

    php app支付宝回调(异步通知)详解

    这篇文章主要为大家详细介绍了php app支付宝回调的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论