基于 cordova & PHP SDK 的 App 支付宝支付实现

着实被几个钥给恶心到了。


整个过程中,最蛋疼的是,可以支付成功,但是异步回调老是报错,验证不过去,不好意思,花了两天时间...先把这个解决办法说下吧。

function notify() {   
        $aop = new AopClient;
        $aop->alipayrsaPublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA70UfUntg80gXhzKby5opWNhzmIKDRLs78htUGRqtktbR8zGG7eqva0xV2MEtkqgoxuf26zymdK1oNCliX2dO+95r6pLb8zkVOH7eBKSt/TaL+YxVkPOFkuBLFeBI67Qj8eY63E1xdCgwGIEowTydpRhkbTCvCVXjQRlY9TqWOTEtQVScZj3lWgKg61A26608vs/WtsUD5Or/h/n0M7mZzEzNVyCu8xgQDHoW80kY1ovkuEGER0pj3QbGi4ECBmTlwQ/ZX/K9q7cnePB7Y4SJ6rww6TvT9AWdkzLVVd1NO9qhHqMBwtc5nYFW1qEK+ExeEOXnoRTFwtOjDH6JcRlZ4wIDAQAB';
        // 下面这里是我处理后的方法 去掉回调拿到的值 三个反斜杠!!!
        $data = $_POST;
        $data['fund_bill_list'] = str_replace('\\', '', $data['fund_bill_list']);
      
        //此处验签方式必须与下单时的签名方式一致
        $flag = $aop->rsaCheckV1( $data, NULL, "RSA2" );
        if ( $flag ) {
            file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."----111-----".json_encode( $data ).$flag."\n\r",FILE_APPEND);
            file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."----112-----".json_encode( $_POST ).$flag."\n\r",FILE_APPEND);

        }else{
           file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."-----222----".json_encode( $data )."\n\r",FILE_APPEND);
           file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."-----223----".json_encode( $_POST ).$flag."\n\r",FILE_APPEND);

        }
        echo 'success';
        die;
    }
  • 上面是对 $_POST 提了出来额外做了处理。
    处理前
    "fund_bill_list":"[{\\\"amount\":\\\"0.01\\\",\\\"fundChannel\\\":\\\"ALIPAYACCOUNT\\\"}]",
    处理后
    "fund_bill_list":"[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
  • 另外就是仔细比对的自己的私钥和支付宝公钥是否有误差。


开始接入

一 、 了解配置基本信息

  1. 基本操作
  • App 快速接入支付宝
  • 创建 App
  • 生成密钥

  1. 配置支付信息
  • 生成密钥的链接打开后,就是下面的样子。这里以 windows 为例子。下载签名工具,很容易获取到自己的私钥公钥这里注意的是,尽量都用 RSA2 的签名工具,以免后面带来麻烦.
    基于 cordova & PHP SDK 的 App 支付宝支付实现_第1张图片
    生成自己的密钥

基于 cordova & PHP SDK 的 App 支付宝支付实现_第2张图片
上传或者修改自己的密钥

  1. 配置后
    基于 cordova & PHP SDK 的 App 支付宝支付实现_第3张图片
    自己的应用信息

    几个比较重要的,都被我用红圈圈了起来。可以看到截图下面有两个公钥,左边是你刚刚上传给支付宝的,右边是支付宝处理后的,我们所有的 PHP-SDK 代码里使用的公钥用的都是右边的!!!支付宝公钥官方释义

二 、 准备开发

  1. 服务端 & 客户端
  • PHP SDK 下载地址
  • 客户端 Cordova 插件

贴下服务端代码

 $aop = new \AopClient();

     
            $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
            //实际上线app id需真实的 
            $aop->appId = "你的 appid ";

            $aop->rsaPrivateKey = ' 你的私钥 ';

            $aop->format = "json";
            $aop->charset = "UTF-8";
            $aop->signType = "RSA2";
            $aop->alipayrsaPublicKey = ' 支付宝给你的公钥 ';
            $bizcontent = json_encode([
                'body'=>'GOODS',
                'subject'=>'clothes',
                'out_trade_no'=>$ord_num,//此订单号为商户唯一订单号
                'total_amount'=> '0.01',//保留两位小数
                'product_code'=>'QUICK_MSECURITY_PAY'
            ]);
          
            //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
            $request1 = new \AlipayTradeAppPayRequest();
            //支付宝回调
            $request1->setNotifyUrl( "你的回调方法的 url " );
            $request1->setBizContent( $bizcontent );
            //这里和普通的接口调用不同,使用的是sdkExecute
            $response = $aop->sdkExecute( $request1 );
            return $response;
  • 上面的回调地址对应的方法
function notify()
    {
        // require_once('/www/my/app/third_party/alipay/aop/AopClient.php');
        $aop = new AopClient;
        $aop->alipayrsaPublicKey = ' 支付宝给你的公钥 ';
        //此处验签方式必须与下单时的签名方式一致
        $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
        if ( $flag ) {
            // file_put_contents("log.txt", "This is another something.", FILE_APPEND);
            // file_put_contents("log.txt", "This is another something12312313.");
            file_put_contents("/tmp/log.txt",date('Y-m-d H:i:s',time())."---------".json_encode($_POST)."\n\r",FILE_APPEND);
        }else{
           file_put_contents("/tmp/log.txt",date('Y-m-d H:i:s',time())."-----222222----".json_encode($_POST)."\n\r",FILE_APPEND);

        }
        // var_dump( $flag );
        //验签通过后再实现业务逻辑,比如修改订单表中的支付状态。
        /**
        ①验签通过后核实如下参数trade_status、out_trade_no、total_amount、seller_id
        ②修改订单表
        **/
        //打印success,应答支付宝。必须保证本界面无错误。只打印了success,否则支付宝将重复请求回调地址。
        echo 'success';
        die;
    }

总的来说,你手上会有三个钥,你的公钥的任务就是换到支付宝给你的公钥。随后的开发用的都是支付宝的公钥!!!

你可能感兴趣的:(基于 cordova & PHP SDK 的 App 支付宝支付实现)