Thinkphp8接入alipay sdk使用pc网站支付

官网下载php版本的alipay-php-demo

  1. 解压后复制文件夹中的aop文件包,粘贴到tp8/extend目录下,并修改目录名为alipay_aop;。
  2. 修改alipay_aop目录下AopClient.php文件,在第一行加入命名空间:namespace alipay_aop;
<?php
namespace alipay_aop;
require_once 'AopEncrypt.php';
class AopClient {
  ......
}
  1. 修改alipay_aop/request/目录下AlipayTradePagePayRequest.php文件,加入命名空间:alipay_aop\request;
<?php
namespace alipay_aop\request;
/**
 * ALIPAY API: alipay.trade.page.pay request
 *
 * @author auto create
 * @since 1.0, 2017-04-06 15:55:36
 */
class AlipayTradePagePayRequest
{
    /** 
     * 统一收单下单并支付页面接口
     **/
  ......
}

使用

  1. tp8/app/model目录下新建AlipayModel.php文件
<?php
namespace app\model;
use alipay_aop\AopClient;
use alipay_aop\request\AlipayTradePagePayRequest;

class AlipayModel {
    //应用ID,APPID。
    // private $appId = "";
    //商户私钥
    // private $merchantPrivateKey = "";
    //异步通知地址
    private $notifyUrl = "https://api.mydomain.com/notify.html";
    //同步跳转
    private $returnUrl = "https://api.mydomain.com/returns.html";
    //编码格式
    private $charset = "UTF-8";
    //签名方式
    private $signType = "RSA2";
    //支付宝网关
    private $gatewayUrl = "https://openapi.alipay.com/gateway.do";
    // 支付宝公钥,
    private $alipayPublicKey = "MIIBIjANBgkqhkiG9w0lnUw2TTjDFwj3D1Qk3iSKUAZg9CTcQB129+5DRlLkzEfWyffnUkUtA4VYLS8r6ycvG0iYHd6tN4muXg0b6029iaWzjuR9meJ079KIKAqQkSdfCESBJMSsVp62a7gVbIwXILDn3P6jGaiuA8317yCCd0bhEw9JeKLGmlQOaBUwIDAQAB";
    //开启AES加密后密钥
    // private $encryptKey = "";

    // 电脑网站支付下单
    public function webPagePay($data, $channelConfig) {
        //商户订单号,商户网站订单系统中唯一订单号,必填
        $out_trade_no = trim($data['platform_order_no']);

        //订单名称,必填
        $subject = trim($data['subject']);

        //付款金额,必填
        $total_amount = trim($data['amount']);

        //商品描述,可空
        $body = trim($data['remark']);

        /** PHP 语言 普通公钥签名
         *  $aop = new AopClient;
        $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
        $aop->appId = "app_id";
        $aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串';
        $aop->format = "json";
        $aop->charset = "UTF-8";
        $aop->signType = "RSA2";
        $aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串';
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        $request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数
        $request->setBizContent("{\"body\":\"我是测试数据\","
        . "\"subject\": \"App支付测试\","
        . "\"out_trade_no\": \"20170125test01\","
        . "\"timeout_express\": \"30m\","
        . "\"total_amount\": \"0.01\","
        . "\"product_code\":\"QUICK_MSECURITY_PAY\""
        . "}");
        $request->setNotifyUrl("商户外网可以访问的异步地址");
        //这里和普通的接口调用不同,使用的是sdkExecute
        $response = $aop->sdkExecute($request);
        //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
        echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
         *
         *
         */
        $aop = new AopClient();
        $aop->gatewayUrl = $channelConfig['gateway'];
        $aop->appId = $channelConfig['appid'];
        $aop->format = "json";
        $aop->charset = $this->charset;
        $aop->signType = $this->signType;
        $aop->encryptKey = $channelConfig['encryptKey'];
        $aop->alipayrsaPublicKey = $channelConfig['providerPublicKey'];
        $aop->rsaPrivateKey = $channelConfig['merchantPrivateKey'];

        $biz_content = json_encode([
            'out_trade_no' => $out_trade_no,
            'product_code' => 'FAST_INSTANT_TRADE_PAY', // 固定值
            'total_amount' => $total_amount,
            'subject' => $subject,
            'timeout_express' => '120m',
            // 'qr_pay_mode'    => '0',
        ]);
        // 判断是否需要内容aes加密
        $needEncrypt = empty(trim($channelConfig['encryptKey'])) ? false : true;

        $payRequest = new AlipayTradePagePayRequest();
        $payRequest->setReturnUrl($this->returnUrl);
        $payRequest->setNotifyUrl($this->notifyUrl);
        $payRequest->setNeedEncrypt($needEncrypt);
        // $payRequest->setQrPayMode('0');
        $payRequest->setBizContent($biz_content);
        $response = $aop->sdkExecute($payRequest);

        return $channelConfig['gateway'] . '?' . $response;
        // echo('<a href="https://openapi.alipay.com/gateway.do?'.$response.'">');
    }

    // 查询接口
    public function query() {
          ......
    }
    /**
     * 验签方法
     * @param $arr 验签支付宝返回的信息,使用支付宝公钥。
     * @return boolean
     */
    function checkSign($data) {
        /** 异步同步通知数据验签
         *  $aop = new AopClient ();
        //编码格式
        $aop->postCharset="UTF-8";
        //支付宝公钥赋值
        $aop->alipayrsaPublicKey="";
        //回调的待验签字符串
        $_POST="buyer_id=20880****42&total_amount=0.01&body=煜雨电脑网站测试&trade_no=2019032922001481941025940236&notify_time=2019-03-29 19:42:04&subject=煜雨测试电脑网站支付&sign_type=RSA2&charset=UTF-8&auth_app_id=201****22&notify_type=trade_status_sync&invoice_amount=0.01&out_trade_no=20190329ygyg45484544100003&trade_status=TRADE_SUCCESS&gmt_payment=2019-03-29 19:42:03&version=1.0&point_amount=0.00&sign=LDDUIGQmc+1qNtk3oyoAKVeMUKTngdX3ZjVeZOK0EjiPDJ/+Nk+0WSqcE6J7/5xb96Z/vP0yY3pVhZUiFVJ1G45/ys/HAleHh+EERZ1lkCkule1sSyaGFTKQGKx4uHpTyqIgRB1bouf19RPbSx1EkA0VkCarSy9G/OEG5Qmg8UdL2dRulMhlbOHS7tdMJJycDA8vOspOUMeQmk/H6IK9R2Kou5hN2T3KR1GWLYFK+z1jeZhQB3q52lZynO0OFjSzU4aQUBMW5QskQppBYd/ghtY/2YP+2H6YVGNgVmaheZMQ3PVTBALEV+8rZa91salH9DkKN2UCYGvNSNDT1VGCTQ==&gmt_create=2019-03-29 19:42:00&buyer_pay_amount=0.01&receipt_amount=0.01&fund_bill_list=[{\"amount\":\"0.01\",\"fundChannel\":\"PCREDIT\"}]&seller_id=208850*0**&app_id=20141****2&notify_id=2019032900222194204081941005192208";
        //签名方式
        $sign_type="RSA2";
        //把字符串通过&符号拆分成数组
        $data = explode('&', $_POST);
        $params = array();
        //遍历数组
        foreach ($data as $param) {
        $item = explode('=', $param,"2");
        $params[$item[0]] = $item[1];
        }
        //输出拆分后的数据
        //print_r($params);
        //验签代码
        $flag = $aop->rsaCheckV1($params, null, $sign_type);
        //输出验签结果
        //echo $flag;
        if ($flag)
        {
        echo "success";
        }
        else
        {
        echo "fail";
        }
         *
         *
         */
        $aop = new AopClient();
        $aop->postCharset = $this->charset;
        $aop->signType = $this->signType;
        $aop->alipayrsaPublicKey = $this->alipayPublicKey;
        //验签代码
        $flag = $aop->rsaCheckV1($data, null, $this->signType);
        // var_dump($flag);
        return $flag;
    }
}
  1. 调用
$alipayModel = new AlipayModel();
// 这里是向支付宝提交平台订单号
$data['platform_order_no'] = $orderNo;
// 读取商户通道配置文件
$config = [
    'appid' => $hasChannel['appid'],
    'gateway' => $hasChannel['gateway'],
    'merchantPrivateKey' => $hasChannel['private_key'],
    'providerPublicKey' => $hasChannel['provider_public_key'],
    'encryptKey' => $hasChannel['encrypt_key'],
];
$returnPayLink = $alipayModel->webPagePay($data, $config);
  1. 接收支付宝异步通知时验证签名:
<?php
namespace app\controller;

use app\model\AlipayModel;
// 这里一定要加入header设置,否则支付宝收到的返回值可能会在success或fail前加入一个空格,导致支付宝会多次回调
header('Content-Type: text/plain; charset=utf-8');
class Notify{
  public function Index(){
    $data = $_POST;
    // 写入日志
    $this->debugModel->writeLog(var_export($_POST, true));
    // 验证支付宝接口签名
    $alipayModel = new AlipayModel();
    $result = $alipayModel->checkSign($data);
    if ($result) {
      echo "success";
    }else{
      echo "fail";
    }
  }
}

一定要加入header设置,否则支付宝收到的返回值可能会在success或fail前加入一个空格,导致支付宝会多次回调

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容