当前位置:首页 > CMS教程 > Thinkphp > 列表

ThinkPHP框架下整合支付宝支付功能图文教程

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-15 21:18:52 浏览: 评论:0 

这篇文章主要介绍了ThinkPHP框架下整合支付宝支付功能,结合图文形式详细分析了thinkPHP框架整合支付宝支付功能接口相关配置方法、操作技巧与相关注意事项,需要的朋友可以参考下。

本文实例讲述了ThinkPHP框架下整合支付宝支付功能,分享给大家供大家参考,具体如下:

背景

近期项目需要接入支付宝支付功能,其中开发使用了ThinkPHP3.2.3框架,通过参考开发平台文档可以知道,网站开发有两种场景,一种是手机网站支付,直接唤醒支付宝app进入支付操作;另一种多是 PC 端显示支付二维码的形式,然后使用手机的支付宝app扫描。

此处主要介绍手机网站支付的实现,后期补充扫码支付。

一.接入配置

1).接入步骤

根据“快速接入”中的流程,两者大同小异,都是进行:

第一步:创建应用并获取APPID

第二步:配置密钥

第三步:搭建和配置开发环境

第四步:调用接口

2).配置截图

ThinkPHP支付宝支付

应用配置截图

3).提示说明

虽然官方文档已经做的很详细、成熟,不过还是有几点需要着重提醒一下,以免不必要的纠结。

应用创建成功后需要大概一到三天的审核

配置密钥时建议下载其提供的加密工具,可参考RSA密钥生成方法

此处我所下载的是开发平台服务端SDK中的PHP版资源,而非DEMO文件,相信两者还是有所区别的

二.手机网站支付接口实现

1).测试入口页面

如下图所示,我在此创建了一个简单的入口文件,根据开发文档中的介绍是需要统一编码格式的,此处我选择的是UTF-8

ThinkPHP支付宝支付

代码参考-header处理

2).html代码参考

需要注意的是,接口指明需要POST方式进行提交请求

ThinkPHP支付宝支付

入口界面参考截图

3).支付宝配置信息

对于支付宝的配置信息,我写在 Application/Common/Conf/config.php中

  1. //支付宝 支付配置 
  2.   'ALI_CONFIG' => array
  3.     'gatewayUrl'      => 'https://openapi.alipay.com/gateway.do',//支付宝网关(固定)' 
  4.     'appId'         => '2017xxxxxxxx9',//APPID即创建应用后生成 
  5.     //由开发者自己生成: 请填写开发者私钥去头去尾去回车,一行字符串 
  6.     'rsaPrivateKey'     => 'MIIExxxxxxxxxxxxxxxxxxxxxxxxxxxq'
  7.     //支付宝公钥,由支付宝生成: 请填写支付宝公钥,一行字符串 
  8.     'alipayrsaPublicKey'  => 'IIBxxxxxxxxxxxxxxxxxxxEFAA'
  9.     'notifyUrl'       => 'http://www.xxx.com/m/cartpay/notify_ali', // 支付成功通知地址 
  10.     'returnUrl'       => 'http://www.xxx.com', // 支付后跳转地址 
  11.     'returnPcUrl'      => 'http://www.xxx.com/Home', // PC端扫码支付后跳转地址 
  12.   ), 

4).服务端SDK导入

将前面所下载的SDK放入自定义的位置,在此,我习惯放在如下的路径中,…\ThinkPHP\Library\Vendor\Alipay,特别提醒一点,对于各文件类的引用会依据代码框架而不同,需要自行确认。

5).支付接口实现

在请求唤醒支付宝支付的路径中进行接口代码的编辑

ThinkPHP支付宝支付

代码参考-手机端支付接口

提示

通过实验发现,如果在电脑端进行此功能的支付测试,会报出如下的类似错误,个人认为源于手机和PC的内置配置不同

对于手机网站支付需要在手机上测试,可自行配置虚拟域名手机访问即可,不要在此问题上花费不必要的时间

因为本人就是在电脑有报错,手机端访问却能完美实现,从而走了验证签名的过程到最后却并非错在签名,当然也不排除你的操作过程签名一定是没问题的哦.

ThinkPHP支付宝支付

无效签名报错

ThinkPHP支付宝支付

手机支付参考截图

