支付宝支付(APP支付)

1,申请流程

首先必须通知客户先申请支付宝商家账号,然后认证。地址:https://open.alipay.com/platform/home.htm

[图片上传失败...(image-a11c37-1595316808224)]

这里都是需要客户操作的,客户点击支付接入后,会有个认证签约页面,签约完之后,会生成应用唯一标识(APPID)。应用创建完成后,系统会自动跳转到应用详情页面。然后可以点击 添加功能 来添加App支付功能。添加功能完后,我的应用列表就会显示添加的应用,即支付宝App支付。这一步我们只需要等待客户申请就好,什么也不用做。详细流程参加支付宝官方文档:https://docs.open.alipay.com/... 这里面唯一需要开发者做的就是生成密钥这一步。

2,支付宝配置

[图片上传失败...(image-904263-1595316808224)]
说明:

接口加签方式 详细操作见第三步

IP白名单 安全性考虑,添加上IP地址

其他的可以不用设置

3,公钥密钥生成

具体教程官网都有,简单的说明一下,上传应用公钥去并获取支付宝公钥。https://docs.open.alipay.com/291/105972

4,SDK开发者后台接入

在开始后台代码前,我们必须有3个参数,开发者私钥支付宝公钥APPID。 这里的开发者私钥也叫应用私钥。没有这3个参数,就没法唤起支付宝支付接口!!!

准备好后可以下载支付宝的官方demo代码参考。https://docs.open.alipay.com/54/106370

[图片上传失败...(image-90354-1595316808224)]

5,核心步骤代码(支付宝APP支付)

说明:参数定义

    const APPID = '2021******';
    //开发者私钥去头去尾去回车,一行字符串
    const RSA_PRIVATE_KEY = 'MIIEpQIBAA*******';
    //支付宝公钥(上传开发者公钥(又叫应用公钥)后才能生成)
    const ALIPAY_RSA_PUBLIC_KEY = 'MIIBIjABAA*******;

说明:前端调用的方法

    /**
     *支付方法,调用支付宝接口成功后,会返回给前端一个长串的参数字符串。前端利用它唤起支付宝
     */
    public function paytoOffi()
    {
        // 这里接收前端的参数
        // 数据库生成订单
        // 下边是模拟的数据(订单号、主题、金额、备注)
        $out_trade_no = time();
        $subject = time();
        $total_amount = 1;
        $body = '备注';
        
        $res = $this->getAlipayMsg($body,$subject,$out_trade_no,$total_amount);
        return $res;    //必须是json格式
    }

说明:getAlipayMsg方法

    /**
     * 调用支付宝接口方法
     * @method
     * @param $body 订单描述
     * @param $subject  订单标题
     * @param $out_trade_no 订单号
     * @param $amount  价格
     */
    private function getAlipayMsg($body, $subject, $out_trade_no, $amount)
    {
        vendor('alipay.aop.AopClient');
        vendor('alipay.aop.request.AlipayTradeAppPayRequest');

        $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\":\"{$out_trade_no}\","//商户网站唯一订单号
            . "\"timeout_express\":\"60m\","//该笔订单允许的最晚付款时间,逾期将关闭交易
            . "\"total_amount\":\"{$amount}\","//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
            . "\"product_code\":\"QUICK_MSECURITY_PAY\""
            . "}";

        $request->setNotifyUrl('http://text.baidu.com/api/Alipay/notify');//你自己的异步地址,必须写全,而且不能有参数
        $request->setBizContent($bizcontent);
        //这里和普通的接口调用不同,使用的是sdkExecute
        $response = $aop->sdkExecute($request);
        file_put_contents('d.txt',json_encode($response),FILE_APPEND);  //写入txt支付宝的返回数据
        return $response;
    }

说明:异步回调方法

    /**
     * 用户消费异步通知服务器方法
     */
    public function notify()
    {
        $arr = $_POST;
        file_put_contents('d.txt',json_encode($arr),FILE_APPEND);   //写入txt支付宝的返回数据
        //验证签名
        $aop = new \AopClient();
        $aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;
        $flag = $aop->rsaCheckV1($arr, null, "RSA2");

        if ($flag) {
            // 商户订单号
            $out_trade_no = $arr['out_trade_no'];
            // 支付宝交易号
            $trade_no = $arr['trade_no'];
            // 交易状态
            $trade_status = $arr['trade_status'];
            // 交易金额
            $total_amount = $arr['total_amount'];

            if ($arr['trade_status'] == 'TRADE_SUCCESS'
                || $arr['trade_status'] == 'TRADE_FINISHED') { //处理交易完成或者支付成功的通知
                //自己的业务逻辑,比如修改订单为已支付

                die('success');
                //必须有这句,echo 'success'也可以,否则支付宝会以为支付没成功,而在一天内连续调用异步接口,容易出错
            }
        }
    }

6,踩过的坑

  • 首先前台调支付接口paytoOffi,然后这个方法就会调getAlipayMsg方法,即调支付宝接口的方法,这4个参数描述、标题、订单号、价格后3个是必填的。描述可以不填,这个酌情修改。然后调接口,支付宝会返回请求字符串,即唤起支付宝软件的一长串字符串,这里有个大坑,官方文档上说直接echo 给前台就行,但其实应该转成json格式返给前台,否则会报100XX错误,即参数格式不正确。下面是官方的坑教程截图:

[图片上传失败...(image-947f2e-1595316808224)]

  • 引入的问题,将下载的demo放在vendor目录下,vendor('alipay.aop.AopClient');引入

  • php对接app支付宝支付出错Cannot redeclare Decrypt()
    报错原因:alipaySDK中定义的Encrypt()/Decrypt()函数与Laravel中定义的Encrypt()/Decrypt()函数重名了。

    解决办法:修改alipaySDK中定义的函数名称、修改引用的函数名称。

    解决步骤:在官方给的SDK中,一共有需要修改三个文件中的内容:aop/AopEncrypt.phpaop/AopClient.phplotusphp_runtime/Cookie/Cookie.php 在文件中查找encrypt/decrypt替换为alipayEncrypt/alipayDecrypt即可。

7,额外链接

https://segmentfault.com/a/1190000020056817?utm_source=tag-newest

https://my.oschina.net/marhal/blog/1787739?p=1

https://www.cnblogs.com/yangzailu/p/11752381.html

你可能感兴趣的:(支付宝支付(APP支付))