线上支付支付宝个人支付接入流程详解

一直以为想做线上支付必须要有营业执照,害得我和很多个人开发者一样,绕了很多圈子。尝试过一些第三方的接入(不稳定,担心跑路)。
原来支付宝是有个人支付接口的,利用支付宝的“当面付”接口就可实现个人版的线上支付,实时直接进入个人账户。

我需要在网站上实现一个打赏功能,首先需要在 支付宝开发者中心 申请一个网页&移动应用,如图
线上支付支付宝个人支付接入流程详解_第1张图片
然后需要在能力列表添加“当面付”功能,签约的时候营业执照没有红色*,说明不是必填项,其他的功能签约时营业执照都是必填项。
线上支付支付宝个人支付接入流程详解_第2张图片

签约成功后,下载SDK填写相应的配置进行调试
http://aopsdkdownload.cn-hangzhou.alipay-pub.aliyun-inc.com/demo/F2FPay_Demo_php.zip

配置文件是 f2fpay/config/config.php
线上支付支付宝个人支付接入流程详解_第3张图片
支付宝公钥和商户私钥是通过支付宝开放平台开发助手生成的,可以在下图的选项里进行设置和查看线上支付支付宝个人支付接入流程详解_第4张图片
然后回调地址必须是一个线上能够访问到的地址。
配置完成后就可以在本地进行调试
线上支付支付宝个人支付接入流程详解_第5张图片
支付宝返回的是一个二维码串,需要用专门的转换api进行转成成功二维码图片,支付宝官方用的二维码串转换工具是google的api,在我机器上图片是显示不出来的,应该是需要VPN才能使用,所有我从网上又找了一个api。
线上支付支付宝个人支付接入流程详解_第6张图片
支付二维码能够正常显示后说明调试通了,就可以部署到项目中进行应用了,我的项目后端是PHP的框架TP5写的,以下介绍在框架中的具体应用。

支付流程:

1 : 页面点击成为好货推荐,调用订单生成接口,传商品id和登录用户id
2 : 订单接口生成订单数据,未支付状态,并将生成的 订单号、订单名称、订单金额 处理后通过curl访问调用二维码的文件并返回前端二维码图片src路径和订单id
3 : 用户支付成功后在回调方法里将回调数据写入日志文件,如果支付成功,根据回调数据里的订单号更新此订单的支付状态,以及其他的支付信息;
4 : 前端拿到二维码的src路径和订单id后,将二维码展示给用户,并利用ajax携带订单id参数每隔1秒请求订单状态接口,如果订单状态为已支付,提示“支付成功”

ThinkPHP5接入支付宝“当面付”流程

1.根据官方SDK里的 qrpay_test.php 文件的写法,把html部分删掉,不必要的请求参数删掉,返回格式json处理一下
线上支付支付宝个人支付接入流程详解_第7张图片
2. 生成订单并返回二维码的路径及订单id
线上支付支付宝个人支付接入流程详解_第8张图片
3. 回调处理
线上支付支付宝个人支付接入流程详解_第9张图片
最后奉上订单方法里用到的生成待请求字符串的方法和cURL的方法,这些方法放到了公共文件common.php中

/**
 * 生成待请求字符串
 * @param $paramArr
 * @param bool|true     $sort       是否排序           默认排序
 * @param bool|false    $encode     是否urlencode处理  默认不处理
 * @param bool|false    $isnull     是否过滤空值字段   默认不过滤
 * @param string|&      $str        链接字符           默认&
 * @return string 返回待签字符串
 */
function createSignStr ($paramArr, $sort = true, $encode = false, $isnull = false, $str = '&') {
     
    $param_array   = array();
    if($sort){
     
        ksort ( $paramArr );
        reset ( $paramArr );
    }
    foreach ($paramArr as $key => $val) {
     
        //$val = mb_convert_encoding($val,"GBK", "UTF-8");
        if($isnull){
     
            if($val === ''){
     
                unset($paramArr[$key]);
            }else{
     
                if($encode){
     
                    $param_array[] = $key.'='.urlencode($val);
                }else{
     
                    $param_array[] = $key.'='.$val;
                }
            }
        }else{
     
            if($encode){
     
                $param_array[] = $key.'='.urlencode($val);
            }else{
     
                $param_array[] = $key.'='.$val;
            }
        }
    }
    $param_str  = implode($str,$param_array);
    return $param_str;
}

/**
 * 发送请求
 * @param $opts     //已加密字符串
 * @param $url      //发送地址
 * @return mixed    //返回支付返回信息
 */
function sendHttpRequest($opts, $url) {
     
    $ch     = curl_init ();
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_setopt ( $ch, CURLOPT_POST, 1 );
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false);//不验证证书
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, false);//不验证HOST
    curl_setopt ( $ch, CURLOPT_SSLVERSION, 1);
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $opts );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    // 运行cURL,请求网页
    $html = curl_exec ( $ch );
    curl_close ( $ch );
    return $html;
}

到此整个流程就结束了,希望对你有所帮助,如有疑惑需要帮忙可以在下方留言或加我qq:1298025852

你可能感兴趣的:(php,demo,支付,php)