代码实现如下:

  1. /** 
  2.  * 支付宝支付post提交页面 
  3.  */ 
  4. public function alipay(){ 
  5.   if (IS_POST){ 
  6.     Vendor('Alipay.aop.AopClient'); 
  7.     Vendor('Alipay.aop.request.AlipayTradeWapPayRequest'); 
  8.     //$out_trade_no = I('post.order_sn'); 
  9.     /* 
  10.      * $out_trade_no 为自己业务逻辑中要支付的订单号 
  11.      *   可从POST数据中提取,具体安全起见可自行加密操作 此处仅举例测试数据 
  12.      * $order_amount 为要进行支付的金额 注意要用小数转换 
  13.      *   例如:3.50,10.00 
  14.      * $aliConfig 获取支付宝配置数据 
  15.      */ 
  16.     $out_trade_no = '2017M'.time(); 
  17.     $body = '欢迎购买商品,愿您购物愉快'
  18.     $subject = '你好'
  19.     $order_amount = 9.00; 
  20.     $aliConfig = C('ALI_CONFIG'); 
  21.     $aop = new \AopClient(); 
  22.     $aop->gatewayUrl = $aliConfig['gatewayUrl']; 
  23.     $aop->appId = $aliConfig['appId']; 
  24.     $aop->rsaPrivateKey = $aliConfig['rsaPrivateKey']; 
  25.     $aop->alipayrsaPublicKey=$aliConfig['alipayrsaPublicKey']; 
  26.     $aop->apiVersion = '1.0'
  27.     $aop->postCharset='UTF-8'
  28.     $aop->format='json'
  29.     $aop->signType='RSA2'
  30.     $request = new \AlipayTradeWapPayRequest (); 
  31.     $bizContent = "{" . 
  32.       "  \"body\":\"$body.\"," . 
  33.       "  \"subject\":\"$subject\"," . 
  34.       "  \"out_trade_no\":\"$out_trade_no\"," . 
  35.       "  \"timeout_express\":\"90m\"," . 
  36.       "  \"total_amount\":$order_amount," . 
  37.       "  \"product_code\":\"QUICK_WAP_WAY\"" . 
  38.       " }"
  39.     $request->setBizContent($bizContent); 
  40.     $request->setNotifyUrl($aliConfig['notifyUrl']); 
  41.     $request->setReturnUrl($aliConfig['returnUrl']); 
  42.     $result = $aop->pageExecute ( $request); 
  43.     echo $result
  44.   }else
  45.     echo 'sorry,非法请求失败'
  46.   } 

6).支付成功后的通知处理

此时,通过获取所提交过来的post数据,进行订单号的剥离,从而进行下一步的业务逻辑处理即可.

[注意]:

接口文档中有点明,支付通知功能最后需要输出‘success'

此处的通知路径要与配置中确定的 ‘notifyUrl'完全一致

  1. /** 
  2.  * 支付宝支付通知功能 
  3.  */ 
  4.  public function notify_ali(){ 
  5.    $out_trade_no = I('post.out_trade_no'); 
  6.    $this->toUpdatePayInfo($out_trade_no,'ali'); 
  7.    echo 'success'
  8.  } 

三.电脑网站支付接口实现

对比来看,其实 PC 端的代码设计与手机端大同小异,在此点明一下使用情景,可进行参考。

1).支付接口实现

ThinkPHP支付宝支付

电脑端支付接口代码截图

提示:测试发现,接口中定义“subject”时,对于文字的数目有要求,不能超过四个字,至于字母似乎没有特别限制,开发过程中原想显示全部的商品名称却无法实现,还请注意。

提供的代码暂时未进行界面的设计,可参考 手机端接口思想,接收并处理订单信息后再唤醒支付宝,当前的代码可以在公共文件配置正确的情况下,直接公网访问接口链接即可展示效果。

支付成功后的通知处理,请参考手机端实现方式.

2).实现效果截图

ThinkPHP支付宝支付

电脑端唤醒支付宝接口

ThinkPHP支付宝支付

手机扫码效果

ThinkPHP支付宝支付

电脑端支付方式-登录

3).代码实现如下:

  1. /** 
  2.   * 电脑端唤醒 支付宝扫码支付接口 
  3.   */ 
  4.  public function aliPayPage(){ 
  5.    $out_trade_no = '2017PC'.time(); 
  6.    $order_amount = '12.88'
  7.    $proName = "真米黑米 XXXXXX"
  8.    Vendor('Alipay.aop.AopClient'); 
  9.    Vendor('Alipay.aop.request.AlipayTradePagePayRequest'); 
  10.    //构造参数 
  11.    $aop = new \AopClient(); 
  12.    $aliConfig = C('ALI_CONFIG'); 
  13.    $aop->gatewayUrl = $aliConfig['gatewayUrl']; 
  14.    $aop->appId = $aliConfig['appId']; 
  15.    $aop->rsaPrivateKey = $aliConfig['rsaPrivateKey']; 
  16.  
  17.    $aop->apiVersion = '1.0'
  18.    $aop->signType = 'RSA2'
  19.    $aop->postCharset= 'utf-8'
  20.    $aop->format='json'
  21.    $request = new \AlipayTradePagePayRequest (); 
  22.    $request->setReturnUrl($aliConfig['returnPcUrl']); 
  23.    $request->setNotifyUrl($aliConfig['notifyUrl']); 
  24.    $request->setBizContent( 
  25.      "{" . 
  26.      "  \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," . 
  27.      "  \"subject\":\"$proName\"," . 
  28.      "  \"out_trade_no\":\"$out_trade_no\"," . 
  29.      "  \"total_amount\":$order_amount," . 
  30.      "  \"body\":\"Iphone6 16G\"" . 
  31.      " }"); 
  32.    //请求 
  33.    $result = $aop->pageExecute ($request); 
  34.    //输出 
  35.    echo $result
  36.  }

Tags: ThinkPHP支付宝支付

分享到: