php调用支付宝即时到账

支付宝即时到账,PHP支付宝

由于之前是供应商开发的系统(asp.net),当初用的是老版本的支付宝,所以,合作商没有给到支付宝公钥和私钥,所以目前想转成PHP的,只能根据以前的配置来开发新的支付。

先去找了一下以前的文档https://docs.open.alipay.com/62/104743/,根据文档把各个参数都确认好之后开始整理代码:

配置(app.php里):

//支付宝即时到账配置

    'zfb'                => [

        //合作伙伴身份

        'partner'           => "",

        //收款支付宝账号

        'seller_email'      => "",

        //交易安全检验码,由数字和字母组成的32位字符串

        'key'               => "",

        //字符编码格式 目前支持 gbk 或 utf-8

        'input_charset'     => "utf-8",

        //签名方式,选择项:RSA、DSA、MD5

        'sign_type'         => "MD5",

        //异步通知地址

        'notify_url'        => url('/index/payments/alipayCallback'),

       //同步回调地址

        'return_url'        => url('/index/payments/alipayCheck'),

    ],


控制器代码:

我没有用form跳转,而是用的tp在程序里跳转

public function getAlipayUrl(){

                $url                                                   = 'https://mapi.alipay.com/gateway.do?';

                $param                                             = [];

                $param['_input_charset']                        = config('app.zfb.input_charset');

                $param['body']                                     = "简介";

                $param['notify_url']                            = getHostDomain().config('app.zfb.notify_url');

                $param['out_trade_no']                          = "唯一订单号";

                $param['partner']                               = config('app.zfb.partner');

                $param['payment_type']                          = '1';

                $param['return_url']                            = getHostDomain().config('app.zfb.return_url');

                $param['seller_email']                          = config('app.zfb.seller_email');

                $param['service']                               = 'create_direct_pay_by_user';

                $param['subject']                               = "商品名称";

                $param['total_fee']                             = "费用";

                $param['price']                                 = "单价";

                $param['quantity']                              = "数量";

                $param['show_url']                              = getHostDomain().url('/index');

                $param['anti_phishing_key']                     = "";

                $param['exter_invoke_ip']                       = "";

                $param['sign']                                  = $this->MakeSign($param);

                $param['sign_type']                             = config('app.zfb.sign_type');

                $this->redirect($url.$this->ToUrlParamsOnly($param));

}

/**

  * 格式化参数格式化成url参数

*/

public function ToUrlParams($param)

{

        ksort($param);

        $buff = "";

        $tempArr = [];

        foreach ($param as $k => $v)

        {

            if($k != "sign" && $k != 'sign_type' && $v != "" && !is_array($v)){

                $tempArr[] = $k . "=" . $v ;

            }

        }

        $buff = implode('&', $tempArr);

        $buff = trim($buff, "&");

        return $buff;

}

 /**

  * 生成签名

  * @param 参数

  * @return 签名

 */

    public function MakeSign($param)

    {

        //签名步骤一:按字典序排序参数

        ksort($param);

        $string = $this->ToUrlParams($param);

        //签名步骤二:在string后加入KEY

        $string = $string . config('app.zfb.key');//这个地方尤其要注意,是生成的字符串直接连接key,不需要&连接

        //签名步骤三:MD5加密或者HMAC-SHA256

        $string = md5($string);

        return $string;

    }

/**

  * 格式化参数格式化成url参数

 */

    public function ToUrlParamsOnly($param)

    {

        $buff = "";

        foreach ($param as $k => $v)

        {

            if($v != "" && !is_array($v)){

                $buff .= $k . "=" . $v . "&";

            }

        }

        $buff = trim($buff, "&");

        return $buff;

    }

然后就可以正常调用了,调用成功的话会显示二维码的支付页面:

c2/519378855c7687bc76291ad97a0c34.png


如果支付页面提示:

ILLEGAL_SIGN

那肯定是签名错误,检查签名的字段和最后的key,这里我被坑了半天。。。[汗][汗][汗][汗]