视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PHP实现支付宝支付的方法
2020-11-03 18:22:06 责编:小采
文档
 支付宝付款,开发上比起微信支付要简单很多,今天就以支付宝手机网站支付为例,简单讲一下实现方法:

前期准备,当然就不多说了,当你想开发使用支付宝支付,必然需要在支付宝开放品台注册认证并且创建好应用并且具备手机网站支付功能!不明白可以查看支付宝官方文档(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, , "
");
 $private_key = "-----BEGIN RSA PRIVATE KEY-----
$private_key-----END RSA PRIVATE KEY-----
";
 $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 = base_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过来的数据如下

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

/**
 * 支付宝验证签名
 * @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, , "
", true);
 $public_key = "-----BEGIN PUBLIC KEY-----
$public_key
-----END PUBLIC KEY-----
";
 $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 = base_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教程!

下载本文
显示全文
专题