php实现网站支付,PHP实现支付宝支付的方法

支付宝付款,开发上比起微信支付要简单很多,今天就以支付宝手机网站支付为例,简单讲一下实现方法:

1be7d370ac8390c0ffc0fdc0078dfe67.png

前期准备,当然就不多说了,当你想开发使用支付宝支付,必然需要在支付宝开放品台注册认证并且创建好应用并且具备手机网站支付功能!不明白可以查看支付宝官方文档(https://docs.open.alipay.com/203/107084/)

一.开发准备

开发之前,需要准备以下信息

1.支付宝应用appid

2.明确接口加密方式(RSA或者RSA2)

3.支付宝公钥

4.应用私钥

二.支付实现

话不多说,直接上代码/**

* 将要参与签名的参数按要求拼接

* @param $data

* author 江南极客

* @return string

*/

function signQueryString($data){

// 去空

$data = array_filter($data);

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

ksort($data);

$string_a = http_build_query($data);

$string_a = urldecode($string_a);

return $string_a;

}

/**

* 支付宝RSA签名加密

* @param $data 要参与加密的参数

* @param $private_key 应用私钥

* author 江南极客

* @return array|string

*/

function RSASign($data,$private_key){

//要签名的参数字符串

$query_string = signQueryString($data);

//应用私钥

$private_key = chunk_split($private_key, 64, "\n");

$private_key = "-----BEGIN RSA PRIVATE KEY-----\n$private_key-----END RSA PRIVATE KEY-----\n";

$private_key_id = openssl_pkey_get_private($private_key);

if ($private_key_id === false){

return array(-1,'提供的私钥格式不对');

}

$rsa_sign = false;

if($data['sign_type'] == 'RSA'){

$rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA1);

}else if($data['sign_type'] == 'RSA2'){

$rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA256);

}

//释放资源

openssl_free_key($private_key_id);

if ($rsa_sign === false){

return array(-1,'签名失败');

}

$signature = base64_encode($sign);

return $signature;

}

/**

* 支付宝支付

* @param array $params 构造好的支付参数

* author 江南极客

* @return array|string

*/

function aliPay(array $params){

$public = [

'app_id' => $params['app_id'],

'method' => $params['method'],

'sign_type' => $params['sign_type'],

'format' => 'JSON',

'charset' => 'utf-8',

'version' => '1.0',

'timestamp' => date('Y-m-d H:i:s'),

'biz_content' => $params['biz_content'],

];

if(!empty($params['notify_url'])){

$public['notify_url'] = $params['notify_url'];

}

if(!empty($params['return_url'])){

$public['return_url'] = $params['return_url'];

}

$sign = RSASign($public,$params['private_key']);

if(is_array($sign)){

return $sign;

}

$public['sign'] = $sign;

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

return $url;

}

注:这里的支付网关,如果是新接口是(https://openapi.alipay.com/gateway.do)

调用实例:$biz_content = [

'body' => '测试商品x1',

'subject' => '测试商品',

'out_trade_no' => date('YmdHis').rand(1000,9999),

'product_code' => 'QUICK_WAP_WAY',

'total_amount' => 0.01,

];

$notify_url = "https://xxxxxxxx/notify.php";//通知回调地址(必须是可以无障碍访问没有登录验证的地址)

$params = [

'app_id' => '2017xxxxxxxxx6554',//appid

'method' => 'alipay.trade.wap.pay',//接口名称

'sign_type' => 'RSA2',//签名加密方式

'notify_url' => $notify_url,

'biz_content' => json_encode($biz_content),//请求参数

];

$params['private_key'] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//应用私钥

$data = aliPay($params);

print_r($data);

三.回调验签

对于手机网站支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统。支付宝异步回调通知POST过来的数据如下

33bf40dcad21e54359a248daab128c34.png

在拿到这个数据之后,为了安全防止数据被篡改,需要签证签名,方法如下:/**

* 支付宝验证签名

* @param $return_data 支付宝服务器推送给notify_url的数据

* @param $public_key 支付宝公钥

* author 江南极客

* @return bool|int

*/

function RSAVerify($return_data, $public_key){

if(empty($return_data) || !is_array($return_data)){

return false;

}

//支付宝公钥

$public_key = wordwrap($public_key, 64, "\n", true);

$public_key = "-----BEGIN PUBLIC KEY-----\n$public_key\n-----END PUBLIC KEY-----\n";

$public_key_id = openssl_pkey_get_public($public_key);

if($public_key_id === false){

return false;

}

//除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。

$sign = $return_data['sign'];

$sign_type = trim($return_data['sign_type'],'"');

unset($return_data['sign'], $return_data['sign_type']);

$query_string = signQueryString($return_data);

$sign = base64_decode($sign);

$rsa_verify = 0;

if($sign_type == 'RSA'){

$rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA1);

}else if($sign_type == 'RSA2'){

$rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA256);

}

openssl_free_key($public_key_id);

if($rsa_verify == 0 || $rsa_verify == -1){

//Returns 1 if the signature is correct, 0 if it is incorrect, and -1 on error.

return false;

}

return $rsa_verify;

}

其余支付宝其他支付方式(扫码支付,PC支付,APP支付等),实现方式大同小异,修改几个参数就OK了!

更多PHP相关知识,请访问PHP教程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值