您的位置:首页 > 编程学习 > > 正文

thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

更多 时间:2022-03-31 00:04:09 类别:编程学习 浏览量:2814

thinkphp5对接支付宝扫码支付

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

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

背景

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

一.接入配置

1).接入步骤

根据中的流程,两者大同小异,都是进行:

  • 第一步:创建应用并获取appid
  • 第二步:配置密钥
  • 第三步:搭建和配置开发环境
  • 第四步:调用接口

2).配置截图

thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

3).提示说明

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

  • 应用创建成功后需要大概一到三天的审核
  • 配置密钥时建议下载其提供的加密工具,可参考rsa密钥生成方法
  • 此处我所下载的是开发平台服务端sdk中的php版资源,而非demo文件,相信两者还是有所区别的

     

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

1).测试入口页面

如下图所示,我在此创建了一个简单的入口文件,根据开发文档中的介绍是需要统一编码格式的,此处我选择的是utf-8
thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

2).html代码参考

需要注意的是,接口指明需要post方式进行提交请求
thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

3).支付宝配置信息

对于支付宝的配置信息,我写在 application/common/conf/config.php中

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • //支付宝 支付配置
  •   'ali_config' => array(
  •     'gatewayurl'      => 'https://openapi.alipay.com/gateway.do',//支付宝网关(固定)'
  •     'appid'         => '2017xxxxxxxx9',//appid即创建应用后生成
  •     //由开发者自己生成: 请填写开发者私钥去头去尾去回车,一行字符串
  •     'rsaprivatekey'     => 'miiexxxxxxxxxxxxxxxxxxxxxxxxxxxq',
  •     //支付宝公钥,由支付宝生成: 请填写支付宝公钥,一行字符串
  •     'alipayrsapublickey'  => 'iibxxxxxxxxxxxxxxxxxxxefaa',
  •     'notifyurl'       => 'http://www.xxx.com/m/cartpay/notify_ali', // 支付成功通知地址
  •     'returnurl'       => 'http://www.xxx.com', // 支付后跳转地址
  •     'returnpcurl'      => 'http://www.xxx.com/home', // pc端扫码支付后跳转地址
  •   ),
  • 4).服务端sdk导入

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

    5).支付接口实现

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

    thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

    提示

    • 通过实验发现,如果在电脑端进行此功能的支付测试,会报出如下的类似错误,个人认为源于手机和pc的内置配置不同
    • 对于手机网站支付需要在手机上测试,可自行配置虚拟域名手机访问即可,不要在此问题上花费不必要的时间
    • 因为本人就是在电脑有报错,手机端访问却能完美实现,从而走了验证签名的过程到最后却并非错在签名,当然也不排除你的操作过程签名一定是没问题的哦.

    thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)
    thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

    代码实现如下:
  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • /**
  •  * 支付宝支付post提交页面
  •  */
  • public function alipay(){
  •   if (is_post){
  •     vendor('alipay.aop.aopclient');
  •     vendor('alipay.aop.request.alipaytradewappayrequest');
  •     //$out_trade_no = i('post.order_sn');
  •     /*
  •      * $out_trade_no 为自己业务逻辑中要支付的订单号
  •      *   可从post数据中提取,具体安全起见可自行加密操作 此处仅举例测试数据
  •      * $order_amount 为要进行支付的金额 注意要用小数转换
  •      *   例如:3.50,10.00
  •      * $aliconfig 获取支付宝配置数据
  •      */
  •     $out_trade_no = '2017m'.time();
  •     $body = '欢迎购买商品,愿您购物愉快';
  •     $subject = '你好';
  •     $order_amount = 9.00;
  •     $aliconfig = c('ali_config');
  •     $aop = new \aopclient();
  •     $aop->gatewayurl = $aliconfig['gatewayurl'];
  •     $aop->appid = $aliconfig['appid'];
  •     $aop->rsaprivatekey = $aliconfig['rsaprivatekey'];
  •     $aop->alipayrsapublickey=$aliconfig['alipayrsapublickey'];
  •     $aop->apiversion = '1.0';
  •     $aop->postcharset='utf-8';
  •     $aop->format='json';
  •     $aop->signtype='rsa2';
  •     $request = new \alipaytradewappayrequest ();
  •     $bizcontent = "{" .
  •       "  \"body\":\"$body.\"," .
  •       "  \"subject\":\"$subject\"," .
  •       "  \"out_trade_no\":\"$out_trade_no\"," .
  •       "  \"timeout_express\":\"90m\"," .
  •       "  \"total_amount\":$order_amount," .
  •       "  \"product_code\":\"quick_wap_way\"" .
  •       " }";
  •     $request->setbizcontent($bizcontent);
  •     $request->setnotifyurl($aliconfig['notifyurl']);
  •     $request->setreturnurl($aliconfig['returnurl']);
  •     $result = $aop->pageexecute ( $request);
  •     echo $result;
  •   }else{
  •     echo 'sorry,非法请求失败';
  •   }
  • }
  • 6).支付成功后的通知处理

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

    • 接口文档中有点明,支付通知功能最后需要输出‘success'
    • 此处的通知路径要与配置中确定的 ‘notifyurl'完全一致
  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • /**
  •  * 支付宝支付通知功能
  •  */
  •  public function notify_ali(){
  •    $out_trade_no = i('post.out_trade_no');
  •    $this->toupdatepayinfo($out_trade_no,'ali');
  •    echo 'success';
  •  }
  • 三.电脑网站支付接口实现

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

    1).支付接口实现

    thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

    提示:

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

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

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

    2).实现效果截图

    thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

    thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

    thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)

    3).代码实现如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • /**
  •   * 电脑端唤醒 支付宝扫码支付接口
  •   */
  •  public function alipaypage(){
  •    $out_trade_no = '2017pc'.time();
  •    $order_amount = '12.88';
  •    $proname = "真米黑米 xxxxxx";
  •    vendor('alipay.aop.aopclient');
  •    vendor('alipay.aop.request.alipaytradepagepayrequest');
  •    //构造参数
  •    $aop = new \aopclient();
  •    $aliconfig = c('ali_config');
  •    $aop->gatewayurl = $aliconfig['gatewayurl'];
  •    $aop->appid = $aliconfig['appid'];
  •    $aop->rsaprivatekey = $aliconfig['rsaprivatekey'];
  •  
  •    $aop->apiversion = '1.0';
  •    $aop->signtype = 'rsa2';
  •    $aop->postcharset= 'utf-8';
  •    $aop->format='json';
  •    $request = new \alipaytradepagepayrequest ();
  •    $request->setreturnurl($aliconfig['returnpcurl']);
  •    $request->setnotifyurl($aliconfig['notifyurl']);
  •    $request->setbizcontent(
  •      "{" .
  •      "  \"product_code\":\"fast_instant_trade_pay\"," .
  •      "  \"subject\":\"$proname\"," .
  •      "  \"out_trade_no\":\"$out_trade_no\"," .
  •      "  \"total_amount\":$order_amount," .
  •      "  \"body\":\"iphone6 16g\"" .
  •      " }");
  •    //请求
  •    $result = $aop->pageexecute ($request);
  •    //输出
  •    echo $result;
  •  }
  • 附录:

    源代码下载>>>

    希望本文所述对大家基于thinkphp框架的php程序设计有所帮助。

    原文链接:https://blog.csdn.net/u011415782/article/details/74747805

    您可能感兴趣