php网站如何对接支付宝支付

本篇文章讲到的是支付宝即时到账接口,我们要对接支付宝支付,可以先浏览一下官方文档

https://docs.open.alipay.com/62/104743/

即时到账接口对接起来还是比较简单的
首先准备好即时到账接口所需的参数,把它放到一个数组中

$partner = '2088112718209116';//合作者伙伴id(开通支付宝商户后会有一个合作者伙伴id,这里改成自己的合作者伙伴id)
$key = 'jj1j00zwzkjlwnh19bu87tyv9dzjj4n2';//安全校验码KEY(开通支付宝商户后会有一个安全校验码KEY,这里改成自己的安全校验码KEY)
$params = [
            'service' => 'create_direct_pay_by_user',//接口名称
            'partner' => $partner,//合作者伙伴id
            '_input_charset' => 'UTF-8',//字符集
            'sign_type' => 'MD5',//签名方式
            'sign' => '',//签名
            'notify_url' => 'http://www.zhiboblog.com/notify.php',//异步通知地址
            'return_url' => 'http://www.zhiboblog.com/return.php',//同步通知地址
            'out_trade_no' => time().rand(1,9999),//订单号
            'subject' => '测试商品',//商品标题
            'payment_type' => 1,//支付类型 只取值为1(商品购买) 固定值
            'total_fee' => 0.01,//交易金额 单位为元
            'seller_id' => $partner,//卖家支付宝,可以填合作者伙伴id
        ];

然后生成签名,对于新手来说,可能对签名的规则不太理解。
这里我详细讲一下,如何生成签名
1.筛选
剔除sign与sign_type参数

if(isset($params['sign'])){
    unset($params['sign']);
}
if(isset($params['sign_type'])){
    unset($params['sign_type']);
}

2.排序
按照键名字母升序排序

ksort($params);

3.拼接
将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。MD5签名的商户需要将key的值拼接在字符串后面,调用MD5算法生成sign

$str = urldecode(http_build_query($params));//生成待签名字符串
$sign = md5($str.$key);//将key值拼接在待签名字符串后面,然后md5加密,就得到了签名

4.将生成的签名,赋给数组

$params['sign'] = $sign;

5.生成支付页面链接

$url = 'https://mapi.alipay.com/gateway.do' .'?'. http_build_query($params);

6.跳转到支付页面支付

header('Location:'.$url);

下面我封装了一个支付宝即时到账接口类,网站对接支付宝支付的时候可直接调用。

<?php

class Alipay
{
    const PID = '2088112718209116';//合作者身份pid(这里改成自己的)
    const KEY = 'jj1j00zwzkjlwnh19bu87tyv9dzjj4n2';//安全校验码key(这里改成自己的)
    const PAYGATEWAY = 'https://mapi.alipay.com/gateway.do';//支付宝网关地址
    const REURL = 'http://www.zhiboblog.com/return.php';//同步通知地址(这里改成自己的)
    const NOURL = 'http://www.zhiboblog.com/notify.php';//异步通知地址(这里改成自己的)
    public function __construct()
    {
        $params = [
            'service' => 'create_direct_pay_by_user',//接口名称
            'partner' => self::PID,//合作者伙伴id
            '_input_charset' => 'UTF-8',//字符集
            'sign_type' => 'MD5',//签名方式
            'sign' => '',//签名
            'notify_url' => self::NOURL,
            'return_url' => self::REURL,
            'out_trade_no' => time().rand(1,9999),
            'subject' => '测试商品',//商品标题
            'payment_type' => 1,//支付类型 只取值为1(商品购买) 固定值
            'total_fee' => 0.01,//交易金额 单位为元
            'seller_id' => self::PID,//卖家支付宝,可以填合作者伙伴id
        ];

        $params = $this->setSign($params);//获取带签名的数组
        $url = self::PAYGATEWAY .'?'. $this->getUrl($params);
        header('Location:'.$url);
    }

    public function getStr($arr)
    {
        //筛选
        if(isset($arr['sign'])){
            unset($arr['sign']);
        }
        if(isset($arr['sign_type'])){
            unset($arr['sign_type']);
        }
        //排序
        ksort($arr);
        //拼接
        return $this->getUrl($arr,false);
    }

    //将数组转换为url格式的字符串
    public function getUrl($arr,$encode=true)
    {
        if($encode){
            return http_build_query($arr);
        }else{
            return urldecode(http_build_query($arr));
        }
       
    }

    //获取签名
    public function getSign($arr)
    {
        return md5($this->getStr($arr) . self::KEY);
    }

    //获取含有签名的数组
    public function setSign($arr)
    {
        $arr['sign'] = $this->getSign($arr);
        return $arr;
    }
}

$obj = new Alipay();

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: