支付宝APP支付

程斌 2019-07-15 PM 1379℃ 0条

由于工作需要,需要对接支付宝APP支付。
基于官方PHP SDK封装开发。
也强烈建议使用官方的sdk,尽管代码看上去不优雅,可以自己封装一层,但是不要轻易去改动sdk包里边的代码,不方便维护升级。
下单流程走不通,检查自己的应用私钥、公钥;
回调验签流程走不同,检查自己的支付宝公钥,别和应用公钥搞混了。
确认以上没问题,继续往下看。


文档:https://docs.open.alipay.com/204
服务端 SDK:https://docs.open.alipay.com/54/106370/

大体流程:

购买流程:

客户端提交订单信息 -> 服务端生产订单信息(组成订单字符串) -> 客户端订单字符串提交
[TOC] #### 实例代码

rechage.php
$alipay_config =
        [
            'APP_ID' => 'xxxx',
            'NOTIFY_URL' => API_ROOT_URL . '/callback.php',
            'RSA_PRI_KEY' => "xxxx',
            'APP_PUB_KEY' => 'xxxx'
        ];
}
        $aop = new AliAppPay();
        $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
        $aop->appId = $alipay_config['APP_ID'];
        $aop->rsaPrivateKey = $alipay_config['RSA_PRI_KEY'];
        $aop->format = "json";
        $aop->charset = "UTF-8";
        $aop->signType = "RSA2";
        $aop->alipayrsaPublicKey = $alipay_config['RSA_PUB_KEY'];
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        $request = new \AlipayTradeAppPayRequest();
        $create_time = date('Y-m-d H:i:s');
        $biz_body = sprintf('%s 创建的支付订单,购买套餐:%s,支付金额:%s', $create_time, $set_meal, $total_amount);
        // 创建充值订单号
        $biz_out_trade_no = RRecharge::genRechargeSN();
        $biz_subject = '测试项目名称';
        if (__ENV__ != 'ONLINE') {
            $total_amount = 0.01;
        }
        $biz_content_arr = [
            'body'            => $biz_body,
            'subject'         => $biz_subject,
            'out_trade_no'    => $biz_out_trade_no,
            'timeout_express' => '30m',
            'total_amount'    => $total_amount,
            'product_code'    => 'QUICK_MSECURITY_PAY'
        ];
        $biz_content = json_encode($biz_content_arr, JSON_UNESCAPED_UNICODE);
        $notify_url = $alipay_config['NOTIFY_URL'];
        $request->setNotifyUrl($notify_url);
        $request->setBizContent($biz_content);
        //这里和普通的接口调用不同,使用的是sdkExecute
        $response = $aop->sdkExecute($request);
        // 官方给出使用html方法编码,这里不需要使用,使用之后会跳转不了
        // htmlspecialchars($response);
        return parent::outputResult(['OrderString' => $response]);

回调验证签名:

同步回调:

recharge.php
    // 客户端直接把app支付的结果返回提交
    $alipay_result = trim($_POST['alipay_result']);
        if (empty($alipay_result)) {
            return parent::outputError('参数错误');
        }
        $alipay_result = json_decode($alipay_result, true);
        $alipay_config =
        [
            'APP_ID' => 'xxxx',
            'NOTIFY_URL' => API_ROOT_URL . '/callback.php',
            'RSA_PRI_KEY' => "xxxx',
            'APP_PUB_KEY' => 'xxxx'
        ];
}
        $aop = new AliAppPay();
        $alipay_trade_app_pay_response = $alipay_result['alipay_trade_app_pay_response'];
        $data_str = json_encode($alipay_trade_app_pay_response);
        $sign = $alipay_result['sign'];
        **// 支付宝回调验签采用支付宝公钥,不是我们的应用公钥**
        $aop->alipayrsaPublicKey = $alipay_config['APP_PUB_KEY'];
        $flag = $aop->verify($data_str, $sign, null, "RSA2");
        if (!$flag) {
            return Data::error('同步验签失败');
        }
// 处理具体的业务,记住不要重复处理,验证签名之后,还需要调用一些其他的具体业务验证,如:appid,金额 ... 等等4项
        $rst = RRecharge::clientCallBackHandle($alipay_trade_app_pay_response);
        if (Data::hasError($rst)) {
            return parent::outputError(Data::getMessage($rst));
        }
        return parent::outputMessage('上报成功');

异步回调:

        // AliAppPay 没有做任何的处理,只是拿着它继承了sdk的类
        $aop = new AliAppPay();
        $alipay_config = loadconf('alipay');
        $aop->alipayrsaPublicKey = $alipay_config['APP_PUB_KEY'];
        $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
        // 验签失败
        if (!$flag) {
            runtime_log('notify/callback_error', '回调验签失败 ==> ' . json_encode($_POST));
            exit;
        }
        $rst = RRecharge::notifyCallBackHandle($_POST);
        if (Data::hasError($rst)) {
            runtime_log('notify/callback_error', '回调业务处理失败 ==> ' . Data::getMessage($rst));
            exit;
        }

logo.png

标签: php, 支付宝

非特殊说明,本博所有文章均为博主原创。

评论啦~