欢迎您, 来到 宁时修博客.^_^

php之支付宝App支付

2018/12/12 宁时修 php,thinkPHP 5.0,支付 796
支付宝app支付,可以嵌套到任何框架中,本篇以tp5为例

记录一下最近接入支付的整个流程,顺便做个笔记。

整个支付宝支付流程图

01.png

1.申请APP支付

这一步就不做具体介绍了,附带一个教程地址

https://jingyan.baidu.com/article/ff411625d3d12412e48237e4.html

2.获取app_id 以及设置RSA密钥

第一步:登陆支付宝商户平台

https://mrchportalweb.alipay.com/user/ihome.htm

第二步:查看产品是否生效

002.png

第三步:如果产品是可用的,查看app_id以及设置RSA密钥

图一:点击我的商家服务

001.png

图二:查看APP支付的app_id以及设置密钥

新版支付选择开放平台密钥

003.png

如何生成RSA密钥,方式有2种

方式一:利用第三方网站生成(推荐)

http://web.chacuo.net/netrsakeypair

点击上面URL 进入 选择如图

005.png

去掉生成RSA密钥的开头和结尾。复制图片中红线区域的密钥值。

将公钥,私钥分别保存起来。私钥后续发给支付宝参与验签使用,公钥上传到支付宝商户平台。

上传路径 商户平台中心=》点击查看PID|KEY=》选择开放平台密钥=》设置(修改)RSA密钥


方式二:生成RSA密钥  可以通过支付宝官方提供的工具生成

https://docs.open.alipay.com/291/105971

点击上面URL进入,选择工具下载 步骤跟上面介绍的一致 只是这里使用的是工具来生成密钥。

注意:不需要在支付宝商户平台设置支付回调,支付回调在程序里设置就行


4.下载官方phpSDK文件,去除没有必要的文件

https://docs.open.alipay.com/54/106370/

点击URL获取SDK文件

下载后文件目录如图

006.png

我在项目中已经使用tp5,所以不需要在引入多余的第三方框架,(lotusphp_runtime是个第三方php框架)只保留项目核心处理文件就行。这里我们只需要aop目录下面文件就行如图

007.png

将aop目录下的所有文件复制,或者将aop剪切到我们自己框架中,以tp5为例。将项目更名为alipaysdk 复制到./extend 目录

008.png


5.配置支付参数,返回给app能唤起支付的orderString

新建一个php处理类,名字我这边就定义为pay了 至于放什么位置,看你摆放了,这些都不重要。我暂且放在index模块下

<?php
namespace app\index\controller;
use think\Log;
class Pay
{
    protected $config;
    
    /**
     * 初始化应用参数
     * Pay constructor.
     */
    public function __construct()
    {
        // 支付宝配置
        $this->config = [
            // 应用id
            'app_id' => 'xxxxxx',
            // 私钥
            'rsaPrivateKey' => '',
            // 支付宝公钥 你上传的公钥
            'alipayrsaPublicKey' => '',
            // 异步回调通知地址 很重要
            'notify_url' => ''
        ];
    }
    /**
     * 支付宝创建app可以跳转的url
     * 返回给app能唤起支付的open String
     * @param string $subject  商品标题
     * @param string $order_sn 订单号
     * @param float $total_amount 充值金额
     * @return string
     */
    public function create($subject, $order_sn, $total_amount)
    {
        //支付宝
        include_once ROOT_PATH . '/extend/alipaysdk/AopClient.php';
        include_once ROOT_PATH . '/extend/alipaysdk/request/AlipayTradeAppPayRequest.php';
        $config = [
            'appid' => $this->config['app_id'],
            'rsaPrivateKey' => $this->config['rsaPrivateKey'],//开发者私钥私钥
            'alipayrsaPublicKey' => $this->config['alipayrsaPublicKey'],//支付宝公钥
            'charset' => strtolower('utf-8'),//编码
            'notify_url' => $this->config['notify_url'],//回调地址(支付宝支付成功后回调修改订单状态的地址)
            'payment_type' => 1,//(固定值)
            'seller_id' =>'',//收款商家账号
            'charset' => 'utf-8',//编码
            'sign_type' => 'RSA2',//签名方式
            'timestamp' => date("Y-m-d H:i:s"),
            'version'   =>"1.0",//固定值
            'url'       => 'https://openapi.alipay.com/gateway.do',//固定值
            'method'    => 'alipay.trade.app.pay',//固定值
        ];
        $aop = new \AopClient();
        $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
        $aop->appId = $config['appid'];
        $aop->rsaPrivateKey = $config['rsaPrivateKey'];
        $aop->format = "json";
        $aop->charset = "UTF-8";
        $aop->signType = "RSA2";
        $aop->alipayrsaPublicKey = $config['alipayrsaPublicKey'];
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        $request = new \AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数
        $bizcontent = json_encode([
            'body'=>'**',
            'subject' => $subject,
            'out_trade_no' => $order_sn,//此订单号为商户唯一订单号
            'total_amount' => $total_amount,//保留两位小数
            'product_code' => 'QUICK_MSECURITY_PAY'
        ]);
        $request->setNotifyUrl($config['notify_url']);
        $request->setBizContent($bizcontent);
        //这里和普通的接口调用不同,使用的是sdkExecute
        $response = $aop->sdkExecute($request);
        //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
        return $response;//就是orderString 可以直接给客户端请求,无需再做处理。
    }
    /**
     * 支付宝支付 回调地址
     */
    public function callback()
    {
        include_once ROOT_PATH . '/extend/alipaysdk/AopClient.php';
        $aop = new \AopClient();
        $aop->alipayrsaPublicKey = $this->config['alipayrsaPublicKey'];
        //此处验签方式必须与下单时的签名方式一致
        $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
        if ($flag) {
            // 验证成功
            // TODO 验签通过 这个时候就可以做一些业务处理了 比如订单状态的修改 佣金的计算 等等..
            Log::write('支付成功,时间:' . date('Y-m-d H:i:s'));
            return 'success';
        } else {
            Log::write('支付失败,时间:' . date('Y-m-d H:i:s') . '信息:签名验证失败');
            return 'error';
        }
    }
}

直接复制上述内容直接粘贴到指定文件,配置好正确的参数就可以用了。如果不能用注意你的处理类引入的位置的。我是放在./extend目录下的。

注意:在复制秘钥填写时,记得要一行填写不要隔行,否则会发生未知的错误。一行,一行,一行重要的事情说三遍!


6.支付后续流程

服务器返回给APP端orderString后,服务端这边的话,只需要等待前端支付请求完成后,支付宝那边会验签,验证如果真的是商户这边发起的,验签通过后支付宝平台会处理商户这边发给支付宝的平台的同步回调和异步回调。同步回调一般不需要服务端这边处理,服务端只需要等待支付宝发送异步回调通知,接受到通知后,商户平台也同样需要验证签名,通过后处理相应的业务处理即可。

支付宝app支付官方文档:https://docs.open.alipay.com/204/105051/

好了整套支付宝app支付,完结!

点赞
说说你的看法

所有评论: (2)