ThinkPHP 框架下支付宝支付

来源:互联网 发布:在淘宝卖宠物用品 编辑:程序博客网 时间:2024/06/06 07:49

背景

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

一.接入配置

1).接入步骤

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

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

2).配置截图

应用配置截图

3).提示说明

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

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

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

1).测试入口页面

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

2).html代码参考

需要注意的是,接口指明需要POST方式进行提交请求
入口界面参考截图

3).支付宝配置信息

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

//支付宝 支付配置    '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).支付接口实现

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

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

提示

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

无效签名报错
手机支付参考截图

代码实现如下:
    /**     * 支付宝支付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.5010.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’完全一致
  /**   * 支付宝支付通知功能   */    public function notify_ali(){        $out_trade_no = I('post.out_trade_no');        $this->toUpdatePayInfo($out_trade_no,'ali');        echo 'success';    }

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

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

1).支付接口实现

电脑端支付接口代码截图

提示:

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

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

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

2).实现效果截图

电脑端唤醒支付宝接口

手机扫码效果

电脑端支付方式-登录

3).代码实现如下:

 /**     * 电脑端唤醒 支付宝扫码支付接口     */    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;    }

附录:

  • 源代码下载>>>
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁小宝宝不爱吃饭怎么办 4个月小宝宝咳嗽怎么办 3个月小宝宝咳嗽怎么办 2个月小宝宝咳嗽怎么办 8的岁儿童腿不直怎么办 作业盒子选错年级怎么办 两岁x型腿怎么办 绿萝叶子有水滴怎么办 打游戏变菜了怎么办 车被记号笔画了怎么办 水溶性彩铅受潮了怎么办 马克笔颜色涂深了怎么办 染发膏染眉毛了怎么办 用电容笔画画手有触感怎么办 CAD画图线性数字不居中怎么办 3d立体画笔堵塞怎么办 龋齿树脂填充老化后怎么办 小孩补过的牙疼怎么办 颜料弄到墙纸上怎么办 4岁的宝宝不爱涂色怎么办 oppo手机截图存不到相册怎么办 做的ih5保存不了怎么办 小偷偷东西发现后逃跑了怎么办? 网上有人传迷信诅咒怎么办 颜料粘在衣服上怎么办 家里有小偷撬锁怎么办 在家有人在撬门怎么办 6个月的宝宝腹泻怎么办 六个月大的宝宝拉肚子怎么办 六个月宝宝着凉拉肚子怎么办 六个月婴儿着凉拉肚子怎么办 怀孕六个月着凉拉肚子怎么办 六个月的婴儿消化不好怎么办 六个月婴儿不好好吃奶怎么办 六个月婴儿消化不好怎么办 六个月婴儿肠胃不好怎么办 受了惊吓后睡眠不好怎么办 宝宝夏季吃饭不爱带围嘴怎么办 3岁宝宝爱看电视怎么办 新生儿晚上哭闹不睡觉怎么办 档案丢了怎么办失业证