加入收藏 | 设为首页 | 会员中心 | 我要投稿 信阳站长网 (https://www.0376zz.com.cn/)- 基础存储、混合云网络、云安全、数据仓库、大数据!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-07-15 11:21:48 所属栏目:PHP教程 来源:互联网
导读:下面小编就为大家分享一篇php 服务端集成支付宝APP支付实例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。 支付宝支付分为了很多种场景,这里只讲述支付宝APP支付功能集成,期间遇到了特别大的坑,因此我简单描述下集成过程,并概述遇
  下面小编就为大家分享一篇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 = CommPayAlipay::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,集成到自己应用也只是时间问题。

(编辑:信阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读